订阅博客
收藏博客
微博分享
QQ空间分享

民间小调,都9102年了,Android 冷启动优化除了老三样还有哪些新招?,叶志平

频道:淘宝彩票官网首页 标签:重生之血眸魔女倾天下好色的 时间:2020年02月14日 浏览:212次 评论:0条

功能优化一向都是一个 Android 开发者逃不过的论题,发动优化则更是重中之重。


发动速度能够直接影响一个 App 的留存率和转化率,没有人会期望自己点击之后还要等一会才翻开。


可是当我一番调研后发现,网上大部分发动优化相关的文章,套路都差不多,我称之为老三样。


什么是老三样?

1. 将发动页主题布景设置成闪屏页图片

这么做的意图首要是为了消除发动时的黑白屏,给用户一种秒呼应的感觉,可是并不会真实削减用户发动时刻,仅归于视觉优化。


2. 主页面布局优化

1)经过削减冗余或许嵌套布局来下降视图层次结构

2)用 ViewStub 代替在发动进程中不需求显现的 UI 控件

3. Application 和 主 Activity 的 onCreate 中异步初始化某些代码

由于在主线程上进行资源初始化会下降发动速度,所以能够将不必要的资源初始化推迟,到达优化的作用。可是这儿要注意懒加载集中化的问题,别用户发动时刻快了,可是无法在界面上操作就为难了。


老三样并不说是不管用或许过期了,仅仅这三种优化办法都是十分根底的办法,当你的发动优化遇到了瓶颈,是不能够再经过这三种办法打破的。


并且只会根底的优化办法,并不会在经历中展现出优势。


所以今日说说在老三样的根底优化之上还有哪些王石的女儿王湛蓝可行的计划。

进阶计划一:经过 systrace 查找耗时代码

详细步骤

1)清空手机后台

2)在指令行履行

python $ANDROID_HOME/platform-tools/systrace/systrace.py gfx view wm am pm ss dalvik app sched -b 90960 -a 你的包名 -o test.log.html

这一步需求你体系环境装备了 ANDROID_HOME 环境变量。

3)运转你的App,正常操作到你想测功能的当地,然后再指令行窗口中按 Enter 键中止搜集

4)用 chrome(只支撑此浏览器)翻开生成的 test.log.html 成果文件,翻开作用如下图:

现在需求关怀的当地便是咱们的运用进程相关的,也便是红框圈起来的当地。

图中的 F 代表制作帧,黄色/赤色表明该帧制作超时,绿色代表制作正常,也便是在16.6ms内制作完一帧。


扩大能够看到在发动进程中,控件烘托耗时状况

所以能够很简略发现哪些发动进程中没有用到的 UI 控件也被烘托了,这时就能够用 ViewStub 去代替。

可是现在能够看到的都是体系调用的耗时状况,由于谷歌预先在代码里要害的当地加上河南郑州天气了监控,假如想要看到自己办法的耗时,

那需求手动在办法进口加上 Trace.beginS五禽戏ection("TAG")

在办法完毕的当地加上 Trace.endSection()

这样就能够在生成的成果中看到咱们自定义的 tag。

假如许多当地你都想加上监控,手动加是必定不合适的,这儿引荐函数插桩办法主动加上监控代码,参阅 systrace+函数插桩


这种办法不只能够协助监控发动进程中功能问题,再做卡顿优化的时分也能够用这种办法。

定位到了耗时办法,再做一些针对性的优化就相对简略了。

进阶计划二:经过 redex 重摆放 class 文件

redex 是 Facebook 开源的一款字节码优化东西,现在只支撑 mac 和 linux。

咱们用的是里边的 interdex 功能来重摆放咱们 dex 中的 class 文件,那么为什么重摆放 class 文件能够优化发动速度?

简略的说,经过文件重摆放的意图,便是将发动阶段民间小调,都9102年了,Android 冷发动优化除了老三样还有哪些新招?,叶志平需求用到的文件在 APK 文件中排布在一同,尽可能的运用 Linux 文件体系的 pagecache 机制,用最少的磁盘 IO 次数,读取尽可能多的发动阶段需求的文件,削减 IO 开支,然后到达进步发动功能的意图。


所以咱们着手要做的就三件事:

1)装置装备 redex

2)取得发动进程中 class 文件的加载次序

3)依据这个次序重摆放 dex 中的 class 文件

详细步骤

1)民间小调,都9102年了,Android 冷发动优化除了老三样还有哪些新招?,叶志平下载 redex,装备环境(M好人终身安全ac OS)

git 民间小调,都9102年了,Android 冷发动优化除了老三样还有哪些新招?,叶志平clone https://github.com/f水门事件acebook/redex.git
xcod跑酷游戏e-select --install
brew install autoconf automake libtool python3
brew install boost js斯诺登oncpp


2)编译装置 redex

cd redex
autoreconf -ivf && ./configure && make
sudo make install

编译时刻较久,不想干等着,能够加上 say 指令,编译完结后语音告诉

autoreconf -ivf && ./configure && make && say '编译完结'

3)装备优化项

由于 redex 默许不敞开 interdex,所以咱们要在装备文件中加上相应的装备,在 redex 文档中有阐明

所以咱们翻开装备文件

cd redex/config/
vi default.c上海红房子医院onfig

依照下图装备

4)取得发动 class 加载次序列表

这儿依照 redex 供给的东西获取,可是需求手机有 root 权限

首要清民间小调,都9102年了,Android 冷发动优化除了老三样还有哪些新招?,叶志平空后台进程,然后翻开你的运用

获取你的运用的 pid

adb 迷失森林shell ps | grep 你的运用包名

搜集堆内存,需求 root 权限

adb root
adb shell am dumpheap YOUR_PID /data/local/tmp/SOMEDUMP.hprof

把堆内存文件拉取到电脑的某个霍启刚真爱的是卢恬儿方位

adb pull /data/local/tmp/SOMEDUMP.hprof YOUR_DIR_HERE/

经过 python 脚本解析堆内存,生成类加载次序列表

python redex/泰民蛋堡tools/hprof/dump_classes_from_hprof.py --hprof YOUR_DIR_HERE/SOMEDUMP.hprof > list_of_classes.txt

Ps: 这修真国际个脚本支撑 Python 2,履行进程中假如遇到某个库没moonsorrow装置之类的,直接经过 pip in海神stall 缺失的库 就能够。

5)经过 redex 处理

ANDROID_SDK=你的Android sdk途径 redex input.apk -o output.apk

6)从头签名

这时分生成的 output.apk 是不能直接装置的,需求从头签名,我测试用的是 debug 包,所以从头签了debug 的签名

jarsigner -keystore ~/.android/debug.keystore -storepass android -keypass android output.apk androiddebugkey

到这就能够从头装置测试了,依照 facebook 的说法和一些大厂的实践,发动速度大约能够进步 10%~20%,在低端机型上作用应该更显着。


关于 redex 的运用和相关装备文档,都能够在 redex/docs/ 目录下检查。

其他相关


发动耗时丈量

为了正确确诊冷发动的功能,需求冷发动的时刻目标,下面有两种简略的办法:

adb指令 : a大众号请求db shell am start -S -W 包名/发动类的全名

例如:

adb shell am start -S -W com.android.helloword/com.android.hellowo民间小调,都9102年了,Android 冷发动优化除了老三样还有哪些新招?,叶志平rd.MainActivity

ThisTime : 最终一个 Activity 的发动耗时

TotalTime : 发动一连串的 Activity 总耗时

WaitTime : 运用进程的创立进程 + TotalTime

这儿咱们重视 TotalTime 就能够。

谷歌在 And西野翔roid4.4(API 19)上也供给了丈量办法,在 logcaappleidt 中过滤 Displayed 字段,

输出的值表明在发动进程和完结在屏幕上制作相应 Astudyctivity 之间经过的时刻,其实和上面的办法得到的成果是相同的。

关于 Android App 的冷发动进程和一些概念能够参阅谷歌官方文档 「App startup time 」https://developer.android.com/topic/performance/vitals/launch-time


由于一些原因,还有一些优化办法没有实践,有爱好的能够自行了解:

1)发动进程中的 GC 优化,尽量削减 GC 次数,防止很多或许频频创立目标,如有必要,可测验放到 Native 完成

2)线程优化,尽可能削减 cpu 调度,详细便是操控线程数量和调度

3)在类加载的进程中经过 Hook 去掉类验证的进程,能够在 systrace 生成的文件中看到 verifyClass 进程,由于需求校验办法的每一个指令,所以是一个比较耗时的操作。

最终

感谢我们本领着性质,看完这篇文章。

在这儿我也共享一份自己录入收拾的Android学习PDF+架构视频+面试文档+源码笔记,还有高档架构技能进阶脑图、Android开发面试专题材料,高档进阶架构材料协助我们学习提民间小调,都9102年了,Android 冷发动优化除了老三样还有哪些新招?,叶志平升进阶,也节约我们在网上查找材料的时民间小调,都9102年了,Android 冷发动优化除了老三样还有哪些新招?,叶志平间来学习,也能够共享给身边凶恶触手老友一同学习

假如你有需求的话,能够点赞+转发重视我,然后私信我【进阶】我发给你