將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
英文地址,請注明出處:http://en.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;所以很多…