Android Studio 项目编译优化

编译现状.png

编译流程

image.png
如上图 所示,典型 Android 应用模块的构建流程通常按照以下步骤执行:
1.  编译器将您的源代码转换成 DEX 文件(Dalvik 可执行文件,其中包括在 Android 设备上运行的字节码),并将其他所有内容转换成编译后的资源。
2.  APK 打包器将 DEX 文件和编译后的资源合并到一个 APK 中。不过,在将应用安装并部署到 Android 设备之前,必须先为 APK 签名。
3.  APK 打包器使用调试或发布密钥库为 APK 签名:
    3.1.  如果您构建的是调试版应用(即专用于测试和分析的应用),则打包器会使用调试密钥库为应用签名。Android Studio 会自动使用调试密钥库配置新项目。
    3.2.  如果您构建的是打算对外发布的发布版应用,则打包器会使用发布密钥库为应用签名。
4.  在生成最终 APK 之前,打包器会使用 zipalign工具对应用进行优化,以减少其在设备上运行时所占用的内存。

构建流程结束时,您将获得应用的调试版 APK 或发布版 APK,以用于部署、测试或发布给外部用户。

对于小白来说,上面一张图已经可以解释apk的构建过程了,不过对于Andoid开发者而言还需要了解一些更详细的构建过程。

image.png

详细的对应步骤 和 使用工具如下:

  1. aapt打包资源文件
    资源文件(res文件夹下的文件)通过 AAPT(Android Asset Packaging Tool)打包生成R.java类(资源索引表)、.arsc资源文件 和res文件。

R.java

public final class R {
    public static final class anim {
        public static int abc_fade_in = 0x7f010001;
        public static int abc_fade_out = 0x7f010002;
    }
}

//第一位字节0x7f表示packageID,用来限定资源的来源。系统资源包是ox01,SharedLibrary类型资源包是0x00, 普通App包则是0x7f;
// 次一位字节01表示typeID,用来表示资源类型,如drawable、layouts、anims、color、menu等;
// 后2字节0001/0002表示EvtryID,指的是每一个资源在对应的TypID中出现的顺序
复制
resources.arsc 是一个App的资源索引表,通过R.java 文件 和 resources.arsc 可以定位到资源的内存地址,resources.arsc文件的作用是通过一样的ID,根据不同的配置索引到最佳的资源显示在UI中。

  1. 处理 aidl files
    AIDL (Android Interface Definition Language), 是Android接口定义语言,是Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。
    如果有aidl文件,这个阶段会生成对应的Java接口文件。

  2. 编译(Compilers)
    R.java文件、工程源码文件、aidl.java文件, 在这一步通过javac生成.class文件。
    注解处理器在这一步会进行工作,生成相应的代码

如果配置了代码混淆,也会在生成.class 文件时候进行配置,最终的.class文件混淆后可以防止被反编译

  1. dex(生成dex文件)
    源码.class文件和第三方jar或者library通过dx工具打包成dex文件

Android系统的Dalvik虚拟机的可执行文件为DEX格式,所以这里会将上一步中生成的.class文件 和 引用的第三方jar等过程中的.class 一起通过dx工具打包成dex文件

5.apkbuilder(生成未签名apk)
apkbuilder工具会将所有没有编译的资源、.arsc资源、.dex文件打包到一个完成apk文件中

tips:
res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
6.apksigner/Jarsigner(签名)
apksigner工具会对未签名的apk验证签名。得到一个签名后的apk(signed.apk)

apksigner 是google 退出的V2签名方式
Jarsigner 是之前一直使用的V1签名方式

可以通过在命令行中输入apksigner --help来获取详情信息,如果沒有特殊需求,使用下面命令即可完成签名

${ANDROID_HOME}/build-tools/28.0.3/apksigner sign --ks **.keystore --ks-key-alias [别名] --ks-pass pass:[别名密码] --key-pass pass:[证书密码] --out [签名后文件存放路径] [未签名的文件路径]
复制

  1. zipalign(对齐)
    release mode 下使用 aipalign进行align,即对签名后的apk进行对齐处理

所谓对齐,主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用主要是为了减少运行时内存的使用。

zipalign是一个android平台上整理APK文件的工具,它对apk中未压缩的数据进行4字节对齐,对齐后就可以使用mmap函数读取文件,可以像读取内存一样对普通文件进行操作。如果没有4字节对齐,就必须显式的读取,这样比较缓慢并且会耗费额外的内存。

编译耗时分析:

编译总时间:294s

image.png

混淆占了103s


image.png

关闭混淆

debug {
    minifyEnabled true

编译总时间:54.3s

scan
gradlew app:assemble --scan (Windows ) ./gradlew app:assembleDebug --scan(Ubuntu,Mac)

scan报错:
./gradlew: Permission denied

解决办法:
运行
chmod +x gradlew

image.png

scan结果

这里会让你选择yes、no,输入yes,生成结果

image.png

输入接收邮箱:


image.png

邮箱收到结果


image.png

扫描结果:
https://scans.gradle.com/s/c6pcfckbdq5ic

image.png

作用不大的方案:


image.png

有效方案:


image.png

大厂方案:


image.png

今日头条方案:
https:juejin.cn/post/6854573211548385294

开源方案:


image.png

后续规划:


image.png

实施方案:
https://github.com/trycatchx/RocketX

使用RocketX

关闭这儿


image.png

现在编译时间13.3s:


image.png

相关文章:
https://cloud.tencent.com/developer/article/1920027

https://www.bilibili.com/video/BV1HB4y1V77C?spm_id_from=333.999.0.0&vd_source=c9e619eb6c2ba53337eccc49eb025732

https://juejin.cn/post/7094198918065422350

https://droidyue.com/blog/2017/04/16/speedup-gradle-building/index.html

https://developer.android.google.cn/studio/build/optimize-your-build?hl=zh_cn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容