0717-7821348
爱彩人app

爱彩人app

您现在的位置: 首页 > 爱彩人app
爱彩人app-都9102年了,Android 冷启动优化除了老三样还有哪些新招?
2019-12-19 05:01:49

功能优化一向都是一个 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.beginSection("TAG")

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

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

假如许多当地爱彩人app-都9102年了,Android 冷启动优化除了老三样还有哪些新招?你都想加上监控,手动加是必定不合适的,这儿引荐函数插桩办法主动加上监控代码,参阅 systrace+函数插桩


这种办法不只能够协助监控发动进程中功能问题,爱彩人app-都9102年了,Android 冷启动优化除了老三样还有哪些新招?再做卡顿优化的时分也能够用这种办法。

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

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

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

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

简略的说,经过文件重摆放的意图,便是将发动阶段需求用到的文件在 APK 文件中排布在一同,尽可能的运用 Linux 文件体系的 pagecache 机制,用最少的磁盘 IO 次数,读取尽可能多的发动阶段需求的文件,削减 IO 开支,然后到达进步发动功能的意图。


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

1)装置装备 rede爱彩人app-都9102年了,Android 冷启动优化除了老三样还有哪些新招?x

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

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

详细步骤

1)下载 redex,装备环境(Mac OS)

git clone https://github.com/facebook/redex.git
xcode-select --install
brew install autoconf automake libtool python3
brew install boost jsoncpp


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.config

依照下图装备

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

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

首要清空后台进程,然后翻开你的运用

获取你的运用的 pid

adb shell ps | grep 你的运用包名

搜集堆内存,需求 root 权限

adb root
adb shell am dumpheap YOUR_PID /data/local/tmp/SOMEoppositeDUMP.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,履行进程中假如遇到某个库没装置之类的,直接经过 pip install 缺失的库 就能够。

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指令 : adb shell am start -S -W 包名/发动类的全名

例如:

adb shell am start -S -W com.android.helloword/com.android.helloword.MainActivity

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

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

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

这儿咱们重视 TotalTime 就能够。

谷歌在 Android4.4(API 19)上也供给了丈量办法,在 logcat 中过滤 Displayed 字段,

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

关于 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开发面试专题材料,高档进阶架构材料协助我们学习进步进阶,也节约我们在网上查找材料的时刻来学习,也能够共享给身边老友一同学习

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