Android12 源码单模块编译及调试

以下内容基于Android12 源码进行整理

在整编完整个Android 系统后,需要进行系统源码修改,不能每修改一次代码就对整个系统进行一次编译,这个很不现实,这时就需要对单模块进行编译并调试,下面的方法就很有用了。

framework 编译及替换

编译

自从Android 12 之后framework 编译方式和之前的版本有一定区别, 在Android12 源码中不能使用make framework -j16 或者 mm framework/base -j16mmm 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 输出位置

sql 复制代码
out\target\product\XXXXX\system\framework\framework.jar

替换

编译完framework 之后,通过下面命令替换系统中的framework.jar

bash 复制代码
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 编译产物对设备机目录

产物路径 设备路径
out\target\product\xxx\system\framework\framework.jar system/framework/
out\target\product\xxx\system\framework\boot-framework.vdex system/framework
out\target\product\xxx\system\framework\arm\boot-framework.art /system/framework/arm
out\target\product\xxx\system\framework\arm\boot-framework.art.rel /system/framework/arm
out\target\product\xxx\system\framework\arm\boot-framework.oat /system/framework/arm
out\target\product\xxx\system\framework\arm\boot.art system/framework/arm/
out\target\product\xxx\system\framework\arm\boot.oat system/framework/arm/
out\target\product\xxx\system\framework\arm64\boot.art system/framework/arm64/
out\target\product\xxx\system\framework\arm64\boot.oat system/framework/arm64/
out\target\product\xxx\system\framework\arm64\boot-framework.art /system/framework/arm64
out\target\product\xxx\system\framework\arm64\boot-framework.art.rel /system/framework/arm64
out\target\product\xxx\system\framework\arm64\boot-framework.oat /system/framework/arm64

services 编译及替换

编译

services 使用下面命令进行编译 mmm framework/base/services -j16 或者 make -j16 services

编译完成services.jar 输出位置

sql 复制代码
out\target\product\XXXXX\system\framework\services.jar

替换

编译services 之后,通过下面命令替换系统中的services.jar

perl 复制代码
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 编译产物对设备机目录

产物路径 设备路径
out\target\product\xxx\system\framework\services.jar system/framework/
out\target\product\xxx\system\framework\services.jar.prof system/framework
out\target\product\xxx\system\framework\oat\arm64\services.art system/framework/oat/arm64/
out\target\product\xxx\system\framework\oat\arm64\services.odex system/framework/oat/arm64/
out\target\product\xxx\system\framework\oat\arm64\services.vdex system/framework/oat/arm64/

SELinux 编译及替换

编译

修改system/sepolicy 目录下的代码需要使用下面方式进行编译:

shell 复制代码
$ cd system/sepolicy
$ mmm

或者直接使用make selinux_policy 命令进行编译

替换

编译完成之后使用下面命令将产物push 到指定目录:

bash 复制代码
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 编译命令:

go 复制代码
make bootimage

编译完boot.img 后进入fastboot 模式刷入刚刚编译好的 boot.img

arduino 复制代码
// 进入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 文件,内容如下:

arduino 复制代码
cc_library_shared {
    name: "libcamera_client",
    // .... 省略不分代码
    srcs: [
        // 包含Camera.cpp 文件
        "Camera.cpp",
    // .... 省略不分代码
    ],

   // .... 省略不分代码

}

这里展示了Android.bp 文件中的部分,找到 cc_library_sharedname对应的字段,使用下面命令进行编译:

go 复制代码
make libcamera_client

这里编译的产物是.so 文件,只需要将编译出来的产物push 到对应的地方即可。需要注意一下,需要分别push 32位和64位。

bash 复制代码
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/
相关推荐
Mr YiRan2 小时前
网络请求API监控与网络切换埋点
android·网络
美狐美颜sdk5 小时前
直播APP开发技术栈详解:视频美颜SDK、人脸识别与实时渲染
android·人工智能·音视频·美颜sdk·直播美颜sdk
奈斯先生Vector11 小时前
当模型版本不断变化,RelayRouter 能否帮助 AI 应用摆脱深度绑定
android·java·人工智能·开源·aigc
TimeFine11 小时前
让强模型做“总工”,让高性价比模型写代码
android
又见情义12 小时前
RK3568 Android 13 屏蔽 healthd 电池日志经验分享
android
古法安卓16 小时前
Android-Fork 机制详解
android·java·android studio
Android打工仔16 小时前
不要在 Data 层随意把 Cold Flow 转换成 Hot Flow
android·架构·kotlin
峥嵘life16 小时前
2026免费的 opencode 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言
杉氧17 小时前
拒绝重复造轮子:我写了一个生产级的 Kotlin 协程与 Flow 工具库(CoroutineKit)
android·kotlin·workflow
恋猫de小郭17 小时前
Flutter GSoC 2026 提案进度解读,补上 DevTools、FFI 和原生平台的关键缺口
android·前端·flutter