安卓源码环境下编译多module app

安卓源码环境下编译多module app

  • 背景
    • apk 源码结构
    • 思路
    • Android.bp编写
      • c++静态库,动态库
      • jar 或 aar
      • 编译apk
    • 将整个目录放到安卓源码下

背景

项目的背景是要将 android studio 下开发的 apk 源码,放到安卓系统源码中进行编译,并随系统版本发布。对于稍复杂一些的 apk,可能存在多模块,这类文章比较少。这里对于这类项目,本文至少可以提供一些实践及思路。

apk 源码结构

一个标准的 Android Studio apk 项目源码结构。

--app
----....//一些项目文件
----module1
------...//一些module文件
------src/main/java
------src/main/res
------src/main/cpp
------src/main/AndroidManifest.xml
----module2
------...//一些module文件
------src/main/java
------src/main/res
------src/main/cpp
------src/main/AndroidManifest.xml
----module3
------...//一些module文件
------src/main/java
------src/main/res
------src/main/cpp
------src/main/AndroidManifest.xml

思路

实际上 Android Studio 使用的 gradle 构建 apk,而安卓源码,使用Soong 构建系统。因此,需要编写 Android.bp 文件,才能将 apk 添加到源码构建过程中进行构建。

因为是在Android Studio中开发维护,尽量保留整体项目的结构,可以通过添加 Make 配置 和 Sonng 配置(.bp) 达到这样的目的。

--app
----Android.mk
----....//一些项目文件
----module1
------Android.bp
------...//一些module文件
------src/main/java
------src/main/res
------src/main/cpp
------src/main/AndroidManifest.xml
----module2
------Android.bp
------...//一些module文件
------src/main/java
------src/main/res
------src/main/cpp
------src/main/AndroidManifest.xml
----module3
------Android.bp
------...//一些module文件
------src/main/java
------src/main/res
------src/main/cpp
------src/main/AndroidManifest.xml

其中根目录的Android.mk很简单

include $(call all-subdir-makefiles)

作用也很简单,就是将当前目录下的所有子目录的 Make 配置(.mk)和 Soong 配置(.bp)全部包含进来。

我们在相应的每个module下,都创建了一个Android.bp,来完成每个 module 的构建工作。Anroid.mk,将他们联合到一起。在不改变目录结构,和原有项目完整性的基础上,通过添加 Android.mk 和 Android.bp,对原有代码无侵入的完成整合。

接下来就是各个module的Android.bp编写,这部分需要根据具体情况来分析,大体介绍几种。

Android.bp编写

Android.bp 文件中的模块以模块类型开头,后跟一组 name: “value”, 格式的属性:

Soong示例

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

这里模块类型是 cc_ilbrary_shared,表明这是一个共享库(.so)的配置。
name即是共享库的名字,成功编译会生成libxmlrpc++.so。
其余配置,可参考文档Android.bp 文件格式。

更详细的文档,具体到每个参数,还是要参考下的:
Soong Modules Reference

c++静态库,动态库

c++静态库,动态库的一个简单例子,libtwo动态库引用libone静态库。
最终生成libone.a ,libtwo.so


cc_library_static{
    name:"libone",
    srcs: ["src/main/cpp/one.cpp"],
    local_include_dirs: ["src/main/cpp"],
    export_include_dirs: ["."],

    sdk_version: "current",
    min_sdk_version: "21",
    cflags: [
        "-Werror",
        "-Wno-error=deprecated-declarations",
        "-Wall",
        "-std=c++11",
        "-frtti",
        "-fexceptions",
        "-Wno-unused-parameter",
    ],
    
    // for including the jni.h file
    header_libs: ["jni_headers"],
}

cc_library_shared{
    name:"libtwo",
    srcs: ["src/main/cpp/two.cpp"],
    local_include_dirs: ["src/main/cpp"],
    export_include_dirs: ["."],

    static_libs: ["libone"],
    shared_libs: ["liblog"],

    sdk_version: "current",
    min_sdk_version: "21",
    cflags: [
        "-Werror",
        "-Wno-error=deprecated-declarations",
        "-Wall",
        "-std=c++11",
        "-frtti",
        "-fexceptions",
        "-Wno-unused-parameter",
    ],
    
    // for including the jni.h file
    header_libs: ["jni_headers"],
}

jar 或 aar

这里以aar为例,且带有aidl资源

android_library {
    name: "libtest",

    srcs: ["src/main/java/**/*.java",
           "src/main/aidl/**/*.aidl"],
    aidl:{
        local_include_dirs: ["src/main/aidl",
                       "src/main/java",
                      ],
    },

    resource_dirs: ["src/main/res"],
    manifest: "src/main/AndroidManifest.xml",

    libs: ["android-support-v7-appcompat"],

    sdk_version: "current",
    min_sdk_version: "21",

    java_version: "1.8",

}

将 aidl 和 java 都参与编译,且将资源文件打包到 aar。
使用 java_library 打包成 jar,但是资源文件无法打包进 jar,没有resource_dirs 选项,这是由 jar 和 aar 的特点决定的,所以需要注意 java_library 和 android_library 在选项上的异同,并不是换个模块类型那么简单。

编译apk

android_app {
    name: "testapp",

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

    resource_dirs: ["src/main/res"],
    manifest: "src/main/AndroidManifest.xml",

    static_libs: ["android-support-v7-appcompat",
           "gson-prebuilt-jar",
          ],
    
    jni_libs:["libtwo"],

    sdk_version: "current",
    min_sdk_version: "21",

    java_version: "1.8",

    certificate: "platform",
}

这里,static_libs 选择依赖的库,包括appcompat和gson,也可以是之前编译的libtest。
jni_libs选择之前编译的动态so,libtwo。会将该so放到 /system/lib/下。

将整个目录放到安卓源码下

找到合适的位置,放置apk源码,同时,找到某个.mk文件,将该目录添加进即可。

PRODUCT_PACKAGES += \
   app

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/608507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图神经网络——GCN,GraphSAGE

1、应用 生物化学:分子指纹识别、药物分子设计、疾病分类等 交通领域:对交通需求的预测、对道路速度的预测 计算机图像处理:目标检测、视觉推理等 自然语言处理:实体关系抽取、关系推理等 2、数据集介绍 CORA数据集由2708篇论文&…

影视极品转场音效大全,经典获奖通用音效素材

一、素材描述 本套音效素材,大小15.02G,16个压缩文件。 二、素材目录 01-华纳兄弟电影音效库合辑(2个压缩文件) 02-影视极品转场音效(2个压缩文件) 03-好莱坞经典综合音效(4个压缩文件&…

线程安全问题、同步代码块、同步方法

线程安全问题就是 用线程同步来解决线程安全问题 同步:一个线程接着一个线程等待执行 同步代码块: 通过锁来解决卖到重复票的问题:卖票问题和存钱取钱问题(见其他两篇文章) 同步方法:

杨辉三角的打印

题目内容: 在屏幕上打印杨辉三角。 思路: 首先我们通过观察发现,每一步的打印都与行列数有关,中间的数据由这一列和上一行的前一列数据控制。所以我们可以使用二维数组进行操作: (1&#xff…

用Rust解决鸡兔同笼问题

目录 一、什么是鸡兔同笼问题? 二、用Rust解决鸡兔同笼问题 三、鸡兔同笼问题在实际生活中的应用有哪些? 一、什么是鸡兔同笼问题? 鸡兔同笼问题是一种古代著名的数学问题,用于训练逻辑思维和解决方程的能力。 鸡兔同笼问题起…

API低代码平台介绍2-最基本的数据查询功能

最基本的数据查询功能 本篇文章我们将介绍如何使用ADI平台定义一个基本的数据查询接口。由于是介绍平台具体功能的第一篇文章,里面会涉及比较多的概念介绍,了解了这些概念有助于您阅读后续的文章。 ADI平台的首页面如下: 1.菜单介绍 1.1 O…

DNS 解析在网络传输中有什么意义?

首先我们先说说什么是DNS解析? DNS解析是将域名解析为对应的IP地址的过程。DNS它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS解析的过程就是寻找哪个IP地址对应你所输入的网址,然后将网页内容返回给用户…

GRS认证的优点和缺点是什么?

GRS认证(Global Recycled Standard)的优点主要体现在以下几个方面: 环保性:GRS认证鼓励和保证产品中使用更多的回收材料,从而减少对原始资源的需求和开采,有助于降低环境负荷,促进资源的循环利用…

案例研究|硬之城借助DataEase以数据驱动供应链精细化管理

深圳硬之城信息技术有限公司(以下简称为“硬之城”)成立于2015年,专注电子元件供应链领域,定位于电子产业供应链与智造平台。硬之城通过名为“Allchips”的集成式服务平台,为客户提供一站式的电子元件采购和供应链管理…

Redis + OpenResty 多级缓存

多级缓存 初识 OpenResty OpenResty - 开源官方站 基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。 具备Nginx的完整功能基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块允…

基士得耶CP 6303c速印机不制版故障检修

故障:基士得耶CP 6303c经常提示版纸卡纸,重设版纸 版纸还没下滚筒,卡在版纸仓里面,手动滚动裁纸刀可以解决,但第二天又是这个毛病; 版纸定位传感器的灵敏度调节一下,然后给机器全面做个清洁大保养,尤其是传…

python中w、r表示什么意思

文件读写就是一种常见的IO操作。 文件读写操作步骤 不同的编程语言读写文件的操作步骤大体都是一样的,都分为以下几个步骤: 1)打开文件,获取文件描述符; 2)操作文件描述符--读/写; 3&#…

电商核心内容揭秘50:个性化广告与投放策略

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 电商技术揭秘四十一:电商平台的营销系统浅析 电商技术揭秘四十二&#…

[MQTT]Mosquitto的內網連接(intranet)和使用者/密碼權限設置

[MQTT | Raspberry Pi]Publish and Subscribe with RSSI Data of Esp32 on Intranet 延續[MQTT]Mosquitto的簡介、安裝與連接測試文章,接著將繼續測試在內網的兩台機器是否也可以完成發佈和訂閱作業。 同一網段的兩台電腦測試: 假設兩台電腦的配置如下: A電腦為發…

沉浸式翻译插件:打破语言障碍的革命性工具

在全球化的今天,语言障碍一直是人们获取信息和沟通的主要难题之一。Immersive Translate(沉浸式翻译)的出现,为这一问题提供了一种创新的解决方案。本文将深入介绍Immersive Translate的功能、使用场景以及它如何帮助用户克服语言…

SpringBoot自动配置源码解析+自定义Spring Boot Starter

SpringBootApplication Spring Boot应用标注 SpringBootApplication 注解的类说明该类是Spring Boot 的主配置类,需要运行该类的main方法进行启动 Spring Boot 应用 SpringBootConfiguration 该注解标注表示标注的类是个配置类 EnableAutoConfiguration 直译&#…

如何控制外部用户访问SAP表的权限

今天搞了一天,我就去找找找啊。我们是IDMC要访问BW的表。 Configure SAP user authorization (informatica.com) 这个informatica上面说要连SAP的数据的话,需要设置这些用户权限。 我也没具体看这两权限对象,这个别人已经设置好了。但是表权…

13 华三三层链路聚和

13 华三三层链路聚和 AI 解析 华三三层静态路由是指在华三交换机上配置的一种路由方式。它通过在交换机上手动配置路由表,将不同网络之间的数据进行转发。 华三三层静态路由的配置步骤如下: 1. 配置交换机接口的IP地址:在交换机上选择要配…

生产者与消费者 PV操作 与 阻塞队列

文章目录 普通方式 wait 与 notifyAll消费者生产者桌子测试类运行结果 阻塞队列Cook生产者Customer消费者测试类 普通方式 wait 与 notifyAll 消费者 package abc;public class Customer extends Thread{Overridepublic void run() {while (true) {synchronized (Desk.lock) {…

如何让加快OpenHarmony编译速度?

OpenHarmony 有两种编译方式,一种是通过 hb 工具编译,一种是通过 build.sh 脚本编译。本文笔者将提升 build.sh 方式编译速度的方法整理如下: 因为笔者只用 build.sh 脚本编译,没用过 hb 工具,好像下面的选项也可以用于…
最新文章