没有合适的资源?快使用搜索试试~ 我知道了~
深入探索Android卡顿优化(下)1
需积分: 0 1 下载量 135 浏览量
2022-08-03
14:06:19
上传
评论
收藏 1.15MB PDF 举报
温馨提示
试读
27页
关于根据ANR log进ANR问题的排查与解决的式笔者已经在深探索Android稳定性优化的第三节ANR优化中讲解过了,这就不多赘述了。在 深 探 索 Andr
资源详情
资源评论
资源推荐
1
深
⼊
探
索
A
nd
ro
id
卡
顿
优
化
(下)
前
⾔
成
为
⼀
名
优
秀
的
A
nd
ro
id
开
发
,
需
要
⼀
份
完
备
的知
识
体
系
,
在
这
⾥
,
让
我
们
⼀
起
成
⻓
为
⾃
⼰
所想
的
那
样
~
。
⼀
、
AN
R
分
析
与
实
战
、
AN
R
介
绍
与
实
战
AN
R
执
⾏
流
程
线
上
AN
R
监
控⽅
式
、
AN
R
-
W
a
t
ch
D
o
g
原
理
、
⼩
结
⼆
、
卡
顿
单
点
问题
检
测
⽅
案
、
IPC
单
点
问题
检
测
⽅
案
常
规
⽅
案
IPC
问题
监
测
技
巧
、
卡
顿问题
检
测
⽅
案
三
、
如
何
实
现界
⾯
秒
开
?
、
界
⾯
秒
开
实
现
那
么
我
们
如
何
去
衡
量
界
⾯
的
打
开
速
度
呢
?
、
L
ance
t
、
界
⾯
秒
开
监
控
纬
度
四
、
优
雅
监
控
耗
时
盲
区
、
耗
时
盲
区
监
控
难
点
、
耗
时
盲
区
监
控
线
下
⽅
案
、
耗
时
盲
区
监
控
线
上
⽅
案
、
耗
时
盲
区
监
控⽅
案
总
结
五
、
卡
顿
优
化
技
巧
总
结
、
卡
顿
优
化
实
践
经
验
、
卡
顿
优
化
⼯
具
建
设
六
、
常
⻅
卡
顿问题
解
决
⽅
案
总
结
、
CP
U
资
源
争
抢
引
发
的
卡
顿问题
如
何
解
决
?
2
、
要
注
意
A
nd
ro
id
J
a
v
a
中
提
供
的
哪
些低
效
的
API
?
、
如
何
减
少
图
形
处
理
的
CP
U
消
耗
?
、
硬
件
加
速
⻓
中
⽂
字
体
渲
染时
造
成
的
卡
顿
如
何
解
决
?
七
、
卡
顿
优
化
的
常
⻅
问题
、
你
是
怎
么
做
卡
顿
优
化
的
?
、
你
是
怎
么
样
⾃
动化
的
获
取卡
顿
信
息
?
、
卡
顿
的
⼀
整
套
解
决
⽅
案是
怎
么
做
的
?
⼋
、
总
结
转载
⾃
:
深
⼊
探
索
Android
卡
顿
优
化
(下)
在
上
篇
⽂
章
中
,
笔
者
带
领
⼤
家学
习了
卡
顿
优
化分
析
⽅
法
与
⼯
具
、
⾃
动化
卡
顿
检
测
⽅
案
及
优
化
这
两
块
内
容
。
如
果
对
这
块
内
容
还
不
了
解
的
同
学
建
议
先
看看
《
深
⼊
探
索
Android
卡
顿
优
化
(上)
》。
本
篇
,
为
深
⼊
探
索
Android
卡
顿
优
化
的
下
篇
。
这
篇
⽂
章
包
含
的
主
要
内
容
如
下
所
示
:
1
、
ANR
分
析
与
实
战
2
、
卡
顿
单
点
问题
检
测
⽅
案
3
、
⾼
效
实
现界
⾯
秒
开
4
、
优
雅
监
控
耗
时
盲
区
5
、
卡
顿
优
化
技
巧
总
结
6
、
常
⻅
卡
顿问题
解
决
⽅
案
总
结
7
、
卡
顿
优
化
的
常
⻅
问题
卡
顿
时
间
过
⻓
,⼀
定
会
造
成
应
⽤
发
⽣
ANR
。
下
⾯
,
我
们
就
来
从
应
⽤
的
ANR
分
析
与
实
战
来
开
始
今
天
的
探
索
之
旅
。
⾸
先
,
我
们
再
来
回
顾
⼀下
ANR
的
⼏
种
常
⻅
的
类
型
,
如
下
所
示
:
1
、
KeyDispatchTimeout
:
按
键
事件
在
5s
的
时
间
内
没
有
处
理
完
成
。
2
、
BroadcastTimeout
:
⼴
播接收
器在
前
台
10s
,
后台
60s
的
时
间
内
没
有
响
应
完
成
。
3
、
ServiceTimeout
:
服
务
在
前
台
20s
,
后台
200s
的
时
间
内
没
有
处
理
完
成
。
具
体
的
时
间
定
义
我
们
可
以
在
AMS
(
ActivityManagerService
)
中
找
到
:
1 // How long we allow a receiver to run before giving up on it.
前
⾔
成
为
⼀
名
优
秀
的
Android
开
发
,
需
要
⼀
份
完
备
的知
识
体
系
,
在
这
⾥
,
让
我
们
⼀
起
成
⻓
为
⾃
⼰
所
想
的
那
样
~
。
⼀
、
ANR
分
析
与
实
战
1
、
ANR
介
绍
与
实
战
3
2 static final int BROADCAST_FG_TIMEOUT = 10*1000;
3 static final int BROADCAST_BG_TIMEOUT = 60*1000;
4 // How long we wait until we timeout on key dispatching.
5 static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
接
下
来
,
我
们
来
看
⼀下
ANR
的
执
⾏
流
程
。
1
、
⾸
先
,
我
们
的
应
⽤
发
⽣
了
ANR
。
2
、
然
后
,
我
们
的
进
程
就
会
接
受
到
异常
终
⽌
信
息
,
并开
始
写⼊
进
程
ANR
信
息
,
也
就
是
当
时
应
⽤
的
场
景
信
息
,
它
包
含
了
应
⽤
所
有
的
堆
栈
信
息
、
CPU
、
IO
等
使
⽤
的
情
况
等
待
。
3
、
最
后
,
会
弹
出
⼀个
ANR
提
示
框
,
看
你
是
要
选
择
继续
等
待
还
是
退
出
应
⽤
,
需
要
注
意
这
个
ANR
提
示
框
不
⼀
定
会
弹
出
,
根
据
不
同
ROM
,
它
的
表
现
情
况
也
不
同
。
因
为
有
些
⼿
机
⼚
商
它
会
默
认
去
掉
这
个
提
示
框
,
以
避
免
带
来
不
好
的
⽤
户
体
验
。
分
析
完
ANR
的
执
⾏
流
程
之
后
,
我
们
来
分
析
下
怎
样
去
解
决
ANR
,
究竟
哪
⾥
可
以作为
我
们
的
⼀个
突
破
点
。
在
上
⾯
我
们
说
过
,
当应
⽤
发
⽣
ANR
时
,
会
写⼊
当
时
发
⽣
ANR
的
场
景
信
息
到
⽂
件中
,
那
么
,
我
们
可
不
可
以
通
过这
个
⽂
件
来
判
断
是
否发
⽣
了
ANR
呢
?
关
于
根
据
ANR log
进
⾏
ANR
问题
的
排
查
与
解
决
的
⽅
式
笔
者
已
经
在
深
⼊
探
索
Android
稳
定
性
优
化
的
第
三
节
ANR
优
化
中
讲解
过
了
,
这
⾥
就
不
多
赘
述
了
。
在
深
⼊
探
索
Android
稳
定
性
优
化
的
第
三
节
ANR
优
化
中
我
说
到
了 使
⽤
FileObserver
可
以
监
听
/data/anr/traces.txt
的
变
化
,
利
⽤
它
可
以
实
现
线
上
ANR
的监
控
,
但
是
它
有
⼀个
致
命
的
缺
点
,
就
是
⾼
版
本
ROM
需
要
root
权
限
,
解
决
⽅
案是
只
能
通过
海
外
Google Play
服
务
、
国
内
Hardcoder
的
⽅
式
去
规
避
。
但
是
,
这
在国
内
显
然
是
不
现
实
的
,
那
么
,
有
没
有更
好
的
实
现
⽅
式
呢
?
那
就
是
ANR-WatchDog
,下
⾯
我
就
来
详
细
地
介
绍
⼀下
它
。
ANR-WatchDog
项
⽬
地址
ANR-WatchDog
是
⼀
种
⾮
侵
⼊
式
的
ANR
监
控
组
件
,
可
以
⽤
于
线
上
ANR
的监
控
,
接
下
来
,
我
们
就
使
⽤
ANR-
WatchDog
来
监
控
ANR
。
⾸
先
,
在
我
们
项
⽬的
app/build.gradle
中
添
加
如
下
依
赖
:
1 implementation 'com.github.anrwatchdog:anrwatchdog:1.4.0'
然
后
,
在
应
⽤
的
Application
的
onCreate
⽅
法
中
添
加
如
下
代
码
启
动
ANR-WatchDog
:
1 new ANRWatchDog().start();
可
以
看
到
,
它
的
初
始
化
⽅
式
⾮
常
地
简
单
,
同
时
,
它
内
部
的
实
现
也
⾮
常
简
单
,
整
个
库
只
有
两个
类
,⼀个
是
ANRWatchDog
,
另
⼀个
是
ANRError
。
接
下
来
我
们
来
看
⼀下
ANRWatchDog
的
实
现
⽅
式
。
1 /**
ANR
执
⾏
流
程
线
上
ANR
监
控⽅
式
4
2 * A watchdog timer thread that detects when the UI thread has frozen.
3 */
4 public class ANRWatchDog extends Thread {
可
以
看
到
,
ANRWatchDog
实
际
上
是
继
承
了
Thread
类
,
也
就
是
它
是
⼀个
线
程
,
对
于
线
程
来
说
,
最
重
要
的
就
是
其
run
⽅
法
,
如
下
所
示
:
1 private static final int DEFAULT_ANR_TIMEOUT = 5000;
2 private volatile long _tick = 0;
3 private volatile boolean _reported = false;
4 private final Runnable _ticker = new Runnable() {
5 @Override public void run() {
6 _tick = 0;
7 _reported = false;
8 }
9 };
10 @Override
11 public void run() {
12 // 1
、
⾸
先
,
将
线
程
命名
为
|ANR-WatchDog|
。
13 setName("|ANR-WatchDog|");
14 // 2
、
接
着
,
声
明
了
⼀个
默
认
的
超
时
间隔
时
间
,
默
认
的
值
为
5000ms
。
15 long interval = _timeoutInterval;
16 // 3
、
然
后
,
在
while
循
环
中
通过
_uiHandler
去
post
⼀个
_ticker Runnable
。
17 while (!isInterrupted()) {
18 // 3.1
这
⾥
的
_tick
默
认
是
0
,
所
以
needPost
即
为
true
。
19 boolean needPost = _tick == 0;
20 //
这
⾥
的
_tick
加
上
了
默
认
的
5000ms
21 _tick += interval;
22 if (needPost) {
23 _uiHandler.post(_ticker);
24 }
25 //
接
下
来
,
线
程
会
sleep
⼀
段
时
间
,
默
认
值
为
5000ms
。
26 try {
27 Thread.sleep(interval);
28 } catch (InterruptedException e) {
29 _interruptionListener.onInterrupted(e);
30 return ;
31 }
32 // 4
、
如
果
主
线
程
没
有
处
理
Runnable
,
即
_tick
的
值
没
有
被
赋
值
为
0
,
则
说
明
发
⽣
了
ANR
,
第
⼆
个
_reported
标
志
位
是
为了
避
免
重
复
报
道
已
经
处
理
过
的
ANR
。
5
33 if (_tick != 0 && !_reported) {
34 //noinspection ConstantConditions
35 if (!_ignoreDebugger && (Debug.isDebuggerConnected() ||
Debug.waitingForDebugger())) {
36 Log.w("ANRWatchdog", "An ANR was detected but ignore
d because the debugger is connected (you can prevent this with setIg
noreDebugger(true))");
37 _reported = true;
38 continue ;
39 }
40 interval = _anrInterceptor.intercept(_tick);
41 if (interval > 0) {
42 continue;
43 }
44 final ANRError error;
45 if (_namePrefix != null) {
46 error = ANRError.New(_tick, _namePrefix, _logThreads
WithoutStackTrace);
47 } else {
48 // 5
、
如
果
没
有
主
动
给
ANR_Watchdog
设
置线
程
名
,
则
会
默
认
会使
⽤
AN
RError
的
NewMainOnly
⽅
法
去
处
理
ANR
。
49 error = ANRError.NewMainOnly(_tick);
50 }
51 // 6
、
最
后
会
通过
ANRListener
调
⽤
它
的
onAppNotResponding
⽅
法
,
其
默
认
的
处
理
会
直
接
抛
出
当
前
的
ANRError
,
导
致
程
序
崩
溃
。
_anrListener.onAppNotRespon
ding(error);
52 interval = _timeoutInterval;
53 _reported = true;
54 }
55 }
56 }
⾸
先
,
在
注
释
1
处
,
我
们
将
线
程
命名
为了
|ANR-WatchDog|
。
接
着
,
在
注
释
2
处
,
声
明
了
⼀个
默
认
的
超
时
间
隔
时
间
,
默
认
的
值
为
5000ms
。
然
后
,
注
释
3
处
,
在
while
循
环
中
通过
_uiHandler
去
post
⼀个
_ticker
Runnable
。
注
意
这
⾥
的
_tick
默
认
是
0
,
所
以
needPost
即
为
true
。
接
下
来
,
线
程
会
sleep
⼀
段
时
间
,
默
认
值
为
5000ms
。
在
注
释
4
处
,
如
果
主
线
程
没
有
处
理
Runnable
,
即
_tick
的
值
没
有
被
赋
值
为
0
,
则
说
明
发
⽣
了
ANR
,
第
⼆
个
_reported
标
志
位
是
为了
避
免
重
复
报
道
已
经
处
理
过
的
ANR
。
如
果
发
⽣
了
ANR
,
就
会
调
⽤
接
下
来
的
代
码
,
开
始
会
处
理
debug
的
情
况
,
然
后
,
我
们
看
到
注
释
5
处
,
如
果
没
有
主
动
给
ANR_Watchdog
设
置线
程
名
,
则
会
默
认
会使
⽤
ANRError
的
NewMainOnly
⽅
法
去
处
理
ANR
。
ANRError
的
NewMainOnly
⽅
法
如
下
所
示
:
剩余26页未读,继续阅读
王元祺
- 粉丝: 64
- 资源: 303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0