Android 客户端性能优化(魅族资深工程师毫无保留奉献)

利用Android提供的工具进行位置确认以及修改(HierarchyView , Tracer for OpenGL ES)

定位到具体的视图(xml文件或者View)

通过代码和xml文件分析过渡绘制的原因

结合具体情况进行优化

使用Lint工具进一步优化

  1. 检查是否有主线程做了耗时操作:

严苛模式(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的超时问题。

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 就必要调整调用栈,因为在处理过程中创建了一

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

最后

以前一直是自己在网上东平西凑的找,找到的东西也是零零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。

后面我就自己整理了一套资料,还别说,真香!

资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。

系列教程图片

2020Android复习资料汇总.png

flutter

NDK

设计思想开源框架

微信小程序

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。

后面我就自己整理了一套资料,还别说,真香!

资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。

[外链图片转存中…(img-OvgElyBm-1711548322193)]

[外链图片转存中…(img-a8eKXZAw-1711548322194)]

[外链图片转存中…(img-DoghvsNt-1711548322194)]

[外链图片转存中…(img-oUwZjcGp-1711548322194)]

[外链图片转存中…(img-DOdrUc2Z-1711548322194)]

[外链图片转存中…(img-CawC9uz2-1711548322195)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值