从零开始自定义安卓系统(6) 自定义模块 添加系统app


从零开始自定义安卓系统(6) 自定义模块 添加系统app

前言

在之前就知道可以通过PRODUCT_PACKAGES 添加自己的包, 具体操作是 新建一个模块,然后

1
PRODUCT_PACKAGES += 模块名

要定义一个模块 可以使用soong 或者makefile, 在新版本系统推荐使用soong

soong 使用 .bp文件定义模块 参考

从官方例子就可以看到其实格式和json一样简单,

1
2
3
4
5
6
cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

主要问题是找到需要的模块和属性 这个时候就需要格式参考

里面主要根据语言分类, 想做一件事的时候查询对应类型,和对应模块名的格式参考

添加预下载apk

查看android/soong/java类型 看名字就知道 前面两个就是.

android_appandroid_app_import

查阅文档克制区别在于 前者是需要编译的模块 后者是直接导入apk文件

文档提供了一个例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
android_app_import {
	    name: "example_import",
	    apk: "prebuilts/example.apk",
	    dpi_variants: {
	        mdpi: {
	            apk: "prebuilts/example_mdpi.apk",
	        },
	        xhdpi: {
	            apk: "prebuilts/example_xhdpi.apk",
	        },
	    },
	    presigned: true,
}

文档里还提供5行的其他选项, 不过基本都是通用选项, 与app有关的不多 , 看旁边注释就能了解作用

如果要导入一个叫vnc.apk的文件

新建一个目录,放入apk文件,和Android.bp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Android.bp
android_app_import {
    name: "vnc_import",
    apk: "./vnc.apk",
    # 解决可能的签名问题
    dex_preopt: {
       enabled: false,
    },
    presigned: true,
}

然后在bluebird.mk (产品mk文件)添加

1
PRODUCT_PACKAGES += vnc_import

然后编译即可在 system/app 看到 vnc_import目录

如果遇到 mismatch in the <uses-library> tags between the build system and the manifest:

则按提示在 产品文件添加

1
PRODUCT_BROKEN_VERIFY_USES_LIBRARIES := true

或在bp文件添加提示中对应的lib

1
2
3
4
5
android_app_import {
	# 省略
	uses_libs:["lib"],
	optional_uses_libs:["可选lib"]
}