使用Lint工具进一步优化
- 检查是否有主线程做了耗时 *** 作:
严苛模式(StrictMode),是Android提供的一种运行时检测机制,用于检测代码运行时的一些不规范的 *** 作,最常见的场景是用于发现主线程的IO *** 作。应用程序可以利用StrictMode尽可能的发现一些编码的疏漏。
开启 StrictMode
对于应用程序而言,Android 提供了一个最佳使用实践:尽可能早的在
android.app.Application 或 android.app.Activity 的生命周期使能 StrictMode,onCreate()方法就是一个最佳的时机,越早开启就能在更多的代码执行路径上发现违规 *** 作。
监控代码
publicvoidonCreate(){
if(DEVELOPER_MODE){
StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()
.detectAll().penaltyLog().build());
StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()
.detectAll().penaltyLog().build());
}
super.onCreate();
}
如果主线程有网络或磁盘读写等 *** 作,在logcat中会有"D/StrictMode"tag的日志输出,从而定位到耗时 *** 作的代码。
3)如果主线程无耗时 *** 作,还存在卡顿,有很大可能是必须在UI线程 *** 作的一些逻辑有问题,比如控件measure、layout耗时过多等,此时可通过Traceview以及systrace来进行分析。
4)Traceview:Traceview主要用做热点分析,找出最需要优化的点。
打开DDMS然后选择一个进程,接着点击上面的“Start Method Profiling”按钮(红色小点变为黑色即开始运行),然后 *** 作我们的卡顿UI,然后点击"Stop Method Profiling",会打开如下界面:
图中展示了Trace期间各方法调用关系,调用次数以及耗时比例。通过分析可以找出可疑的耗时函数并进行优化;
5)systrace:抓取trace:
执行如下命令:
$cdandroid-sdk/platform-tools/systrace
$pythonsystrace.py–time=10-omynewtrace.htmlschedgfxviewwm复制代码
*** 作APP,然后会生成一个mynewtrace.html 文件,用Chrome打开。
图示如下:
通过分析上面的图,可以找出明显存在的layout,measure,draw的超时 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 问题。
6)导入如下插件,可通过在方法上添加@DebugLog来打印方法的耗时:
build.gradle:
buildscript{
dependencies{
//用于方便调试性能问题的打印插件。给访法加上@DebugLog,就能输出该方法的调用参数,以及执行时间;
classpathcom.jakewharton.hugo:hugo-plugin:1.2.1
}
}
//用于方便调试性能问题的打印插件。给访法加上@DebugLog,就能输出该方法的调用参数,以及执行时间;
applyplugin:com.jakewharton.hugo
java:
@DebugLog
publicvoidtest(inta){
intb=a*a;
}
四、内存性能分析优化
1.内存泄露
该问题目前在项目中一般用leakcanary基本就能搞定,配置起来也相当简单:
build.gradle:
dependencies{
debugCompilecom.squareup.leakcanary:leakcanary-android:1.3.1//or1.4-beta1
releaseCompilecom.squareup.leakcanary:leakcanary-android-no-op:1.3.1//or1.4-beta1
testCompilecom.squareup.leakcanary:leakcanary-android-no-op:1.3.1//or1.4-beta1
}
java:
publicclassExampleApplicationextendsApplication{
@OverridepublicvoidonCreate(){
super.onCreate();
LeakCanary.install(this);
}
}
一旦有内存泄露,将会在通知栏生成一条通知,点开可看到泄露的对象以及引用路径:
2.内存抖动
如果代码中存在在onDraw或者For循环等多次执行的代码中分配对象的行为,会导致运行过程中gc次数增多,影响ui流畅度。一般这些问题都可通过lint工具检测出来。
五、耗电量优化建议
电量优化主要是注意尽量不要影响手机进入休眠,也就是正确申请和释放WakeLock,另外就是不要频繁唤醒手机,主要就是正确使用Alarm。
六、一些好的代码实践
1. 节制地使用Service
2. 当界面不可见时释放内存
3. 当内存紧张时释放内存
4. 避免在Bitmap上浪费内存
对大图片,先获取图片的大小信息,根据实际需要展示大小计算inSampleSize,最后decode;
publicstaticBitmapdecodeSampledBitmapFromFile(Stringfilename,
intreqWidth,intreqHeight){
//FirstdecodewithinJustDecodeBounds=truetocheckdimensions
finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile(filename,options);
//CalculateinSampleSize
options.inSampleSize=
reqHeight);
calculateInSampleSize(options,
reqWidth,
//DecodebitmapwithinSampleSizeset
options.inJustDecodeBounds=false;
returnBitmapFactory.decodeFile(filename,options);
}
publicstaticintcalculateInSampleSize(BitmapFactory.Optionsoptions,
intreqWidth,intreqHeight){
//Rawheightandwidthofimage
finalintheight=options.outHeight;
finalintwidth=options.outWidth;
intinSampleSize=1;
if(height>reqHeight||width>reqWidth){
if(width>height){
inSampleSize=Math.round((float)height/(float)reqHeight);
}else{
inSampleSize=Math.round((float)width/(float)reqWidth);
}
}
returninSampleSize;
}
5. 使用优化过的数据集合
6. 谨慎使用抽象编程
7. 尽量避免使用依赖注入框架
很多依赖注入框架是基于反射的原理,虽然可以让代码看起来简洁,但是是有碍性能的。
8. 谨慎使用external libraries
9. 优化整体性能
10. 使用ProGuard来剔除不需要的代码
android{
buildTypes{
release{
minifyEnabledtrue
shrinkResourcestrue
proguardFilesgetDefaultProguardFile(proguard-android.txt),src/main/proguard-project.txt
signingConfigsigningConfigs.debug
}
}
11. 慎用异常,异常对性能不利
抛出异常首先要创建一个新的对象。Throwable 接口的构造函数用名为
fillInStackTrace() 的本地方法,fillInStackTrace() 方法检查栈,收集调用跟踪信
息。只要有异常被抛出,VM 就必要调整调用栈,因为在处理过程中创建了一
个新对象。
异常只能用于错误处理,不应该用来控制程序流程。
以下例子不好:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)