Aosp源码上手指南目录:

  • Android13 源码下载与编译
  • Android13 增加 Product
  • Android13 自定义模块增加
  • Android13 预编译模块增加
  • Android13 App 预装详解

常见的预编译模块有:

  • 现已编译好的 C & CPP 可履行程序
  • 现已编译好的 C & CPP 库
  • 现已编译好的 Java 库即 jar 包
  • 现已编译好的 Android 库即 arr 包
  • 现已编译好的 apk
  • 一些配置文件

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,
}

接下来在 aosp/device/Jelly/Rice14/Rice14.mk 中增加该模块

PRODUCT_PACKAGES += busybox

编译源代码,发动模拟器:

source build/envsetup.sh
lunch Rice14-eng
make -j16
emulator

进入 adb shell,履行 busybox 指令

adb shell
busybox

Android13 预编译模块添加
也能够运用 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 来自 Android13 自定义模块增加 中增加的 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 指令,看是否能正确调用到咱们增加的 so 库

adb shell
mymathmain

履行成果如下图所示:

Android13 预编译模块添加

3. JAR 包

首先咱们把 Android13 自定义模块增加 中增加的 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"],
}

接下来咱们编译体系,并履行 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

履行成果如下

Android13 预编译模块添加

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预装 部分和自定义模块一致解说。

参考资料

  • How to include prebuilt library in Android.bp file?
  • Android体系开发入门-5.增加预编译模块
  • Android.bp 文件中引入aar、jar、so库正确编译办法(值得保藏)
  • 在AOSP中增加jar包和aar包依靠