Android系统开发--10.内置预编译模块

在实际的系统开发过程中,有很多文件都是预先编译好的,比如第三方APK, 第三方so库,第三方 bin 文件,一些配置文件等。我们需要在系统编译时能把这些文件打包编译到系统镜像里面。我们有两种方法可以达到我们的目的: BUILD_PREBUILT 和 PRODUCT_COPY_FILES 。

  • 如果这个文件只需要预置到指定目录就可以了,那我们就可以简单的将其加入 PRODUCT_COPY_FILES 变量就行, 比如一些 bin 文件, 配置文件。
  • 如果这个文件有其他模块编译依赖,或者这个文件需要系统签名,那我们就得用 BUILD_PREBUILT 把这个文件声明为一个模块,比如一些 so 库,APK 文件, jar 包等。

1. PRODUCT_COPY_FILES

我们先来学习简单的方式 PRODUCT_COPY_FILES。
PRODUCT_COPY_FILES 变量值可以在 $product.mk 文件里面设置, 在我们这个例子里面是 generic_pure.mk 文件。
但如果我们需要内置的文件很多,全部都写在 $product.mk 里面的话,可能就会很乱。
所以为了维护方便,我们一般把 PRODUCT_COPY_FILES 的设置提取到一个单独的文件。在 $product.mk 里面 include 就行。
下面以内置一个 busybox bin 文件为例子。

1.1 建议 prebuild 目录层级

我们把 prebuild 的文件都放到 device/qiushao/common/prebuild 目录,
prebuild 目录也建立不同层级的目录,放置不同类型的文件:

1
2
3
4
5
6
7
8
prebuild
├── apk # 预置 apk 模块
├── libs # 预置库模块,so 库, jar 包等
├── system # PRODUCT_COPY_FILES 类型预置,按实际输出路径组织
│   └── bin
│   └── busybox-i686
└── vendor # PRODUCT_COPY_FILES 类型预置,按实际输出路径组织
└── lib

1.2 下载 busybox bin 文件

把 busybox 放在 prebuild/system/bin 目录

1
2
cd prebuild/system/bin
wget https://busybox.net/downloads/binaries/1.21.1/busybox-i686

1.3 添加 product_copy_files.mk

在 device/qiushao/generic_pure 目录下新建 product_copy_files.mk 文件,内容如下:

1
2
3
4
5
6
# product copy files

LOCAL_PREBUILD_DIR := device/qiushao/common/prebuild

PRODUCT_COPY_FILES += \
$(LOCAL_PREBUILD_DIR)/system/bin/busybox-i686:system/bin/busybox

然后在 generic_pure.mk 里面include

1
include device/qiushao/generic_pure/product_copy_files.mk

这样就添加完啦,以后只要在 product_copy_files.mk 增加要预置的文件即可。
编译验证一下,发现 adb shell 可以用 busybox 命令了。

2. BUILD_PREBUILT

定义一个预编译模块和一个普通的编译模块格式相似,不同的是 LOCAL_SRC_FILES 变量指定的不是源文件,而是二进制文件的路径,同时还要通过LOCAL_MODULE_CLASS 来指定模块的类型,如果我们需要指定模块的输出路径, 可以通过 LOCAL_MODULE_PATH 变量来指定。最后 include 的是 BUILD_PREBUILT 变量定义的编译文件。
下面是常见模块的写法

2.1 APK 文件

1
2
3
4
5
6
7
8
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := pure.apk
LOCAL_SRC_FILES := device/qiushao/common/prebuild/apk/pure.apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)

2.2 jar 包

1
2
3
4
5
6
7
8
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := pure.jar
LOCAL_SRC_FILES := device/qiushao/common/prebuild/system/framework/pure.jar
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)

2.3 so 库

1
2
3
4
5
6
7
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := pure.so
LOCAL_SRC_FILES := device/qiushao/common/prebuild/vendor/lib/pure.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
include $(BUILD_PREBUILT)