如何编译APK
在源码环境下,使用mm命令编译module,APK会输出到out/target/product/product_name目录下。
mm -B:强制重新编译,相当于clean后再编译。
Dalvik与ART的区别
Dalvik
JIT(Just-in-time)实时编译,运行的时候将字节码翻译成机器码,所运行的目标(dex)与硬件平台无关,APP运行效率低。
ART
AOT(Ahead-Of-Time,预先编译),运行前将字节码翻译成机器码,所运行的目标文件(oat)与硬件平台相关。APP运行效率高,但是会占用空间,APK安装所需时间增加。
odex是干什么的
dalvik时代:apk运行的时候,会把Apk中的classes.dex解压出来并通过dexopt优化为.odex文件。缓存在/data/dalvick-cache目录下,提高后续执行的效率。
ART时代:APK安装的时候,会把APK中的classes.dex解压后,通过dex2oat工具转换为.odex文件(ELF格式),存储在apk所在的目录的oat目录下。
编译APK的过程
1、进入AOSP系统App目录,下面以Calculator为例
cd android6.0/packages/apps/Calculator复制代码
2、在sublime中打开该项目
subl .复制代码
3、查找需要修改的文件,这里以Calculator.java为例
Ctrl+P复制代码
然后输入Calculator.java
4、查找需要修改的方法,这里以onCreate方法为例
Ctrl+P复制代码
然后在输入@onCreate
5、进行代码的修改并且保存该文件,在onCreate方法中加一个log
Log.wtf("hpp", "this is my first log");复制代码
6、进行命令执行下面命令编译该项目
mm复制代码
7、编译完成之后,通过Install:关键字定位编译输出的文件
我们可以看到生成了一个Calculator.apk 和 一个Calculator.odex
进入这两个文件所在的目录
nautilus $(gettop)/out/target/product/generic/system/app/Calculator/Calculator.apk复制代码
我们会发现Calculator.apk文件中只有资源文件没有代码,代码其实就是这个单独的Calculator.odex。
为什么在源码环境下编译会单独得到odex文件
优点:
1、降低系统更新后启动的时间
为odex的Rom。首次开机的过程会执行odex操作,编译时做,开机的时候就不用做了。
2、减少在设备上进行odex操作所造成的空间浪费
编译时,dexopt/dex2oat,会直接将APK的资源与代码拆开,如果在设备上安装时dexopt/dex2oat,apk的大小不会减少,但又会多一个odex文件占据磁盘空间。
缺点:
1、增加开发时编译的时间
2、不能直接执行APK的install操作,需要将APK和odex都sync到设备上。
如何在开发阶段关闭dex2oat
- 在当前的module的Android.mk里面关闭,在inclue $(BUILD_PACKAGE)之前加上下面代码
LOCAL_DEX_PREOPT = false复制代码
- 在buid/core/main.mk中关闭所有module的dex优化
## eng ##
ifeq ($(TARGET_BUILD_VARIANT), eng)
tags_to_install := debug eng
# 关闭odex优化
WITH_DEXPREOPT := false复制代码
安装编译后的APK
adb install -r $(gettop)/out/target/product/generic/system/app/Calculator/Calculator.apk复制代码
查看修改是否生效
运行Calculator应用,过滤log
adb logcat -s 'hpp'复制代码
参考视频:
https://www.365yg.com/i6436850885292196353#mid=1565254704995330
https://www.365yg.com/i6436851843262841346/#mid=1565254704995330
https://www.365yg.com/i6436852898566504962/#mid=1565254704995330
https://www.365yg.com/i6436853799767245314/#mid=1565254704995330