我们可以在系统源码中添加:
- 已经编译好的 C & CPP 可执行程序
- 已经编译好的 C & CPP 库
- 已经编译好的 Java 库即 jar 包
- 已经编译好的 Android 库即 aar 包
- 已经编译好的 apk
- 配置文件
这些添加到 Android 系统源码中的无需借助源码的编译环境编译就能直接使用的资源我们称之为预编译模块
1. C & CPP 可执行程序
BusyBox 是打包为单个二进制文件的核心 Unix 实用程序的集合。常用于嵌入式设备。
适用于 x86 架构的 busybox 可通过以下命令下载:
wget https://busybox.net/downloads/binaries/1.30.0-i686/busybox
接下来我们把它添加到我们的 aosp 中:
在 device/Jelly/Rice14/
目录下创建如下的目录结构:
prebuilt/
└── busybox
├── Android.bp
└── busybox
busybox 就是我们之前的下载的文件。
其中 Android.bp 的内容如下:
cc_prebuilt_binary {
name: "busybox",
srcs: ["busybox"],
product_specific: true,
}
接下来在 device/Jelly/Rice14/Rice14.mk
中添加该模块
PRODUCT_PACKAGES = busybox
编译源代码,启动模拟器:
source build/envsetup.sh
lunch Rice14-eng
make -j16
emulator
进入 adb shell,执行 busybox 命令
adb shell
busybox
也可以使用 Android.mk 的方式来集成 busybox,将 Android.bp 改为 Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := busybox
LOCAL_MODULE := busybox
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_MODULE_TAGS := optional
//LOCAL_MODULE_PATH := $(TARGET_OUT)/usr/share/
include $(BUILD_PREBUILT)
2. C & CPP 库
在 out/target/product/Rice14/obj/SHARED_LIBRARIES/libmymath_intermediates
目录下找到我们之前添加的自定义模块的编译产物 libmymath.so
在 device/Jelly/Rice14/prebuilt
目录下创建如下的文件与文件夹:
libso/
└── libmymath
├── Android.bp
├── libmymath.so
└── my_math.h
其中 libmymath.so 是上面提到的编译产物。my_math.h 来自 玩转 AOSP 之自定义模块添加 中添加的 libmath2 源码库。
Android.bp 的内容如下:
cc_prebuilt_library_shared {
name: "libmymath",
arch: {
x86_64: {
srcs: ["libmymath.so"],
},
},
export_include_dirs: ["."],
compile_multilib: "64",
product_specific: true,
}
为了避免冲突,我们把上一节添加的 libcpp/libmath
删除。
接下来,编译整个系统,开启虚拟机
source build/envsetup.sh
lunch Rice14-eng
make -j16
emulator
进入 adb shell 环境,执行 mymathmain 命令(mymathmain 引用了 libmymath 库),看是否能正确调用到我们添加的 so 库
adb shell
mymathmain
执行结果如下图所示:
3. JAR 包
首先我们把 玩转 AOSP 之自定义模块添加
中添加的 libtriangle 库的 Android.bp 修改如下:
java_library {
name: "libmytriangle",
installable: false,
product_specific: true,
srcs: ["**/*.java"],
sdk_version: "current"
}
主要是将 installable 的值修改为 false,这样打包出来的 jar 包才能被其他模块正常引用。
接下来编译获得 jar 包:
#device/Jelly/Rice14/libjava/libtriangle 目录下执行
mm
#编译完成后,会打印出编译产物路径
out/target/product/Rice14/obj/JAVA_LIBRARIES/libmytriangle_intermediates/javalib.jar
为避免冲突我们把 device/Jelly/Rice14/libjava/libtriangle
删除
在 libjava 下重新创建如下的目录结构:
libtriangle/
├── Android.bp
└── javalib.jar
其中 javalib.jar
是我们之前添加的自定义模块的编译产物 out/target/product/Rice14/obj/JAVA_LIBRARIES/libmytriangle_intermediates/javalib.jar
Android.bp 的内容如下:
java_import {
name: "libmytriangle",
host_supported: true,
installable: false,
jars: ["javalib.jar"],
product_specific: true,
}
接下来我们编译系统,并执行 trianglemain 模块,用以验证我们的 jar 包是否正确添加到系统中:
确保 trianglemain 模块以添加到 product 中:
#~/aosp/device/Jelly/Rice14/Rice14.mk
PRODUCT_PACKAGES = hello \
libmytriangle \
trianglemain \ #以添加 trianglemain 模块
busybox \
mymathmain
编译系统,并启动模拟器:
source build/envsetup.sh
lunch Rice14-eng
make -j16
emulator
验证trianglemain 模块的执行:
adb shell
export CLASSPATH=/product/framework/trianglemain.jar
app_process /product/framework/ com.yuandaima.main.TriangleMain
执行结果如下
4. 通过 PRODUCT_COPY_FILES 将源码中的文件添加到 Android 文件系统中
PRODUCT_COPY_FILES 常用于产品的配置文件中,在本文中就是 Rice14.mk 文件,用于将源码的文件拷贝到 Android 文件系统中。
这里看一个源码中的示例:
aosp/build/target/product/core_64_bit.mk
中有如下内容:
PRODUCT_COPY_FILES = system/core/rootdir/init.zygote64_32.rc:system/etc/init/hw/init.zygote64_32.rc
这一行表示将源码中的 system/core/rootdir/init.zygote64_32.rc
拷贝到 Android 文件系统的 system/etc/init/hw/init.zygote64_32.rc 文件中。
总结
本文介绍了几种预编译资源如何添加到系统中,是比较偏实操的内容,自己实际操作一遍即可掌握。Android 库,Android app 的添加会放到 Android13 App预装
部分和自定义模块统一讲解。
参考资料
本文出至:学新通技术网
标签: