Android Automotive 14(3)车机运用体系渠道签名

1.前言

上篇《Android Automotive 14(2)多屏模拟器》讲到装备好模拟器,这篇文章将记录一下关于车机体系运用,
怎么从零开始制造体系渠道签名文件,并转换为Android Studio运用的.jks文件。

2.分析

AAOS源码的体系运用,一般都是经过Android.mk或许Android.bp 来编译的。
例如原生CarSettings源码目录结构如下:

Android Automotive 14(3)车机运用体系渠道签名

APK的打包,是在make的过程中完结的,编译完结就进行了体系签名。

...
android_app {
    name: "CarSettings",
    overrides: ["Settings"],
    platform_apis: true,
    certificate: "platform",
	....

Android.bp中certificate值为platform,platform_apis值为true,以上信息代表可以运用体系渠道的一些躲藏API,而且权限等级比较高。
这种源码source并不是gradle编译结构,当需求频频的推包或许装置验证时,依靠频频make,调试效率不是很高。

Android Automotive 14(3)车机运用体系渠道签名

是否可以直接用Android Studio来开发编译和调试车机体系运用呢?答案是肯定。
可是,汽车运用出于驾驭安全等考虑,一般要想获得一些车身传感器相关的状况,
比方CarService中的空调温度,车门车窗状况等等,是需求体系渠道签名,才干拜访API。
所以,咱们要制造一个Android Studio能用的体系渠道签名,就可以很方便的进行车机体系运用开发了。

3.签名

在制造签名文件之前,咱们先了解一下,体系有哪些签名。
AAOS14 的签名文件目录:

user@ubuntu:~/code/aosp/build/target/product/security$ ls
Android.bp     bluetooth.x509.pem  cts_uicc_2021.x509.pem     media.x509.pem         platform.pk8       sdk_sandbox.pk8       shared.x509.pem
Android.mk     BUILD.bazel         fsverity-release.x509.der  networkstack.pk8       platform.x509.pem  sdk_sandbox.x509.pem  testkey.pk8
bluetooth.pk8  cts_uicc_2021.pk8   media.pk8                  networkstack.x509.pem  README             shared.pk8            testkey.x509.pem

每个密钥都包含两个文件:一个是扩展名为 .x509.pem 的证书,另一个是扩展名为 .pk8 的私钥。
阅览README文件,体系首要有如下几组签名,同时注明了生成的参数办法:

key generation
--------------
The following commands were used to generate the test key pairs:
 development/tools/make_key testkey    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
 development/tools/make_key platform   '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
 development/tools/make_key shared    '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
 development/tools/make_key media     '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
 development/tools/make_key cts_uicc_2021 '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

官方文档关于key的解说,参照文档

Android Automotive 14(3)车机运用体系渠道签名

每组签名用处不同,进一步解说理解便是:

  1. platform 签名
    • 用处:platform签名首要用于体系中心运用,这些运用直接与Android操作体系紧密集成,并履行关键的体系级功能。
    • 特性
      • AndroidManifest.xml中经过设置android:sharedUserId="android.uid.system"表明该运用归于体系进程组,具有更高的权限。
      • 运用platform签名的运用程序通常运转在system UID下,可以直接拜访受保护的API和资源,而且可以和其他system用户ID下的运用同享数据。
      • 因为这类运用的安全敏感性,它们有必要运用由设备制造商或体系开发者持有的私钥进行签名。
  2. media 签名
    • 用处:media签名首要运用于与媒体处理和下载服务相关的体系组件,比方默许的媒体播放器、下载管理器等。
    • 特性
      • 相同需求在manifest文件中声明特定的同享用户ID,即android:sharedUserId="android.media"
      • 这类运用相同享有较高的权限,答应它们履行与多媒体处理相关的中心操作,例如读取和写入多媒体内容,以及管理网络下载使命等。
      • media签名运用虽然不如platform签名运用权限高,但仍然具有超出一般第三方运用的特别权限。
  3. shared 签名
    • 用处:shared签名是用于那些需求与其他特定体系进程(如home屏幕或许联系人运用)之间同享数据和资源的运用。
    • 特性
      • 设置android:sharedUserId="android.uid.shared"后,运用会以同一个用户ID运转,从而可以互相拜访彼此的数据目录。
      • shared签名的运用一般不涉及最底层的体系服务,而是针对体系内部具有必定协作关系的服务或许组件提供数据同享能力。
  4. testkey 签名
    • 用处:testkey是Android编译体系中的默许签名密钥,当一个APK没有明确指定LOCAL_CERTIFICATE变量时,体系会运用testkey对其进行签名。因为testkey是公开且简单获取的,因而它并不适用于正式发布或安全要求高的运用。

AAOS14源码API34默许的keys.conf装备:
源码路径Z:aospsystemsepolicyprebuiltsapi34.0privatekeys.conf

[@PLATFORM]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/platform.x509.pem
[@SDK_SANDBOX]
ALL : $MAINLINE_SEPOLICY_DEV_CERTIFICATES/sdk_sandbox.x509.pem  
[@BLUETOOTH]
ALL : $MAINLINE_SEPOLICY_DEV_CERTIFICATES/bluetooth.x509.pem
[@MEDIA]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/media.x509.pem
[@NETWORK_STACK]
ALL : $MAINLINE_SEPOLICY_DEV_CERTIFICATES/networkstack.x509.pem
[@SHARED]
ALL : $DEFAULT_SYSTEM_DEV_CERTIFICATE/shared.x509.pem
# Example of ALL TARGET_BUILD_VARIANTS
[@RELEASE]
ENG    : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
USER   : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem
USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/testkey.x509.pem

可以看出,这儿取决于变量DEFAULT_SYSTEM_DEV_CERTIFICATE界说。
进一步检查,源码路径Z:aospbuildmakecoreconfig.mk

# The default key if not set as LOCAL_CERTIFICATE
ifdef PRODUCT_DEFAULT_DEV_CERTIFICATE
 DEFAULT_SYSTEM_DEV_CERTIFICATE := $(PRODUCT_DEFAULT_DEV_CERTIFICATE)
else
 DEFAULT_SYSTEM_DEV_CERTIFICATE := build/make/target/product/security/testkey
endif
.KATI_READONLY := DEFAULT_SYSTEM_DEV_CERTIFICATE

源码路径Z:aospbuildmakecoresysprop.mk

# The "test-keys" tag marks builds signed with the old test keys,
# which are available in the SDK. "dev-keys" marks builds signed with
# non-default dev keys (usually private keys from a vendor directory).
# Both of these tags will be removed and replaced with "release-keys"
# when the target-files is signed in a post-build step.
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/make/target/product/security/testkey)
BUILD_KEYS := test-keys
else
BUILD_KEYS := dev-keys
endif

所以,源码给了OEM厂商去装备界说自己的key,未做任何装备,默许就运用的testkey。
也可以用下面指令办法获得当时体系默许值:

# 在源码路径下输入:
user@ubuntu:~/code/aosp$ get_build_var DEFAULT_SYSTEM_DEV_CERTIFICATE
build/make/target/product/security/testkey

# 在模拟器下面
emulator_car64_x86_64:/ # getprop |grep build.tags
[ro.bootimage.build.tags]: [test-keys]
[ro.build.tags]: [test-keys]
[ro.odm.build.tags]: [test-keys]
[ro.product.build.tags]: [test-keys]
[ro.system.build.tags]: [test-keys]
[ro.system_dlkm.build.tags]: [test-keys]
[ro.system_ext.build.tags]: [test-keys]
[ro.vendor.build.tags]: [test-keys]
[ro.vendor_dlkm.build.tags]: [test-keys]

源码路径Z:aospsystemsepolicyprebuiltsapi34.0privatemac_permissions.xml
其间,界说了运用程序的MAC(Mandatory Access Control)权限规矩,即根据签名证书来控制运用可以拜访哪些特定的安全上下文和资源。

  <!-- Platform dev key in AOSP -->
  <signer signature="@PLATFORM" >
   <seinfo value="platform" />
  </signer>
  <!-- Sdk Sandbox key -->
  <signer signature="@SDK_SANDBOX" >
   <seinfo value="sdk_sandbox" />
  </signer>
  <!-- Bluetooth key in AOSP -->
  <signer signature="@BLUETOOTH" >
   <seinfo value="bluetooth" />
  </signer>
  <!-- Media key in AOSP -->
  <signer signature="@MEDIA" >
   <seinfo value="media" />
  </signer>
  <signer signature="@NETWORK_STACK" >
   <seinfo value="network_stack" />
  </signer>

了解完以上这些源码和装备信息,对Android体系签名也有个大概了解;
现在咱们要做的便是拿到platform签名,而且在运用中添加android:sharedUserId="android.uid.system" 装备。

4.制造

首要运用keytoolopenssl,将体系的platform.pk8platform.x509.pem,转化成Android Studio 可以运用的keystore文件,也便是格式为.jks的文件。
具体步骤如下:

# 1.进入key目录
code/aosp/build/make/target/product/security  

# 2.根据platform.pk8文件,生成platform.pem文件
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem

# 3.根据platform.x509.pem文件,生成platform.p12文件,暗码和alias名都装备成aaosdemo
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:aaosdemo -name aaosdemo

# 4.根据platform.p12文件,生成platform.jks,暗码和alias名都装备成aaosdemo
keytool -importkeystore -deststorepass aaosdemo -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass aaosdemo

调试打印信息如下:

# 打印证书指令:
# keytool -printcert -v -file platform.x509.pem
# keytool -list -v -keystore platform.jks
user@ubuntu:~/code/aosp/build/make/target/product/security$ keytool -list -v -keystore platform.jks
Enter keystore password:
Keystore type: PKCS12
Keystore provider: SUN
Your keystore contains 1 entry
Alias name: aaosdemo
Creation date: Jan 28, 2024
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
Issuer: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
Serial number: b3998086d056cffa
Valid from: Tue Apr 15 15:40:50 PDT 2008 until: Sat Sep 01 15:40:50 PDT 2035
Certificate fingerprints:
         SHA1: 27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA
         SHA256: C8:A2:E9:BC:CF:59:7C:2F:B6:DC:66:BE:E2:93:FC:13:F2:FC:47:EC:77:BC:6B:2B:0D:52:C1:1F:51:19:2A:B8
Signature algorithm name: MD5withRSA (disabled)
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
Extensions:
#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 4F E4 A0 B3 DD 9C BA 29   F7 1D 72 87 C4 E7 C3 8F  O......)..r.....
0010: 20 86 C2 99                                         ...
]
[EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US]
SerialNumber: [    b3998086 d056cffa]
]
#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen: no limit
]
#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4F E4 A0 B3 DD 9C BA 29   F7 1D 72 87 C4 E7 C3 8F  O......)..r.....
0010: 20 86 C2 99                                         ...
]
]
*******************************************
*******************************************
Warning:
<aaosdemo> uses the MD5withRSA signature algorithm which is considered a security risk and is disabled.

5.装备

生成platform.jks文件后,直接装备Android Studio,调试运用。

  • 1.在运用的AndroidManifest.xml 参加android:sharedUserId="android.uid.system"
  • 2.build.gradle 参加signingConfigs
android {
...
	signingConfigs {  
		aaos_platform {  
			storeFile file('platform.jks')  
			storePassword 'aaosdemo'  
			keyAlias 'aaosdemo'  
			keyPassword 'aaosdemo'  
		}  
	} 
	buildTypes {  
		release {  
			signingConfig signingConfigs.aaos_platform  
			...
		}  
		debug {  
			signingConfig signingConfigs.aaos_platform  
		}  
	}
...
}

完结上述装备,点击运转,就可以直接装置到模拟器了。
经过运转前后对比,可以看出:

# 未导入前,一般进程以a177 显示
emulator_car64_x86_64:/ $ ps -A  |grep  com.example.aaos
u10_a177      3214   370   13834132 134272 0                   0 S com.example.aaos

#导入后,以System进程显示
emulator_car64_x86_64:/ $ ps -A  |grep  com.example.aaos
u10_system    3748   370   13832552 137928 0                   0 S com.example.aaos

运用的process信息u10_system现已变成system了,证明导入成功,接下来就可以导入体系一些支撑的jar包,进行下一步的体系API的调用了。

6.总结

综上所述,完结了从零开始制造体系渠道签名文件,并转换为Android Studio运用的.jks文件,为后续车机体系运用调试做好预备。
如果你喜欢我的文章,欢迎重视我的微信大众号阿坤iKun,重视不走失,我是练习时长两年半的阿坤iKun,下期再见!

参考资料:

  1. source.android.google.cn/docs/core/o…
  2. learn.microsoft.com/zh-cn/xamar…
  3. github.com/getfatday/k…