将Android Studio创建的一个apk工程放到Android15源码中构建

背景描述:

起初Android Studio创建的apk工程,为了方便系统版本发布和后期维护需要同时支持两种构建方式:

  • Android Studio Gradle构建       IDE界面环境,对习惯java环境变成的友好、UI设计方便看效果
  • Android15系统构建时自动构建 Soong构建   这种构建apk源码放在aosp系统源码中,作为一个普通的module来进行编译构建。对于平时中心在系统集成的同学友好,对版本管理也方便。

由于Android Studio创建的app工程有固定的文件结构,和Soong构建时文件结构组织会有些差异,所以做两套构建系统的兼容,主要从以下几个方面进行:

  1. 调整apk源码的目录结构,兼容Gradle构建和Soong构建
  2. 添加Soong构建相关的脚本
  3. 调整apk源码文件(包括ui相关脚本、res文件等), 使兼容Gradle构建和Soong构建

下面以具体例子来讲解自己是如何实现Androd Studio创建的CameraDemo.apk同时支持:

  • Windows11 Android Studio构建
  • Linux ubuntu aosp源码构建

1.Android Studio创建的CameraDemo Project

Android Studio创建一个新的工程,工程名为camerademo, 创建完成的工程文件结构如下:

├── app
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro              
│   └── src
│       ├── androidTest/java/com/example/camerademo //测试程序目录
│       ├── main
│       │   ├── AndroidManifest.xml                 //声明camerademo所需权限等内容
│       │   ├── java/com/example/camerademo         //camerademo程序源码.java目录
│       │   └── res                                 //camerademo程序资源文件(ui, layout等)目录
│       └── test/java/com/example/camerademo        //test程序目录
├── build.gradle                                    //下边是gralde构建相关的脚本文件
├── gradle                              
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle

2.调整CameraDemo目录结构,兼容Soong构建

Soong编译的模块,构建目录结构如下:

aosp/vendor/amlogic/package/camerademo/
├── Android.bp                            //camerademo soong构建的脚本
├── AndroidManifest.xml                   //声明camerademo应用所需的权限和Activity
├── res                                   //camerademo应用资源文件
└── src/com/example/android/camera2demo/  //camerademo应用程序代码目录

 基于上边Android Studio创建的camerademo工程,修改出兼容上边Soong编译模块目录结构, 修改后的兼容结构如下:

├── app
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro              
│   └── src
│       ├── androidTest/java/com/example/camerademo //测试程序目录
│       ├── main
│       │   ├── AndroidManifest.xml                 //【gradle构建】声明camerademo所需权限等内容
│       │   ├── java/com/example/camerademo         //【gradle/soong构建】camerademo程序源码.java目录
│       │   └── res                                 //【gradle/soong构建】camerademo程序资源文件(ui, layout等)目录
│       └── test/java/com/example/camerademo        //test程序目录
├── build.gradle                                    //下边是gralde构建相关的脚本文件
├── gradle                              
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
├── settings.gradle
├── Android.bp                                     //【soong构建】构建配置脚本
├── AndroidManifest.xml                            //【soong构建】声明camerademo所需权限、Activity等
├── CleanSpec.mk                                   //【soong构建】make clean脚本  
├── src
│   └── com -> ../app/src/main/java/com/           //【soong构建】实现源码文件的软连接
├── res -> app/src/main/res                        //【soong构建】实现资源文件的软连接
└── keys                                           //【soong构建】签名证书文件├── com.example.camerademo.avbpubkey├── com.example.camerademo.pem├── camerademo.jks├── camerademo.p12├── camerademo.pk8└── camerademo.x509.pem                                    

如上,camerademo project为了兼容soong构建,添加了6个文件:

  • Android.bp 配置camerademo构建参数
  • AndroidManifest.xml 声明camerademo权限等内容
  • src/com和res 这两个软链接使soong构建和gradle构建时src(源文件、资源文件)是同一份,后期维护修改只针对一份代码。
  • keys 目录存放的是soong构建系统进行apk打包签名时用到的文件。

3.添加CameraDemo到Soong构建系统

将CameraDemo添加到aosp源码构建系统需要加两个内容:

  1. 将camerademo添加到系统镜像(注意:非prebuild构建)
  2. 添加camerademo的构建脚本,即Android.bp

添加到系统镜像

假设,我们是基于amlogic/yukawa构建系统镜像。

#当前文件:android/device/amlogic/yukawa/device-yukawa.mk
#在设备mk文件中添加:PRODUCT_PACKAGES += CameraDemo

如果之前镜像打包的时候已经带CameraDemo并且是prebuilt构建的,则需要从预构建列表中去掉对应的预构建配置:

camerademo soong构建之Android.bp

 对应camerademo工程目录中的./Android.bp文件:

//
// Copyright (C) 2013 Google Inc.
//package {// See: http://go/android-license-faqdefault_applicable_licenses: ["Android-Apache-2.0",],
}apex_key {name: "com.example.camera2demo.key",public_key: "keys/com.example.camerademo.avbpubkey",private_key: "keys/com.example.camerademo.pem",
}android_app_certificate {name: "com.example.camerademo.certificate",certificate: "keys/vk",
}apex_defaults {name: "com.example.camerademo.apex-defaults",key: "com.example.camerademo.key",certificate: ":com.example.camerademo.certificate",
}android_app {name: "CameraDemo",sdk_version: "current",manifest: "AndroidManifest.xml",optimize: {enabled: true,},defaults: ["com.example.camerademo.apex-defaults"],privileged: true,static_libs: ["androidx.appcompat_appcompat","com.google.android.material_material","androidx.legacy_legacy-support-v13","androidx.legacy_legacy-support-v4","androidx.core_core","android-ex-camera2-portability","xmp_toolkit","glide","guava","jsr305",],srcs: ["src/**/*.java",],resource_dirs: ["res",],product_specific: true,
}

camerademo soong构建之AndroidManifest.xml

对应camerademo工程目录中的./AndroidManifest.xml文件, 是从Android Studio构建使用的AndroidManifest.xml文件拿过来的:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.camera2demo"><uses-feature android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/Theme.AppCompat"><activityandroid:name=".MainActivity"android:exported="true"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

4.为CameraDemo添加签名配置

为了让soong构建的camerademo是签名后的.apk,需要为camerademo添加签名:

  1. 制作camerademo签名使用的密钥库文件
  2. camerademo构建脚本中添加签名配置

制作camerademo应用签名的密钥文件

有两种方法生成.jks文件:

  1. 使用Android Studio,通过界面配置生成.jks
  2. 使用jdk keytool命令行工具,生成.jks

方法1.使用Android Studio生成

注:根据自己需要配置好key,点击next选择应用的apk版本为debug或者relase。这是会生成一个.jks文件。

方法2.使用keytool命令行工具生成.jks

keytool工具是jdk自带的命令行工具,所以需要先配置好jdk环境。

$keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

参数说明:

  • -keystore:指定生成的.jks文件名
  • -alias:密钥别名(后续签名会用到)
  • -keyalg:密钥算法(推荐RSA)
  • -keysize:密钥大小(推荐2048)
  • -validity:有效期天数(单位:天)

执行后会提示输入密钥库密码、密钥密码以及一些个人信息。

将JKS转换成soong构建系统需要的格式

使用keytool和openssl将JKS转换为Android构建系统需要的格式:

##进入证书目录
#cd vendor/google/packages/apps/camerademo/keys##从JKS导出P12格式
#keytools -importkeystore \-srckeystore camerademo.jsk \-destkeystore camerademo.p12 \-deststoretype PKCS12##导出证书(PEM格式)
#openssl pkcs12 -in camerademo.p12 -nokeys -out camerademo.x509.pem##导出私钥(PKCS8格式)
#openssl pkcs12 -in camerademo.p12 -nodes -nocerts \| openssl pkcs8 -topk8 -outform DER -out camerademo.pk8 -nocrypt

 生成如下文件:

keys/├── camerademo.jks        # 原始文件├── camerademo.x509.pem   # 证书文件└── camerademo.pk8        # 私钥文件

camerademo构建脚本中添加签名配置

 即如上Android.bp中的如下内容:

5.aosp源码方式编译CameraDemo

$cd android
$source build/envsetup.sh
$lunch xx-userdebug
$make camerademo
##或者
$cd /vendor/amlogic/package/camerademo
$mm

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolo8目标检测+训练(识别和平精英人物)

✅步骤一&#xff1a;安装 PyTorch&#xff08;M1 专用&#xff09;# 推荐使用官方 MPS 后端&#xff08;Apple Metal 加速&#xff09; pip install torch torchvision torchaudio确认是否使用了 Apple MPS&#xff1a;import torch print(torch.backends.mps.is_available()…

【ArcGISPro】修改conda虚拟安装包路径

问题在ArcGISPro中经常使用克隆&#xff0c;导致C盘默认虚拟安装包内存越来越大&#xff0c;导致电脑很卡解决方案打开ArcGISPro所在conda文件夹D:\Program Files\ArcGIS\Pro\bin\Python\Scripts打开命令行工具&#xff08;如 CMD 或终端&#xff09;。输入以下命令&#xff0c…

三格电子—西门子PLC串口转网口模块

一、功能概述本文档是西门子PLC串口转以太网系列产品&#xff0c;包含SG-S7-200-ETH、S7-200-ETH(2P)&#xff0c;SG-S7-300-ETH&#xff0c;SG-S7-300-ETH(2P)共四个产品。使用框图如下图所示意。1.1 产品功能本系列产品用来给西门子S7-200/300 PLC串口扩展出网口来&#xff0…

Python—requests模块

Python requests 模块代码演示 requests 是 Python 中一个简单易用的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一些常见的使用示例&#xff1a; 1. 基本 GET 请求 import requests# 发送 GET 请求 response requests.get(https://api.github.com)# 检查请求是否成功…

华为仓颉编程语言语法简介与示例

华为仓颉编程语言语法简介与示例 仓颉编程语言是华为自主研发的新一代通用编程语言&#xff0c;由南京大学冯新宇教授团队主导设计&#xff0c;于 2024 年华为开发者大会&#xff08;HDC&#xff09;正式发布&#xff0c;并在 2025 年 7 月推出首个长期支持版本&#xff08;LTS…

触发器的创建

- 建立product表&#xff0c;操作方式operate表要求1.定义触发器实现在产品表(product)中每多一个产品,就在操作表(operate)中记录操作方式和时间以及编号记录。注&#xff1a;操作说明&#xff1a;标记执行delete 、insert、update2.定义触发器实现在产品表(product)中每更新一…

论文略读: RASA: RANK-SHARING LOW-RANK ADAPTATION

ICLR 2025尽管 LoRA 有诸多优势&#xff0c;但近期研究表明&#xff0c;它在大规模训练数据集和复杂任务&#xff08;如数学推理和代码生成&#xff09;中&#xff0c;仍然落后于全参数微调&#xff08;FFT&#xff09;一个合理的解释是&#xff1a;低秩约束限制了 LoRA 的表达…

VSCode - VSCode 查找中文字符

VSCode 查找中文字符 1、查找中文字符使用快捷键 Ctrl F 打开查找框点击正则表达式按钮 .*在搜索框中输入 [\u4e00-\u9fa5]&#xff0c;这个范围涵盖了基本的中文字符2、查找中文字符串使用快捷键 Ctrl F 打开查找框点击正则表达式按钮 .*在搜索框中输入 [\u4e00-\u9fa5]&a…

SQL基础操作指南:增删改查入门

前言 在日常数据库操作中&#xff0c;掌握增删查改是每个开发者必备的技能。下面我将通过实例解析SQL的核心操作要点&#xff0c;帮你避开常见陷阱。一、新增数据&#xff08;INSERT&#xff09; 单行插入&#xff1a;明确指定字段和值 INSERT INTO 表名(字段1, 字段2) VALUES …

Linux系统安装Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南

前言&#xff1a;在应用项目部署中&#xff0c;“环境不一致”往往是开发与运维的痛点——本地能跑的代码到了服务器就报错&#xff0c;依赖版本、系统配置差异都可能成为隐患。而Docker的容器化技术恰好能解决这一问题&#xff0c;通过“一次构建&#xff0c;到处运行”的特性…

python的多线程无法并行只能并发,why?

标题python的多线程无法并行只能并发&#xff0c;why&#xff1f;python的多线程无法并行只能并发&#xff0c;why&#xff1f; 在 Python 中&#xff0c;特别是使用 CPython 解释器时&#xff0c;由于存在 全局解释器锁&#xff08;GIL&#xff09;&#xff0c;即使在多核处理…

Kotlin比较接口

在 Kotlin 中&#xff0c;Comparable 和 Comparator 是两个允许开发者对相同或不同类的对象进行比较的接口。这两个接口通常用于基于一个或多个属性对对象集合进行排序与排序操作。本文将概述 Kotlin 的 Comparable 和 Comparator 接口&#xff0c;解释它们的用法&#xff0c;并…

day41 简单CNN

DAY 41 首先回顾下昨天的代码。 # import torch # import torch.nn as nn # import torch.optim as optim # from torchvision import datasets, transforms # from torch.utils.data import DataLoader # import matplotlib.pyplot as plt # import numpy as np# # 设置中文字…

[实战]巴特沃斯滤波器全流程解析:从数学原理到硬件实现

巴特沃斯滤波器全流程解析&#xff1a;从数学原理到硬件实现 文章目录巴特沃斯滤波器全流程解析&#xff1a;从数学原理到硬件实现1. 数学原理2. 工程实现梯形网络结构3. Python理论仿真4. 硬件仿真与PCB考虑5. 完整设计工具6. 输出结果示例7. 设计注意事项巴特沃斯滤波器是特别…

《机器学习数学基础》补充资料:标准差与标准化

1 标准差 我们经常使用平均数来大致了解一组数据&#xff0c;例如平均成绩、平均身高、平均寿命等等。但是如果只看平均数&#xff0c;不一定能充分了解整体情况。比如说你和某首富住同一个社区&#xff0c;你们社区平均每户年收入两千万&#xff0c;那么你家是有钱还是没钱&am…

深度学习 | 多类交叉熵(Categorical Cross Entropy)详解 + Python实现

在多分类任务中&#xff0c;模型输出一个概率分布&#xff0c;常用的损失函数是 Categorical Cross Entropy&#xff08;多类交叉熵&#xff09;。本文将带你理解其数学本质、应用场景、数值稳定性及完整 Python 实现。&#x1f4d8; 一、什么是 Categorical Cross Entropy&…

MyBatis-Plus通用中等、大量数据分批查询和处理

函数式接口 获取分页数据接口 主要用于获取数据 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;FunctionalInterface public interface MyBatisPlusPageFunctionInterface<T> {Page<T> selectPage(Page<T> page);}数据处理接口 import…

Ps 2025安装包(Adobe Photoshop 2025)安装包免费免激活版下载 附图文详细安装教程

[软件名称]&#xff1a;Ps2025 V26.3 [软件大小]&#xff1a;4.86 G [系统要求]&#xff1a;支持Win7及更高版本 [夸克网盘下载https://pan.quark.cn/s/d35677af9ef9 &#xff08;建议用手机保存到网盘后&#xff0c;再用电脑下载&#xff09;更多免费软件见https://docs.qq.co…

Codeforces Round 1037 (Div. 3)(补题)

文章目录前言A.Only One DigitB.No Casino in the MountainsC. I Will Definitely Make ItD.This Is the Last TimeE.G-C-D, Unlucky!总结前言 感觉前四道&#xff0c;就是考对于题目的理解能力&#xff0c;以及自己的模拟能力 A.Only One Digit 题目传送门&#xff1a;Only …

基于单片机智能插座设计/智能开关

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 随着我国的电子计算机技术的快速发展以及居民对现实生活的要求也在不断提升&#xff0c;所以很多…