https://blog.csdn.net/zhangbijun1230/article/details/79449725
https://www.likecs.com/show-204965542.html
https://www.jianshu.com/p/aefe10850aeb (内存优化)
目录
第一篇:Android官方性能分析工具
1.StrictMode (线程优化分析)
https://www.cnblogs.com/yaowen/p/6024690.html (十分详细)
https://my.oschina.net/u/1175007/blog/486666
各个方法说明:https://blog.csdn.net/mynameishuangshuai/article/details/51742375
-
StrictMode.java方法总结:
detectXXX:表示要检测XXX项
permitXXX:表示不检测XXX项
penaltyXXX:表示检测到不合格的代码,以什么样的形式提示开发者。public class MyApplication extends Application { private static MyApplication instance; public static MyApplication getInstance(){ return instance; } @Override public void onCreate() { instance = this; StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.getThreadPolicy(); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(oldThreadPolicy) .detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode .detectDiskWrites() // .penaltyDialog() //弹出违规提示对话框 .penaltyDeath() //弹出违规提示对话框 .build()); StrictMode.VmPolicy vmPolicy = StrictMode.getVmPolicy(); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder(vmPolicy) .detectActivityLeaks() .penaltyDeath() .build()); super.onCreate(); } }
注意:
- 1.permitDiskReads必须要开启
因为很多系统的UI操作的API时也会在主线程里read_disk。
ThreadPolicy 详解 (线程策略)
-
主线程发起网络请求
关于StrictMode,即使不手动集成这个类,network on UI也会自动报错。
https://blog.csdn.net/gengkui9897/article/details/82863966
D/NetworkSecurityConfig: No Network Security Config specified, using platform default
W/System.err: android.os.NetworkOnMainThreadException
W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
at java.net.InetAddress.getAllByName(InetAddress.java:1154)
at com.android.okhttp.Dns$1.lookup(Dns.java:39)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)
https://blog.csdn.net/shuaizhigen/article/details/82223945
其实,在android3.0之后,主线程增加了StrictMode检查网络请求出现在主线程抛出异常的源码:
以API29为例:
ActivityThread.java
StrictMode.initThreadDefaults(data.appInfo);
StrictMode.initVmDefaults(data.appInfo);
StrictMode.java
public static void initThreadDefaults(ApplicationInfo ai) {
final ThreadPolicy.Builder builder = new ThreadPolicy.Builder();
final int targetSdkVersion =
(ai != null) ? ai.targetSdkVersion : Build.VERSION_CODES.CUR_DEVELOPMENT;
// Starting in HC, we don't allow network usage on the main thread
if (targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB) {
builder.detectNetwork();
builder.penaltyDeathOnNetwork();
}
...
}
检测网络在主线程的代码
builder.detectNetwork();
所以,ActivityThread本来就默认集成了StrictMode,我们只是个性化自己的策略而已。
-
主线程文件读写
在主线程做文件读写,android默认并不会抛出异常。通过上面分析StrictMode.java的initThreadDefaults方法可以知道,StrictMode默认不会在主线程里检测读写异常。
自己怎么检测主线程里有读写文件操作:先获取旧的线程策略,然后传入builder。这样既可以保留系统原来的参数设置,又能自己个性化设置。
public class MyApplication extends Application {
@Override
public void onCreate() {
StrictMode.ThreadPolicy oldThreadPolicy = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(oldThreadPolicy)
.detectDiskWrites()
.build());
super.onCreate();
}
}
这样,在主线程执行文件读写操作,就会报错。
-
主线程耗时操作
在https://www.cnblogs.com/yaowen/p/6024690.html
这篇博客里,作者说的很详细,这个可以自定义,使用StrictMode.noteSlowCall方法即可向StrictMode传递类似于异常的信息。
VMPolicy 详解(虚拟机策略)
主要是用来检测内存泄漏
-
检测Activity内存泄漏
-
检测没有正确关闭
我测试了一下,不加close,StrictMode并没有生效。
其它操作
在设置里开启了严格模式,但是耗时操作屏幕也没有闪烁不知道为啥(vivo iqoo android9.0)。
2.Systrace
官方使用指南:https://developer.android.google.cn/studio/profile/systrace.html
trace启动
https://www.cnblogs.com/blogs-of-lxl/p/10926824.html (介绍了一些缩放、移动快捷键,怎么写bat来开启ddms)
- 通过systrace.py启动
通过systrace.py启动可以自定义更多的参数(但是windows使用py脚本,除了要安装完整python外,还要安装对应的支持windows api插件,且版本要和sdk里的py脚本的版本一致。)
https://blog.csdn.net/Jason43/article/details/84834990D:\Android\Sdk\platform-tools\systrace>systrace.py -a com.example.appoptimize -t 10
使用Python可能会出现的问题:
1)ImportError: No module named six
https://blog.csdn.net/Jason43/article/details/84834990
2)指定-o 输出路径参数,生成trace.html报错:
不加-o参数即不会报错
trace文件分析
http://www.360doc.com/content/18/0423/20/7377734_748161620.shtml
https://www.cnblogs.com/andy-songwei/p/10659564.html
https://blog.csdn.net/weixin_38570262/article/details/78479064 (如何精确的trace,自定义自己的trace label)
https://www.jianshu.com/p/acc78b36bd34 (大致图解了一下systrace的各个图形的意思)
- F符号判断是否卡帧
3.TraceView
作用:分析方法调用栈以及其执行时间, 优化方法执行.
DDMS开启TraceView:
https://www.cnblogs.com/sunzn/p/3192231.html
https://blog.csdn.net/u010164190/article/details/80092941
AndroidStudio开启TraceView:
对应CPU选项
https://segmentfault.com/a/1190000011084104
4.Layout Inspector
最新的SDK里没有Hierarchy Viewer,as使用Layout Inspector替代。
官方文档:https://developer.android.google.cn/studio/debug/layout-inspector.html
https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html
布局优化和Hierarchy Viewer看下面
https://www.jianshu.com/p/4943dae4c333
5.Layout InspectorAndroid Studio 3.0 Profiler 性能分析利器
https://blog.csdn.net/u014651216/article/details/80205113
https://blog.csdn.net/haovip123/article/details/96774580
- cpu
可以方便地追踪到方法的执行时间和调用栈。
第二篇:性能优化实战
1.CPU与内存优化
https://blog.csdn.net/zhyshamily/article/details/84478145
https://blog.csdn.net/yzl11/article/details/51952743
https://www.cnblogs.com/QiKa/p/12079765.html
打印cpu与内存使用情况
1.adb shell 进入控制台
2.echo 3>/proc/sys/vm/drop_caches (清除一下系统cache)
3.top -d 1 | grep com.tencent.mm (以微信为例,每一秒打印一次资源利用情况),此命令不需要root权限。
执行结果的具体列数:
PID PR CPU% S #THR VSS RSS PCY UID
Android App性能评测分析-cpu占用篇
https://www.jianshu.com/p/31b1a4aef550
2.应用启动速度优化
https://www.jianshu.com/p/98c1656a357a
3.ANR处理
https://www.jianshu.com/p/6d855e984b99
android ANR发生的原因总结和解决办法
https://www.jianshu.com/p/7fd95bc2a55c
https://www.jianshu.com/p/7fd95bc2a55c
4.消除卡顿
https://www.jianshu.com/p/1fb065c806e6
【Android 性能优化】—— UI篇
Android性能优化典范-底层工作原理
http://www.open-open.com/lib/view/open1482827456626.html
https://blog.csdn.net/lmj623565791/article/details/45556391/
https://www.jianshu.com/p/906cd1af2ce7
https://www.cnblogs.com/ldq2016/p/8480153.html
https://blog.csdn.net/guolin_blog/article/details/43376527
- 不要过度绘制,减少嵌套,减少重复的background。
- include
注意include的特性,如果include时指定了id,那么这个id就会覆盖替代include的布局的根结点的id。 - ViewStub
懒加载布局,ViewStub常常用来引入那些默认不显示,只在特定情况下才出现的布局,例如:进度条,网络连接失败显示的提示布局等。 - merge
merge只是一个标签,但是不是view。
第三方卡顿检测工具
- 耗时统计
Hugo
http://www.javashuo.com/article/p-uijirgio-em.html
一个方法就得加一个注解,有点儿麻烦。Hugo工具只适合有针对性地统计少数方法的耗时。
- 卡顿检测
BlockCanary:https://juejin.cn/post/6905372629605449741
Trace Canary
https://zhuanlan.zhihu.com/p/102627869
5.电量优化
https://www.jianshu.com/p/c55ef05c0047
6.网络优化
https://www.jianshu.com/p/d4c2c62ffc35
7.稳定性优化
8.安装包体积优化
9.应用启动速度优化
10.兼容性优化/适配优化
- API等级适配
市场不同手机厂商、不同android系统参差不齐,在使用API和设计代码时要考虑到兼容性,避免crash。通过Build.VERSION.SDK_INT(Android1.6也就是API4引入的字段)来判断API等级,更低等级的可以使用Build.VERSION.SDK来判断,通过反射可以判断是否有这个字段。
11.算法优化
- 减少重复计算,已经计算出来的可以缓存。
- 选择合适高性能的数据类型和数据结构
比如拼接字符串不要使用string+,要使用StringBuilder。 - 关键代码别用反射,反射代码执行效率差。
第三篇:Android系统演进优化历史
- Android2.2引入JIT编译器,Dalvik字节码会被编译成本地代码,直接由CPU执行,极大了提高了代码执行性能,是android2.1的2到5倍。
0 条评论