从零开始自定义安卓系统(7) 预装二进制文件和删除预装模块


从零开始自定义安卓系统(7) 预装二进制文件和删除预装模块

预编译二进制文件

操作上类似于预装系统app 不过变成了使用cc_prebuilt_binary

推荐在external/ 目录新建一个文件夹,然后添加一个Android.bp

1
2
3
4
5
6
7
cc_prebuilt_binary {
   name:"ecapture",
   srcs:["./ecapture"]
   strip:{
     none:true
   }
}

比起系统app, 二进制文件的一大问题是 预编译的架构不一样是无法运行的, 这个时候可以使用arch参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cc_prebuilt_binary {
   name:"ecapture",
   arch:{
     x86_64: {
       srcs:["./ecapture-v0.7.3-linux-x86_64/ecapture"]
     },
     # 有四种架构 arm, x86,arm64, x86_64
   },
   strip:{none:true}
}

为每个不同的架构指定不同的二进制文件.

另一个问题就是未必想要放到/system/bin, 在soong大部分模块都具有以下两个属性

vendorproduct_specific , 设置为true后 会放到/vendor/product 分区, 如果没有将会放入/system/vendor/system/product

删除模块

如何查看目标文件的对应代码路径

很多情况下都是要删除一个系统apk,但是要删除一个文件,首先要知道他对应的源码路径. 在out/target/product/<产品名> 路径下有个module-info.json

里面包含了模块与其对应的路径, 直接搜索对应的文件名, 会看到类似这样的json格式

1
 "ActivityManagerPerfTestsUtils": { "class": ["JAVA_LIBRARIES"],  "path": ["frameworks/base/tests/ActivityManagerPerfTests/utils"],  "tags": ["tests"],  "installed": ["out/target/product/test/testcases/ActivityManagerPerfTestsUtils/x86_64/ActivityManagerPerfTestsUtils.jar"],  "compatibility_suites": ["null-suite"],   "module_name": "ActivityManagerPerfTestsUtils",  "supported_variants": ["DEVICE"] },

installled 对应的就是路径, 而module_name 则是对应的名字, path对应源码路径. 之后再根据模块名

去删除.

删除和替换模块

如果要删除的话,需要修改对应产品的Android.mk 或者 系统app定义在/build/make/core.mk .移除对应的PRODUCT_PACKAGES 属性, 就是添加模块的反向操作.

另一种更可维护的方法就是使用替换. aosp 实际上没有编译时删除模块的概念, 实际上使用的是替换

因为版本问题, 以前博客都是使用.mk的形式, 例如 秋少的博客.

不过soong实际上也有类似的功能, 实际上也是填写了LOCAL_OVERRIDES_PACKAGES这个值

在部分模块下, 具有overrides属性, 可以通过这个属性后覆盖替换掉 其他模块.

例子

1
2
3
4
android_app_import {
    # 省略
    overrides: ["Email","Music"]
}

拥有这个属性的主要集中在android 模块, 在源码中主要用于替换apk