【Android】【框架】【编译】【Freeline】

整体架构

1、核心原理
热更新技术在编译期的应用,后期引用到了线上做热更新
2、稳定性
完善的基线对齐、进程级别异常隔离
3、性能
借鉴Buck多任务并发思想,端口扫描、代码扫描、并发编译、并发dx、并发merge dex,在多核机器上加速明显
在class、dex、resource方面做了缓存
优化buck加速dx、DexMerger、资源编译方面,深入改造AAPT流程
4、具有能力
多任务并发,多级缓存,增量范围最小化,懒加载,基于长链接无安装式运行期动态替换,基线对齐触发机制,可调试

传统打包流程

image.png

AAPT会执行2次
第一次生成R.java,进行javac编译
第二次对res里的资源进行编译
最后APKBuilder把编译好的资源、DEX文件打包成APK,签名,安装
整个流程没有缓存,没有多任务处理,没有增量

LayoutCast

通过AS插件、Python脚本,把diff进行编译和打包,生成classes.dex和res.zip,通过adb发送这2个文件,再进行替换
有不足的地方:

  1. 传统流水式构建,不支持多任务,不能很好地利用该多核优势
  2. res变化后,LayoutCast的行为与instant-run一致,重新打资源包,然后推送至手机,若资源包过大,TCP传输速度会很慢
  3. 通过运行时反射R class field来生成ids.xml、public.xml,用于保证增量包res id和全量包res id一致。因为R的id太多,反射耗时太久
  4. 某些情况下AAPT构建时可能发生数组越界,运行时
  5. 没有缓存机制
  6. 代码增量插入在系统dexlist最前端位置,4.x上手机校验不通过

Buck

以工程为单位拆分出多个任务,并发执行,梳理好节点的依赖关系,输出有向拓扑图
建立了细化的缓存系统
增量构建的原理在于,以工程目录为单位构建,发生变更的时候,重新走一次合并各工程dex,对齐,签名
侵入性较强
在FaceBook内部、微信都是用Buck作为默认的构建方案
(拓扑+多任务并发,是非常重要的思想,我的前同事基于此思想开发出了启动优化框架)

整体任务

image.png

分为如下几块

  1. 电脑手机建立长连接
  2. 扫描各个子工程文件变化
  3. 各个子工程增量dex构建
  4. 增量资源包构建
  5. 合并所有工程dex
  6. 传输增量包

默认8线程并发

单工程任务

image.png

首先扫描文件变化
然后根据扫描结果,考虑运行inc-code-task、inc-res-task

inc-code-task

  1. check-r-change:检验R文件MD5是否变化,若有变化,把新的R.java加入变更列表
  2. begin-code-transaction:备份工作空间,在后续步骤出错时,进行回滚
  3. javac:把扫描出来的Java变更部分,编译
  4. buck-dx:.class打包成.dex。该工具比Android原生快40%左右
  5. buck-smart-dex:减小dex体积

inc-res-task

  1. begin-res-transaction:备份
  2. merge xml:对同名xml节点合并
  3. merge ids:若gen-r阶段发现R文件变更,或者更改文件集合里有ids.xml或者public.xml,则对于新老的这些文件,进行merge
  4. gen ids:通过最后一次生成的资源包,反向生成ids.xml和public.xml,该两个文件在构建增量资源包时候参与编译,可以使得 最后构建出来的资源包的内对于的资源ID与前一次构建的资源包保持一致
  5. build-inc-res:构建增量包

多级缓存

对class、dex做缓存,这个过程并不复杂,做个缓存而已
对于res,增量包构建后,会和手机端的资源文件做一次sync
在做完缓存与拓扑多任务后,性能已经很卓越了

代码增量

通过植入Dex到DexList,这是经典的热修复原理
对于类的查找,会从DexList的开始进行查找,找到后就不会再往下找了,基于此实现动态替换dex

image.png

资源增量

兼容增量包res id、基线包res id

采用上一次生成的public.xml、id.xml参与后续编译

  1. 运行期反射R class field的放啊不可靠,资源太多,耗时太久
  2. ApkTool反编译资源包,把所有资源逆向导出
  3. 对R.java,通过id-gen-tool工具,反向导出id.xml、public.xml,并且会过滤掉枚举常量,解决内存越界问题

高效构建diff res包

根据生成的id.xml、public.xml,放进values中,参与编译后,可以生成正确的resoucres.arsc,不需要编译layout资源和AndroidManifest.xml
并且做了缓存
打包时仅对修改的文件编译后的资源进行打包
最终构建出来diff res包、resoucres.arsc、AndroidManifest.xml

增量包在手机生效

res支持以目录形式存在,所以:
1、解压基线包apk
2、修改AssetsManager对应的path
3、进行sync

image.png

4、清空Resources的cache,重新构建Resources

绕过CLASS_ISPREVERIFIED限制

安装包安装的时候,dexopt会扫描dex内的class,class文件内所有直接引用到的类
如果和该class在同一个dex中,会被打上CLASS_ISPREVERIFIED标签
被打上这个标记的类,DVM在运行时检查,若发现引用的类和打标记的类不在同一个dex,会报错
所以只需要对每个class通过ASM引用一个外部dex类即可

后记

有什么写得错误、让人费解或遗漏的地方,希望可以不吝赐教,我会马上更改

学习自

https://yq.aliyun.com/articles/59122?spm=a2c4e.11153940.0.0.351439d5GMvMx1&type=2

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

推荐阅读更多精彩内容