Android.bp详解+入门必备

这篇具有很好参考价值的文章主要介绍了Android.bp详解+入门必备。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android.bp详解+入门必备

一、前言

Android.bp 就是为了用来替换 Android.mk 一个脚本语言文件。

如果学习过Android.mk,在学习一下Android.bp应该是很easy的,如果不是很熟悉可以学习了解一下。

Android.bp和Android.mk作用都是一样的,在系统源码中用来编译出类库.jar,应用文件.apk,动态库.so,静态库.a作用。其中关键的就是模块类型定义和不同的属性定义。

Android.bp文件用类似json的简洁声明来描述需要构建的模块。

Android.bp文件是Android 7.0及更高版本中引入的一种构建脚本文件,用于描述和管理项目的编译过程。

Android.bp文件是使用Starlark语法编写的,它是一种基于Python的轻量级脚本语言。

Android.bp文件用于定义模块和构建规则,与之前的Android.mk文件相比,更加灵活和易于维护。

对Android.mk-入门必备的详细介绍:

https://blog.csdn.net/wenzhi20102321/article/details/135631544

二、Android.bp 文件模版

1、编译.jar包

java_library {
    name: "mylibrary",
    srcs: ["src/**/*.java"],
    static_libs: ["lib1", "lib2"],
    javac_flags: ["-source 1.8", "-target 1.8"],
    aaptflags: ["--auto-add-overlay"],
    manifest: "AndroidManifest.xml",
    resource_dirs: ["res"],
    dex_preopt: {
        enabled: true,
    },
    dex_preopt_config: "dexpreopt.config",
    dex_preopt_uses_art: true,
    dex_preopt_omit_shared_libs: true,
    optional: true,
}

2、编译apk

(1)以apk编译apk?

就是给普通apk加上系统签名变成系统apk的作用。

从最新的Android13 源码看bp文件未看到与mk文件对应的编译类型。

具体可以查看:Android.mk 与 Android.bp 属性转换对应字符串关系文件:

release\build\soong\androidmk\androidmk\android.go

下面是bp文件中编译模块类型定义

//mk和bp文件编译类型对应关系
var moduleTypes = map[string]string{
    "BUILD_SHARED_LIBRARY":        "cc_library_shared",
    "BUILD_STATIC_LIBRARY":        "cc_library_static",
    "BUILD_HOST_SHARED_LIBRARY":   "cc_library_host_shared",
    "BUILD_HOST_STATIC_LIBRARY":   "cc_library_host_static",
    "BUILD_HEADER_LIBRARY":        "cc_library_headers",
    "BUILD_EXECUTABLE":            "cc_binary",
    "BUILD_HOST_EXECUTABLE":       "cc_binary_host",
    "BUILD_NATIVE_TEST":           "cc_test",
    "BUILD_HOST_NATIVE_TEST":      "cc_test_host",
    "BUILD_NATIVE_BENCHMARK":      "cc_benchmark",
    "BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host",

    "BUILD_JAVA_LIBRARY":             "java_library_installable", // will be rewritten to java_library by bpfix
    "BUILD_STATIC_JAVA_LIBRARY":      "java_library",
    "BUILD_HOST_JAVA_LIBRARY":        "java_library_host",
    "BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
    "BUILD_PACKAGE":                  "android_app",
    "BUILD_RRO_PACKAGE":              "runtime_resource_overlay",

    "BUILD_CTS_EXECUTABLE":          "cc_binary",               // will be further massaged by bpfix depending on the output path
    "BUILD_CTS_SUPPORT_PACKAGE":     "cts_support_package",     // will be rewritten to android_test by bpfix
    "BUILD_CTS_PACKAGE":             "cts_package",             // will be rewritten to android_test by bpfix
    "BUILD_CTS_TARGET_JAVA_LIBRARY": "cts_target_java_library", // will be rewritten to java_library by bpfix
    "BUILD_CTS_HOST_JAVA_LIBRARY":   "cts_host_java_library",   // will be rewritten to java_library_host by bpfix
}

//预编译部分
var prebuiltTypes = map[string]string{
    "SHARED_LIBRARIES": "cc_prebuilt_library_shared",
    "STATIC_LIBRARIES": "cc_prebuilt_library_static",
    "EXECUTABLES":      "cc_prebuilt_binary",
    "JAVA_LIBRARIES":   "java_import",
    "APPS":             "android_app_import",
    "ETC":              "prebuilt_etc",
}

前面是Android.mk中的编译类型定义,右边是Android.bp中编译模块类型的定义。

这个功能Android.mk用到 BUILD_PREBUILT 类型,在这里未查询到可以替换的类型。

通过一定的摸索发现Android.bp可以使用 “android_app_import” 这个关键字的类型进行预编译apk。

编译代码示例:

android_app_import {
    name: "FileManager",
    apk: "FileManager.apk",
    privileged: true,
    //使用系统签名
    certificate: "platform",
    //不用覆盖签名,使用原本打包的签名,和上面的只能2选一
    //presigned:true, 

}
(2)以java源码编译apk
android_app {
    name: "myapp",
    srcs: [
        "path/to/your/app/src/**/*.java",
    ],
    resource_dirs: [
        "path/to/your/app/res",
    ],
    manifest: "path/to/your/app/AndroidManifest.xml",
    
    //加载类库
    static_libs: [
        "mylibrary",
    ],
    
    //是否系统签名
    certificate: "platform",
    platform_apis: true,
    //是否生成到priv-app目录
    privileged: true,
    
}

3、编译动态库.so

cc_library_shared {
    name: "mylibrary",
    srcs: [
        "path/to/your/library.c",
    ],
    shared_libs: [
        "lib1",
        "lib2",
    ],
    include_dirs: [
        "path/to/your/include",
    ],
    export_include_dirs: [
        "path/to/your/export_include",
    ],
    target: {
        android: {
            shared_libs: [
                "lib3",
                "lib4",
            ],
        },
    },
}

上述示例中,定义了一个名为"mylibrary"的cc_library_shared模块,它包含了要编译的动态库源文件(library.c)。

使用srcs属性指定源文件的路径。

使用shared_libs属性指定该动态库依赖的其他动态库(lib1、lib2)。这些依赖的库可以是系统库或其他自定义库。

使用include_dirs属性指定用于编译的头文件目录的路径。

使用export_include_dirs属性指定用于在其他模块中使用该库时所需的头文件目录的路径。

通过target.android.shared_libs属性指定在Android平台上链接该库时所需的其他系统库(lib3、lib4)。

请根据您的实际项目路径和配置需求,修改和配置相关路径和属性,确保与您的项目一致。

4、编译静态库.a

cc_library_static {
    name: "mylibrary",
    srcs: [
        "path/to/your/library.c",
    ],
    include_dirs: [
        "path/to/your/include",
    ],
    export_include_dirs: [
        "path/to/your/export_include",
    ],
}

上述示例中,定义了一个名为"mylibrary"的cc_library_static模块,它包含了要编译的静态库源文件(library.c)。

使用srcs属性指定源文件的路径。

使用include_dirs属性指定用于编译的头文件目录的路径。

使用export_include_dirs属性指定用于在其他模块中使用该库时所需的头文件目录的路径。

请根据您的实际项目路径和配置需求,修改和配置相关路径和属性,确保与您的项目一致。

5、Android.mk 编译文件小结

编译模版:

BuildType { //(1)编译类型
    name: "mylibrary", // (2)模块名称
    srcs: [
        "path/XXX", //(2)编译的源码
    ],
    //根据类型设置不同的属性和不同的值
}

BuildType2 { //(1)编译类型
    name: "mylibrary2", // (2)模块名称
    srcs: [
        "path/XXX", //(2)编译的源码
    ],
}
。。。//同一个bp文件可以编译多个模块。

所有的Android.bp都是基于上面的模版进行适配的。

编译某个类型模块,中间添加属性定义和相关值即可,属性的设置使用就是冒号 “:”,

代码注释,同Java代码一样,使用// 或者 /** 注释 **/ 表示注释标识的。

在实际的bp文件中可能有几百行,这一般是多个模块编译的情况,

不用头晕,只看自己相关模块那段代码,

每个模块都有一个模块名称 name,找到开始和结束的部分适配修改即可。

编译类型的BuildType总结:

编码类型和Android.mk和Android.bp中对应的关键字
1、apk文件,mk:BUILD_PREBUILT,bp:android_app_import(与之前不是对应关系!)
2、app代码,mk:BUILD_PACKAGE,bp:android_app
3、动态库,mk:BUILD_SHARED_LIBRARY,bp:cc_library_shared
4、静态库,mk:BUILD_STATIC_LIBRARY,bp:cc_library_static
5、代码编译成Jar包,mk:BUILD_JAVA_LIBRARY,bp:java_library_installable
6、jar包编译到系统,mk:BUILD_MULTI_PREBUILT,bp:java_import(与之前不是对应关系!)

其他的编译类型可以看android.go文件查看。

Android系统源码编译Android.bp文件方式:

(1)在源码release目录,输入 make -j64 “name名称”

(2) cd 到Android.bp模块目录,输入"mm"

三、Android.bp 具体示例


//(1)预编译jar包,加载jar包
java_import {
  name: "libs",
  jars: ["app/libs/rxjava.jar", "app/libs/rxandroid.jar"","app/libs/zxing.jar"],
}


android_app {

    name: "SkgSettings",
    platform_apis: true,
    privileged: true,

    kotlincflags: ["-Xjvm-default=enable"],
    optimize: {
        proguard_flags_files: ["app/src/main/proguard.flags"],
    },



    libs: [
       // Soong fails to automatically add this dependency because all the
       // *.kt sources are inside a filegroup.
       "kotlin-annotations",
    ],

    static_libs: [
        "androidx.appcompat_appcompat",
        "kotlin-stdlib",
        "libs",
    ],

    manifest: "app/src/main/AndroidManifest.xml",

    srcs: ["app/src/main/java/**/*.java",
           "app/src/main/java/**/*.kt",
       "SystemUpdaterSDK/src/main/java/**/*.java",
       "SystemUpdaterSDK/src/main/aidl/**/*.aidl"],
    aidl: {
        local_include_dirs: ["SystemUpdaterSDK/src/main/aidl/"],
    },
    resource_dirs: ["app/src/main/res"],

}

四、Android.bp 主要属性

以下是一些常见的预定义属性(以下没有定义模块属性):

1、name:定义模块的名称,通常是唯一标识符。

name: "my_module",

2、 srcs:指定模块的源文件,可以是一个文件列表。

srcs: ["file1.java", "file2.java"],

3、deps:指定模块的依赖关系,即依赖于其他模块的模块列表。

deps: ["dependency_module1", "dependency_module2"],

4、visibility:指定模块的可见性,确定哪些模块可以访问它。

visibility: ["//my/module:visible_module"],

5、cflags、cppflags、ldflags:用于指定C/C++编译和链接的标志。

cflags: ["-Wall", "-O2"],
cppflags: ["-DDEBUG"],
ldflags: ["-L/path/to/lib", "-lmylib"],

6、shared_libs、static_libs:指定模块的动态链接库和静态链接库的依赖关系。

shared_libs: ["lib1", "lib2"],  //编译依赖的动态库lib1和lib2
static_libs: ["lib3", "lib4"],  //编译依赖的静态库lib3和lib4

7、host_supported、device_supported:指定模块是否支持主机构建和目标设备构建。

host_supported: true,
device_supported: true,

8、installable:指定模块是否可以被安装到系统镜像中。

installable: true,

9、product_specific: 指定编译出来放在/product/目录下(默认是放在/system目录下)

product_specific: true

10、vendor: 指定编译出来放在/vendor/目录下(默认是放在/system目录下)

vendor: true, 

这些是Android.bp文件中一些常见的预制属性。每个属性用于不同的目的,开发者可以根据模块的类型和需求来使用它们。此外,Android构建系统还支持许多其他属性,这些属性可以根据具体的构建任务和模块类型进行自定义。

有关更多属性和其详细说明,请参阅Android构建系统的官方文档:

https://source.android.google.cn/docs/setup/build?hl=zh-cn

五、总结

1、Android.bp 的简单使用总结

BuildType { //(1)编译类型
    name: "mylibrary", // (2)模块名称
    srcs: [
        "path/XXX", //(2)编译的源码
    ],
    //根据类型设置不同的属性和不同的值
}

关键就是编译类型的确定和各属性的定义。

注释使用和Java代码一样,使用双斜线//或者/** 注释**/

2、Android.bp 详解

下面是Android.bp一些比较官方的介绍,有兴趣可以详情看看。

Android.bp文件是Android 7.0及更高版本中引入的一种构建脚本文件,用于描述和管理项目的编译过程。下面是Android.bp文件的一些详解:

概述:Android.bp文件是使用Starlark语法编写的,它是一种基于Python的轻量级脚本语言。Android.bp文件用于定义模块和构建规则,与之前的Android.mk文件相比,更加灵活和易于维护。

模块定义:Android.bp文件中可以定义多个模块,每个模块都有一个唯一的模块名。模块可以是可执行文件、静态库、共享库等。通过cc_library、cc_binary等函数来定义模块。

源文件定义:Android.bp文件中使用srcs参数来指定模块的源文件。可以使用通配符来匹配多个文件,如[“*.cpp”]表示所有的cpp文件。

编译选项:Android.bp文件中可以指定编译选项,如指定编译器、编译标志等。通过cflags、cppflags、ldflags等参数来设置。

依赖关系:Android.bp文件中可以指定模块的依赖关系,即一个模块依赖于其他模块。通过shared_libs、static_libs等参数来指定依赖的共享库或静态库。

目标文件生成:Android.bp文件中可以指定生成的目标文件的名称和路径。通过name、installable等参数来设置。

其他功能:Android.bp文件还支持其他一些功能,如指定需要编译的源文件、排除某些源文件、指定编译器、链接器等。可以通过查阅Android.bp文件的官方文档或相关教程来了解更多功能和用法。

总之,Android.bp文件是Android 7.0及更高版本中引入的一种构建脚本文件,用于管理项目的编译过程。通过编写Android.bp文件,可以定义模块的编译选项、依赖关系和生成的目标文件等。这样可以更灵活地管理和组织项目的代码和资源。

3、Android.bp的其他知识

(1)Android所有bp属性和mk属性的对照关系完整文件:

系统源码目录:build/soong/androidmk/androidmk/android.go

http://aospxref.com/android-13.0.0_r3/xref/build/soong/androidmk/androidmk/android.go

(2)Android.bp文件编译的模块类型和属性定义字符串都是大写的

Android.mk 文件编译的模块类型和属性定义都是大写的。

示例对比如下:

//Android.mk 示例
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
# 设置模块名或者apk名称
LOCAL_MODULE := mylibrary
#根据类型设置不同的属性和不同的值
...

//Android.bp 示例
BuildType { //(1)编译类型
    name: "mylibrary", // (2)模块名称
    srcs: [
        "path/XXX", //(2)编译的源码
    ],
    ...//根据类型设置不同的属性和不同的值
}


(3)其他

总的来说,这是一篇Android.bp入门级别和相关内容比较全面介绍。

具体的开发中,可能比上面的复杂,比如动态库的编译那些差别是很大的。

之前编译复杂的动态库,依赖的东西太多,会出现非常多问题,

可能会用到一些不常用的属性,并且有些属性在网上也查不到,官方也没有介绍!

如果是系统源码编译出现这个情况,可以全局搜索整个系统的代码,可以参考其他模块使用这个属性的具体定义和值。比如上面的预编译apk的情况,百度和普通搜索可能是无法搜索到相关内容的,通过关键字全局搜索package目录下的代码,就能找到相关类型和具体参数设置使用进行参考。文章来源地址https://www.toymoban.com/news/detail-836776.html

到了这里,关于Android.bp详解+入门必备的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 开发必备知识点及面试题汇总(Android+Java+算法+性能优化+四大组件……),腾讯安卓开发面试

    5.请介绍下 AsyncTask的内部实现,适用的场景是 AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来 执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务, 比如 HTTP 请求,大规模的下载和数据库的更改不

    2024年04月15日
    浏览(65)
  • Android NDK开发详解之调试和性能分析的系统跟踪概览

    “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件,该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍,请参阅 Perfetto 文档中的跟踪 101 页面。 Android 平台提供了多种不同的跟踪记

    2024年02月06日
    浏览(52)
  • android多屏触摸相关的详解方案-安卓framework开发手机车载车机系统开发课程

    直播免费视频课程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/ 在做双屏相关需求开发过程中,经常会有对两个屏幕都要求可以正确触摸的场景。但是目前我们模拟器默认创建的双屏其实是没有办法进行触摸的 静态修改方案 使用命令查看display2即副屏的信息情况 adb shell dumpsys d

    2024年02月11日
    浏览(52)
  • Android车载应用系统开发入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

    众所周知,国内的安卓市场内卷极其严重,原生应用开发可谓是寸步难行,但整个Android生态却无比繁荣,手机、平板、电视、音视频等等,特别是在智能汽车+电动汽车的浪潮下,车载行业成为许多Android人竞相奔走的行业, 薪资待遇以及岗位招聘呈上涨趋势 。 对于涉事多年

    2024年02月09日
    浏览(61)
  • 2020最新统计,年薪50万+的Android开发者所必备的知识体系架构,你都会吗?

    JVM JavaIO 注解 序列化 这块知识是现今使用者最多的,我们称之为Android2013~2016年的技术,但是,即使是这样的技术,Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码熟悉而又陌生。 职业生涯规划 面向Android中的一切实体(高级UI+FrameWork源码) 实体

    2023年04月19日
    浏览(80)
  • 【Linux系统基础快速入门详解】SSH远程连接必备网络基础知识详解

    鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) SSH(Secure Shell)是一种网络协议,用于通过加密的方式在不安全的网络上安全地进行远程连接和数据传输。下面是对SSH远程连接的必备

    2024年02月07日
    浏览(68)
  • 【Android.bp介绍】

    Android.bp 文件首先是 Android 系统的一种编译配置文件。 Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环 等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。 在 Android7.0 以前,Android 都是使用 make 来组

    2024年02月06日
    浏览(42)
  • Android.bp文件说明

    一、说明 Android.bp是安卓系统,Soong构建系统使用的配置文件。具体描述可以查看官方描述; 关于Soong也可以看下这篇网上的文章; 这里关于Android.bp文件的说明谷歌官方给出参考,仅用于快速查看,没有进行翻译,详细可以查看对应的参考文档; 二、Android.bp文件说明 1. Wal

    2024年02月13日
    浏览(37)
  • android bp脚本

    一。android大约从7.0开始引入 .bp文件代替以前的.mk文件,用于帮助android项目的编译配置文件。 二。mk文件转化为bp文件,可以使用下面命令转化,注意命令中,这是写入文件。androidmk是android源码自带的工具,他可以显示mk转换后的bp,后面是写入Android.bp  androidmk Android.mk Andr

    2024年02月12日
    浏览(36)
  • Android之Android.bp文件格式语法(一百八十六)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 优质专栏: 多媒体系统工程师系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径

    2024年02月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包