Android.bp 文件中引入aar、jar、so库正确编译方法(值得收藏)

本文介绍如何在Android项目中引入aar、jar和so库,包括配置步骤及解决常见错误的方法。

 

 

引入 aar

在模块源码根文件下新建文件夹 libs,复制要引入的 arr文件至此,新建 Android.bp

新增如下语句,这里以 lottie.arr 为例

android_library_import {
    name: "lib-lottie",
    aars: ["lottie-2.8.0.aar"],
    sdk_version: "current",
}

然后在模块目录下 Android.bp 文件中的 android_app {} 中 static_libs 引入 “lib-lottie”,

android_app {
    name: "LiveTv",

    srcs: ["src/**/*.java"],

	static_libs: [
		"lib-lottie",
        "android-support-annotations",
        "android-support-compat",
        "android-support-core-ui",
        "androidx.tvprovider_tvprovider",
        "android-support-v4",
		....

这样编译就ok了,如果编译报错,

Error: Compilation can’t be completed because some library classes are missing.

Compilation failed

可以尝试将 “lib-lottie”, 移动到 libs: [] 中再次尝试

如果aar中带资源文件,需要将aar解压拷贝资源文件,不然编译时会提示找不到资源,运行时会报错

解压 lottie-2.8.0.aar,在模块源码根文件夹下新建 res-lottie 文件夹,将资源文件拷贝到此目录

模块目录下 Android.bp 文件中的 resource_dirs: [] 引入

android_app {
    name: "LiveTv",

    srcs: ["src/**/*.java"],
	
 	resource_dirs: [
        "res",
        "res_ext",
        "res-lottie",
    ],

	static_libs: [
		"lib-lottie",
        "android-support-annotations",
        "android-support-compat",
        "android-support-core-ui",
        "androidx.tvprovider_tvprovider",
        "android-support-v4",
		....
	],

	aaptflags: [
        "--extra-packages",
        "com.airbnb.lottie",
    ],

同时增加 aar 对应的包名 aaptflags,以便生成对应包名 R 文件

aaptflags --extra-packages com.airbnb.lottie, 编译时会生成 com.airbnb.lottie.R

多个aar增按照如上操作配置多个即可

引入 jar

在模块源码根文件下新建文件夹 libs,复制要引入的 jar 包至此,新建 Android.bp

新增如下语句,这里以 opencv.jar 为例

java_import {
    name: "face-opencv-jar",
    jars: ["opencv.jar"],
    sdk_version: "current",
}

然后在模块目录下 Android.bp 文件中的 android_app {} 中 libs 引入 “face-opencv-jar”,

android_app {
    name: "LiveTv",

    libs: [
        "telephony-common",
        "mediatek-framework",
        "ims-common",
		"face-opencv-jar",
    ],

这样编译就ok了, jar包相对简单一些

引入 so

在模块源码根文件下新建文件夹 armeabi,复制要引入的 so 至此,在libs中新建 Android.bp

新增如下语句,这里以 libjniopencv_face.so 为例, arm 和 arm64 分别对应32/64的so库,针对源码环境

位数都是确定的,所以我们就写成一样了

cc_prebuilt_library_shared {
    name: "libjniopencv_face",
    arch: {
        arm: {
            srcs: ["armeabi/libjniopencv_face.so"],
        },
        arm64: {
            srcs: ["armeabi/libjniopencv_face.so"],
        },
    },
}

然后在模块目录下 Android.bp 文件中的 android_app {} 中 jni_libs 引入 “libjniopencv_face”,

android_app {
    name: "LiveTv",

     jni_libs: [
        "libjniopencv_face",
	]

]

一个完整的包含 aar/jar/so Android.bp

libs

----Android.bp
----lottie-2.8.0.aar
----face-opencv-jar
----armeabi
	-----libjniopencv_face.so
	-----libopencv_text.so

libs/Android.bp

android_library_import {
    name: "lib-lottie",
    aars: ["lottie-2.8.0.aar"],
    sdk_version: "current",
}

java_import {
    name: "face-opencv-jar",
    jars: ["opencv.jar"],
    sdk_version: "current",
}

cc_prebuilt_library_shared {
    name: "libjniopencv_face",
    arch: {
        arm: {
            srcs: ["armeabi/libjniopencv_face.so"],
        },
        arm64: {
            srcs: ["armeabi/libjniopencv_face.so"],
        },
    },
}

cc_prebuilt_library_shared {
    name: "libopencv_text",
    arch: {
        arm: {
            srcs: ["armeabi/libopencv_text.so"],
        },
        arm64: {
            srcs: ["armeabi/libopencv_text.so"],
        },
    },
}

模块根路径Android.bp


android_app {
    name: "LiveTv",

    srcs: ["src/**/*.java"],

    // TODO(b/122608868) turn proguard back on
    optimize: {
        enabled: false,
    },

    // It is required for com.android.providers.tv.permission.ALL_EPG_DATA
    privileged: true,

    sdk_version: "system_current",
    min_sdk_version: "23", // M

    resource_dirs: [
        "res",
        "material_res",
		"res-lottie",

    ],

    libs: [
		"face-opencv-jar",
	],

    static_libs: [
        "android-support-compat",
        "android-support-core-ui",
        "androidx.tvprovider_tvprovider",
        "android-support-v4",
        "android-support-v7-appcompat",
        "android-support-v7-palette",
        "android-support-v7-preference",
        "android-support-v7-recyclerview",
        "android-support-v14-preference",
        "android-support-v17-leanback",
        "android-support-v17-preference-leanback",
        "lib-lottie",
    ],

	 jni_libs: [
        "libjniopencv_face",
 		"libopencv_text",
	]

    javacflags: [
        "-Xlint:deprecation",
        "-Xlint:unchecked",
    ],

    aaptflags: [
        "--version-name",
        version_name,

        "--version-code",
        version_code,

        "--extra-packages",
        "com.android.tv.tuner",

        "--extra-packages",
        "com.airbnb.lottie",
    ],
}

小技巧

一般需要引入的so库都会是几十个,每一个都需要在Android.bp配置对应的 cc_prebuilt_library_shared

挨个复制会很浪费时间,自信观察格式都是固定的,我们可以通过遍历文件夹来生成这个json串

将所有 so 库文件拷贝至 sdcard/Android/armeabi/,遍历读取文件名,按默认格式写入txt文件即可

private void getSoJson() {
        String fileAbsolutePath = Environment.getExternalStorageDirectory().getPath() + "/Android/armeabi/";
        Log.e("eee", "fileAbsolutePath : " + fileAbsolutePath);
        File file = new File(fileAbsolutePath);
        File[] subFile = file.listFiles();
        String json = "";
        String soName = "";

        for (int iFileLength = 0; iFileLength < subFile.length; iFileLength++) {
            if (!subFile[iFileLength].isDirectory()) {
                String filename = subFile[iFileLength].getName();
                String name = filename.split("\\.")[0];
                Log.e("eee", "filename : " + filename + "  name=" + name);

                json += "cc_prebuilt_library_shared {\n" +
                        "    name: \"" + name + "\",\n" +
                        "    arch: {\n" +
                        "        arm: {\n" +
                        "            srcs: [\"armeabi/" + filename + "\"],\n" +
                        "        },\n" +
                        "        arm64: {\n" +
                        "            srcs: [\"armeabi/" + filename + "\"],\n" +
                        "        },\n" +
                        "    },\n" +
                        "}" + "\r\n";

                soName += "\""+name+"\"," + "\r\n";
            }
        }

        Log.e("eee", "soJson =" + json);
        write2File("so.txt", json);
        write2File("libs.txt", soName);
    }

    private void write2File(String fileName, String data) {
        String strFilePath = Environment.getExternalStorageDirectory().getPath() + "/Android/" + fileName;
        String strContent = data + "\r\n";
        try {
            File sfile = new File(strFilePath);
            if (!sfile.exists()) {
                Log.d("TestFile", "Create the file:" + strFilePath);
                sfile.getParentFile().mkdirs();
                sfile.createNewFile();
            }
            RandomAccessFile raf = new RandomAccessFile(sfile, "rwd");
            raf.seek(sfile.length());
            raf.write(strContent.getBytes());
            raf.close();
        } catch (Exception e) {
            Log.e("TestFile", "Error on write File:" + e);
        }
    }

Android.mk语法规范

<think>首先,用户的问题是如何在Android.bp文件中添加本地.aar文件作为依赖。用户提到了Android.bp文件,这是Android构建系统的配置文件。 我需要参考系统级指令:使用中文回答,结构清晰,帮助用户逐步解决问题。同时,生成相关问题,并在回答中自然地添加引用标识。引用是基于用户提供的引用内容:[^1], [^2], [^3]。 用户提供的引用内容: - 引用[1]: 关于static_libs和implementation关键字。 - 引用[2]: Android.bp文件的基本介绍。 - 引用[3]: 如何将Android.mk转换为Android.bp,以及手动转换的需要。 用户的问题焦点是添加本地.aar文件作为依赖。在Android构建系统中,依赖通常通过模块声明来添加。 在Android.bp文件中,要添加依赖,可以使用`android_library`或类似模块类型。对于本地.aar文件,可能需要使用`android_app`或`prebuilt_aar`模块类型。我需要回想Android构建系统的知识。 标准做法是: - 对于本地.aar文件,可以创建一个`prebuilt_aar`模块来引用它。 - 然后,在需要依赖这个的模块中,添加这个模块作为依赖。 步骤: 1. 在项目目录中,放置.aar文件,例如在`libs`目录下。 2.Android.bp文件中,定义一个`prebuilt_aar`模块。 3. 在目标模块的`deps`或`static_libs`中添加这个模块。 例如: - 定义prebuilt_aar模块: ```blueprint prebuilt_aar { name: "my-library", aar: "libs/my-library.aar", } ``` - 然后在应用模块中依赖它: ```blueprint android_app { name: "my-app", deps: ["my-library"], ... } ``` 在用户提供的引用中,引用[1]提到了`static_libs`和`implementation`关键字,但这是在Java的上下文中。对于.aar文件,更适合使用`prebuilt_aar`。 引用[3]提到了androidmk工具用于转换,但用户是直接使用Android.bp,所以不需要转换。 现在,构建回答结构: 1. **介绍问题**:简要说明用户的问题。 2. **逐步解决方案**: - 步骤1: 放置.aar文件。 - 步骤2: 定义prebuilt_aar模块。 - 步骤3: 在目标模块中添加依赖。 3. **示例代码**:提供Android.bp代码示例。 4. **注意事项**:提醒可能的错误或额外考虑。 5. **生成相关问题**:在最后添加相关问题。 回答中要自然地添加引用标识。例如,当提到Android.bp文件格式时,可以引用[^2];当提到依赖管理时,引用[^1]。 最终回答: - 开头:解释如何添加本地.aar依赖。 - 主体:分步骤说明。 - 结尾:相关问题。 相关问题: 1. 如何添加本地.jar文件作为依赖? 2. Android.bp文件中如何处理多个依赖? 3. 如何将第三方从Maven仓添加到Android.bp? 确保使用中文。</think>### 在Android.bp文件中添加本地.aar文件作为依赖Android构建系统中,Android.bp文件用于定义模块及其依赖关系。要添加本地.aar文件作为依赖,需要创建一个`prebuilt_aar`模块来引用该文件,然后在目标模块(如`android_app`)中通过`deps`或`static_libs`属性添加依赖。以下是逐步解决方案,确保语法正确且易于集成到您的项目中。 #### 步骤1: 放置本地.aar文件 - 将您的.aar文件(例如`mylibrary.aar`)放置在项目目录中,推荐放在`libs/`子目录下以保持结构清晰。 - 示例路径:`<项目根目录>/libs/mylibrary.aar`。如果目录不存在,请手动创建。 #### 步骤2: 在Android.bp中定义`prebuilt_aar`模块 - 使用`prebuilt_aar`模块类型声明.aar文件。这会让构建系统识别并处理该文件。 - 关键属性: - `name`: 为模块指定一个唯一名称(例如`my-aar-lib`),用于在其他模块中引用。 - `aar`: 指定.aar文件的路径(相对于项目根目录)。 - 示例代码: ```blueprint // 定义本地.aar文件的预构建模块 prebuilt_aar { name: "my-aar-lib", // 模块名称,自定义 aar: "libs/mylibrary.aar", // 文件路径 // 可选:添加其他属性,如sdk_version或visibility } ``` - **说明**:`prebuilt_aar`模块是Android构建系统专为处理.aar文件设计的[^2]。它自动解压并集成资源、代码和清单文件。 #### 步骤3: 在目标模块中添加依赖 - 在您的应用或模块(如`android_app`或`android_library`)中,通过`deps`属性引用`prebuilt_aar`模块。 - 如果依赖是静态(即编译时链接),可以使用`static_libs`属性(类似于Java中的`implementation`依赖[^1])。 - 示例代码(假设目标模块是`android_app`): ```blueprint android_app { name: "my-app", // 您的应用模块名称 srcs: ["src/**/*.java"], // 添加.aar依赖 deps: ["my-aar-lib"], // 引用步骤2中定义的模块名称 // 或使用static_libs(如果.aar包含静态) static_libs: ["android.hardware.dumpstate-V1.1-java"], // 示例其他依赖[^1] manifest: "AndroidManifest.xml", } ``` - **说明**:`deps`属性适用于大多数情况,而`static_libs`常用于需要严格编译时依赖的场景。构建系统会自动处理.aar文件中的资源和代码。 #### 完整示例 假设项目结构如下: - 项目根目录 - `libs/mylibrary.aar` - `Android.bp`(包含以下代码) ```blueprint // Android.bp文件 prebuilt_aar { name: "local-aar-dependency", aar: "libs/mylibrary.aar", } android_app { name: "my-sample-app", srcs: ["src/**/*.java"], manifest: "AndroidManifest.xml", deps: ["local-aar-dependency"], // 添加.aar依赖 } ``` #### 注意事项 1. **路径正确性**:确保`aar`属性中的文件路径准确。如果路径错误,构建会失败并提示文件未找到。 2. **模块唯一性**:`name`属性必须在整个Android.bp文件中唯一,避免冲突。 3. **手动转换需求**:如果是从旧版`Android.mk`迁移而来,`prebuilt_aar`无法通过`androidmk`工具自动转换,需手动添加[^3]。 4. **依赖传递**:如果.aar文件本身依赖其他,需在`prebuilt_aar`模块中添加`deps`属性声明这些依赖。 5. **构建命令**:完成修改后,运行`m build`或`make`命令测试构建。常见错误通常是路径或名称拼写错误。 通过以上步骤,您可以无缝集成本地.aar文件Android.bp的模块化设计简化了依赖管理,但需确保语法精确[^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值