Android 12如何编译so到vendor

在Android开发中,有时候我们需要将自己的so文件编译到vendor目录下,以供系统其他应用或者服务调用。本文将介绍如何在Android 12中实现这一目标,并提供相应的代码示例。

问题背景

在Android 12之前的版本中,我们可以通过在Android.mk文件中添加LOCAL_MODULE_PATH变量来指定so文件的输出路径,例如:

LOCAL_MODULE := mylib
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)

然而,在Android 12中,这种方式不再起作用。因此,我们需要找到一种新的方法来将so文件编译到vendor目录下。

解决方案

Android 12引入了新的Soong构建系统,我们可以通过修改Android.bp文件来实现将so文件编译到vendor目录的目的。下面是具体的解决方案:

  1. 在项目根目录下创建一个vendor目录,用于存放编译后的so文件。

  2. 在项目的Android.bp文件中,添加以下代码:

cc_defaults {
    name: "vendor_defaults",
    vendor_available: true, // 声明该模块只在vendor分区可用
}

cc_library {
    name: "mylib",
    defaults: ["vendor_defaults"],
    vendor_available: true,
    srcs: ["mylib.cpp"],
    shared_libs: [], // 添加依赖库
    target: {
        vendor: {
            enabled: true, // 编译到vendor分区
        },
    },
    // 指定so文件的输出路径为vendor目录
    installable: true,
    relative_install_path: "vendor/lib",
}
  1. 在项目根目录下运行以下命令,编译生成so文件:
$ make
  1. 编译完成后,可以在vendor/lib目录下找到生成的so文件。

代码示例

下面是一个简单的示例代码,用于说明如何编译一个名为mylib的so文件到vendor目录下:

#include <jni.h>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapp_MyClass_getMessage(JNIEnv* env, jobject /* this */) {
    return env->NewStringUTF("Hello from mylib!");
}

效果展示

下面是饼状图,展示了Android 12编译so到vendor的流程:

pie
    title Android 12编译so到vendor流程
    "修改Android.bp文件" : 60
    "运行make命令" : 40

总结

通过修改Android.bp文件,并使用Soong构建系统,我们可以将so文件成功编译到vendor目录下。这样,其他应用或者服务就可以方便地使用这些so文件了。希望本文提供的解决方案对你有所帮助。

参考链接

  • [Android Soong构建系统](