首页 > 编程语言 >Android 源码单模块编译及调试

Android 源码单模块编译及调试

时间:2024-05-08 11:14:03浏览次数:26  
标签:product target framework system 编译 源码 Android out

以下内容基于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 输出位置

out\target\product\XXXXX\system\framework\framework.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 编译产物对设备机目录

产物路径设备路径
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 输出位置

out\target\product\XXXXX\system\framework\services.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@[email protected]@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 目录下的代码需要使用下面方式进行编译:

$ 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_sharedname对应的字段,使用下面命令进行编译:

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/


原作者:mm_cuckoo
链接:https://www.jianshu.com/p/8f35e9273c18

标签:product,target,framework,system,编译,源码,Android,out
From: https://www.cnblogs.com/terrorists/p/18179114

相关文章

  • java的三种编译(JAVAC,JIT,AOT)
    1.javac把java代码编译成字节码(中间代码),然后由java虚拟机解释执行2.jit(运行时编译)把java代码直接编译成机器码,然后由java虚拟机直接运行(缓存)。有对客户端的C1和对服务器端的C2编译器缓存代码优化逃逸分析,是否超出范围。对不同逃逸状态做优化全局逃逸对象超出了方法或线......
  • Keil编译后的Code,RO,RW,ZI等相关
    在使用keil开发STM32应用程序时,点击Build后在BuildOutput窗口中经常会有如下信息:以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系,于是上网搜了一圈,做如下总结:这些参数的单位是Byte图中几个参数分别代表 Code:代码的大小RO:常量所占空间(加了const修饰......
  • 27-Spring源码分析(二)
    AOP源码分析1.AOP概述AOP(AspectOrientProgramming)利用代理模式,通过代理对象对被代理的对象增加功能。所以,关键在于AOP框架自动创建AOP代理对象,代理模式分为静态代理和动态代理。AspectJ使用静态代理,编译时增强,在编译期生成代理对象;SpringAOP使用动态代理,运行时......
  • android开发板USB连接PC后adb口丢失 解决
    刚开始启动,90DB端口都是有的,屏幕上亮一下就黑了,然后modem端口一闪就没了;然后adbshell显示如下: 经确认是硬件modem相关人员修改问题导致的,modem口的导致adb口掉线了~! 解决办法是,禁用系统服务里的 WWANAutoConfig  请禁用电脑上的WWANAutoConfig,并把该服务停止......
  • uniapp 编译成h5,返回上一页之后没有触发生命周期问题
    今天开发测试的时候,无意中发现点击分享链接进去登陆成功返回上一页的时候,页面直接空白了。刚开始的时候,就很奇怪,毕竟分享链接这个功能是好久之前的,不可能无缘无故的出问题来着。开始分析问题,查看网络请求,发现空白页面一个请求都没有发出,不寻常。猜测是不是哪里打了断点导致的。......
  • pdf.js源码分析-textLayer中的坐标计算
    在pdf.js中显示pdf内容和选择pdf文字属于不同的层,一个是canvas绘制,一个是使用dom进行布局,那么接下来先看一下在textLayer中的文字节点div是怎么计算每段文字的布局位置的吧。首先找到pdf.js源码中的text_layer.js文件,然后得到下面方法appendText方法,下面的解释是在字体没有发生旋......
  • FiddlerCore源码
    这是FiddlerCore5.0.2版本源码,支持.netframework和.netcore,百分百c#源码,功能全而且免费,无功能限制,还修复了多处bug。介绍:FiddlerCore可捕获和修改HTTP和HTTPS流量,而无需任何FiddlerUI。特点:HTTP和HTTPS流量捕获和修改。用于内容过滤和修改的强大对象模型。存......
  • 2024 js预编译
    1、一切未声明定义的变量(没有var)是全局变量属于window全局域2、全局声明定义的变量是全局变量属于window全局域functiontest(){vara=b=123}test()//console.log(a)//报错aisnotdefinedconsole.log(window.a)//undefinedconso......
  • c语言编译系统工作原理
    c语言编译系统内部的工作原理程序生命周期概述一个程序的生命周期可以被分成四个部分:创建编译运行退出以一个简单的helloworld.c程序为例:#include<stdio.h>intmain(){ printf("helloworld!");return0;}编译的详细过程通过这条命令gcc-ohelloworldh......
  • JUC源码解析:深入解读偏向锁
    JUC源码解析:深入解读偏向锁本文使用jdk8几种锁状态介绍先介绍一下锁状态吧看偏向锁这一栏,它的内存存储了线程ID和Epoch,这一点尤为关键,意味着偏向锁没有内存可以存储对象头的hashCode,而其他锁是有地方存的.。也就意味着,,当锁对象被隐式(父类)或显试调用了has......