背景:
在学习framework开发入门时候,大部分人都跟着马哥使用aosp自带的模拟器进行开发,当时我们一般有一点代码修改都是直接make,即make整个系统镜像,然后再进行emulator运行模拟器来验证效果。这种方式说是对于性能好的机器来说其实没啥影响,因为aosp编译耗时一般都是在第一次编译时候,后期修改热编译都是一般修改差量部分,所以大部分时间也都在1-2分钟既可以完成系统整编。
但是也有的公共模块,可能自己公共模块修改了会影响其他模块也要进行编译,因为其他模块可能对他有依赖, 这个情况编译可能最长会到达20分钟。
基于以上的问题,很多同学提出是否可以让模拟器和手机一样进行单模块编译,编译了单模块再进行单模块push,验证。这种方式在手机上其实是非常非常常见的方案,因为手机整编一次非常耗时间,不到迫不得已一般都是进行单模块编译,因为framework开发的大部分同学都是只进行framework.jar和services.jar等模块修改。
进行探索实战:
那么上面基于上面单模块编译然后push要求,我们在模拟器上进行一个尝试。
1、直接emulator然后进行
emulator
adb root
adb remount
adb push out/target/product/emulator_x86_64/system/framework/services.jar /system/framework/services.jar
上图可以发现报错了
adb: error: failed to copy 'out/target/product/emulator_x86_64/system/framework/services.jar' to '/system/framework/services.jar': remote couldn't create file: Read-only file system
大概意思说属于read-only的file system
是否有其他解决方法呢?
使用emulator -help命令看到线索
有一个-writable-system可以让system等image变成可写
尝试一下:
emulator -writable-system
adb root
让我们重启一次
emulator -writable-system
重启后就remount就成功了
push 修改验证:
修改wms代码
进行编译push验证
注意push目标目录要正确,而且要kill相关进程进行验证,这样就不需要再来重启模拟器了
验证效果:
一切完美生效,这样可以一些时间,比整编相比还是有很大优势。
总结
1、单模块编译更新,需要我们对自己模块修改后编译生成对应的so,apk,jar很熟悉,这样我们才可以考虑单模块编译push,如果不清楚的话请大家还是整编最为保险,以防出现不生效啥的情况
2、每次启动模拟器要带上emulator -writable-system,而且第一次adb remount要进行重启生效
更多framework详细代码和资料参考如下链接
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频试看:
https://www.bilibili.com/video/BV1wc41117L4/
更多framework假威风耗:androidframework007