背景描述:
起初Android Studio創建的apk工程,為了方便系統版本發布和后期維護需要同時支持兩種構建方式:
- Android Studio Gradle構建? ? ? ?IDE界面環境,對習慣java環境變成的友好、UI設計方便看效果
- Android15系統構建時自動構建 Soong構建? ?這種構建apk源碼放在aosp系統源碼中,作為一個普通的module來進行編譯構建。對于平時中心在系統集成的同學友好,對版本管理也方便。
由于Android Studio創建的app工程有固定的文件結構,和Soong構建時文件結構組織會有些差異,所以做兩套構建系統的兼容,主要從以下幾個方面進行:
- 調整apk源碼的目錄結構,兼容Gradle構建和Soong構建
- 添加Soong構建相關的腳本
- 調整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源碼構建系統需要加兩個內容:
- 將camerademo添加到系統鏡像(注意:非prebuild構建)
- 添加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添加簽名:
- 制作camerademo簽名使用的密鑰庫文件
- camerademo構建腳本中添加簽名配置
制作camerademo應用簽名的密鑰文件
有兩種方法生成.jks文件:
- 使用Android Studio,通過界面配置生成.jks
- 使用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