以下内容根据Android12 源码进行整理
在整编完整个Android 体系后,需求进行体系源码修正,不能每修正一次代码就对整个体系进行一次编译,这个很不实际,这时就需求对单模块进行编译并调试,下面的方法就很有用了。
framework 编译及替换
编译
自从Android 12 之后framework 编译方法和之前的版别有一定区别, 在Android12 源码中不能运用make framework -j16
或许 mm framework/base -j16
、mmm framework/base -j16
在Android12 编译framework 需求运用make -j16 framework-minus-apex
方法编译
总结一下编译差异:
版别 | 编译方法 |
---|---|
Android12 | make -j16 framework-minus-apex |
Android12 之前 |
make framework -j16 mm framework/base -j16 mmm framework/base -j16
|
编译完结framework.jar
输出方位
outtargetproductXXXXXsystemframeworkframework.jar
替换
编译完framework 之后,经过下面指令替换体系中的framework.jar
adb root
adb remount
adb shell "rm -rf /system/framework/arm /system/framework/arm64"
adb push framework.jar /system/framework
adb shell sync
adb reboot
framework 编译产品对设备机目录
产品途径 | 设备途径 |
---|---|
outtargetproductxxxsystemframeworkframework.jar | system/framework/ |
outtargetproductxxxsystemframeworkboot-framework.vdex | system/framework |
outtargetproductxxxsystemframeworkarmboot-framework.art | /system/framework/arm |
outtargetproductxxxsystemframeworkarmboot-framework.art.rel | /system/framework/arm |
outtargetproductxxxsystemframeworkarmboot-framework.oat | /system/framework/arm |
outtargetproductxxxsystemframeworkarmboot.art | system/framework/arm/ |
outtargetproductxxxsystemframeworkarmboot.oat | system/framework/arm/ |
outtargetproductxxxsystemframeworkarm64boot.art | system/framework/arm64/ |
outtargetproductxxxsystemframeworkarm64boot.oat | system/framework/arm64/ |
outtargetproductxxxsystemframeworkarm64boot-framework.art | /system/framework/arm64 |
outtargetproductxxxsystemframeworkarm64boot-framework.art.rel | /system/framework/arm64 |
outtargetproductxxxsystemframeworkarm64boot-framework.oat | /system/framework/arm64 |
services 编译及替换
编译
services 运用下面指令进行编译
mmm framework/base/services -j16
或许 make -j16 services
编译完结services.jar
输出方位
outtargetproductXXXXXsystemframeworkservices.jar
替换
编译services 之后,经过下面指令替换体系中的services.jar
adb root
adb remount
adb shell "rm -rf /system/framework/arm /system/framework/arm64"
adb push services.jar /system/framework
adb shell "rm -rf /data/dalvik-cache/arm/system@framework@services.jar@classes.* "
adb reboot
services 编译产品对设备机目录
产品途径 | 设备途径 |
---|---|
outtargetproductxxxsystemframeworkservices.jar | system/framework/ |
outtargetproductxxxsystemframeworkservices.jar.prof | system/framework |
outtargetproductxxxsystemframeworkoatarm64services.art | system/framework/oat/arm64/ |
outtargetproductxxxsystemframeworkoatarm64services.odex | system/framework/oat/arm64/ |
outtargetproductxxxsystemframeworkoatarm64services.vdex | system/framework/oat/arm64/ |
SELinux 编译及替换
编译
修正system/sepolicy
目录下的代码需求运用下面方法进行编译:
$ cd system/sepolicy
$ mmm
或许直接运用make selinux_policy
指令进行编译
替换
编译完结之后运用下面指令将产品push 到指定目录:
adb push out/target/product/emulator_x86_64/system/etc/selinux /system/etc/
adb push out/target/product/emulator_x86_64/vendor/etc/selinux /vendor/etc/
Init 编译及替换
当修正了system/core/init
下的文件时,假如运用 mm
指令编译,然后push
到指定位置时,运行发现我们修的文件没有生效。
Android 每次 reboot 的时分 bootloader 都要将 boot.img 加载到ram 中,其间一部分是真正的 linux kernel image (zImage),另外一部分就是 initramfs (包括 init、init.rc、etc)。之后,Linux kernel 初始化的时分会把 initramfs 以 rootfs 类型 mount 到 /
所以,假如修正system/core/init
下的文件需求重新编译 boot.img
编译指令:
make bootimage
编译完boot.img
后进入fastboot 模式刷入刚刚编译好的 boot.img
// 进入fastboot 模式,还可以运用音量下 + power 长按
adb reboot fastboot
// 刷入 img
fastboot flash boot img_path/boot.img
// 重启设备
fastboot reboot
native 编译
下面以framework/av
目录中的 cpp
代码修正为例, 在示例中修正了frameworks/av/camera/Camera.cpp
文件, 这个时分需求找到编译该文件的Android.bp
文件,内容如下:
cc_library_shared {
name: "libcamera_client",
// .... 省掉不分代码
srcs: [
// 包括Camera.cpp 文件
"Camera.cpp",
// .... 省掉不分代码
],
// .... 省掉不分代码
}
这儿展示了Android.bp
文件中的部分,找到 cc_library_shared
中 name
对应的字段,运用下面指令进行编译:
make libcamera_client
这儿编译的产品是.so 文件,只需求将编译出来的产品push 到对应的地方即可。需求留意一下,需求分别push 32位和64位。
adb push out/target/product/rk3588s_s/system/lib64/libcamera_client.so /system/lib64/
adb push out/target/product/rk3588s_s/system/lib/libcamera_client.so /system/lib/