车载应用配置系统签名
在配置系统签名时,核心是在 android 闭包下的 signingConfigs 中定义签名信息,并在 buildTypes 中引用它
假设你的签名文件名为 system_signature.jks,并且你已经将其放在了 App 模块的根目录下 (即与 build.gradle 同级)。
以下是两种构建脚本语言的详细配置方式:
1. Groovy (build.gradle)
这是传统 Android 项目最常用的格式。
java
android {
// ... 其他配置
// 1. 配置签名信息
signingConfigs {
// 定义一个名为 system 的签名配置(名字可以自定义,如 release)
system {
storeFile file("platform.jks") // 如果在 app 目录下直接写文件名
storePassword "你的keystore密码" // 例如:android
keyAlias "你的别名" // 例如:androiddebugkey 或 platform
keyPassword "你的别名密码" // 例如:android
// 强制开启 v1 和 v2 签名(通常车载系统为了兼容性建议都开启)
v1SigningEnabled true
v2SigningEnabled true
}
}
// 2. 在构建类型中应用签名
buildTypes {
release {
// 引用上面定义的 'system' 签名配置
signingConfig signingConfigs.system
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
// 方便调试:让 debug 包也拥有系统签名,这样可以直接 Run 到车机上
signingConfig signingConfigs.system
}
}
}
2. Kotlin DSL (build.gradle.kts)
如果你使用的是较新的 Android Studio 模版,通常默认为 KTS 格式。
ini
android {
// ... 其他配置
// 1. 配置签名信息
signingConfigs {
// 创建一个名为 "system" 的配置
create("system") {
storeFile = file("platform.jks")
storePassword = "你的keystore密码"
keyAlias = "你的别名"
keyPassword = "你的别名密码"
enableV1Signing = true
enableV2Signing = true
}
}
// 2. 在构建类型中应用签名
buildTypes {
getByName("release") {
// 引用名为 "system" 的签名配置
signingConfig = signingConfigs.getByName("system")
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
getByName("debug") {
// 同样给 debug 包配置系统签名
signingConfig = signingConfigs.getByName("system")
}
}
}
关键注意事项
1. Manifest 声明 (Android 10 (API 29) 开始弃用 sharedUserId)
既然配置了系统签名,你的应用通常需要声明自己是系统用户。请确保你的 AndroidManifest.xml 的 <manifest> 根节点中包含:
ini
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.your.package.name"
android:sharedUserId="android.uid.system">
如果不加这句,即便签名正确,你也拿不到系统权限;且如果系统里已有相同 uid 的应用,安装时会报 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE。
2. 动态配置签名信息
- 在项目根目录
local.properties添加:
ini
SYSTEM_KEY_PATH=keys/platform.jks
SYSTEM_KEY_PASSWORD=platform
SYSTEM_KEY_ALIAS=platform
SYSTEM_ALIAS_PASSWORD=platform
- 修改
build.gradle读取这些值
vbscript
android {
signingConfigs {
create("system") {
// 从 gradle.properties 中读取文件路径和密码
storeFile = file(project.rootDir.absolutePath + "/app/" + project.property("SYSTEM_STORE_FILE").toString())
storePassword = project.property("SYSTEM_STORE_PASSWORD").toString()
keyAlias = project.property("SYSTEM_KEY_ALIAS").toString()
keyPassword = project.property("SYSTEM_KEY_PASSWORD").toString()
}
}
// ...
}
- 验证签名,打包完成后,你可以使用
apksigner验证签名是否生效
arduino
apksigner verify -v --print-certs your_app.apk
验证信息
csharp
C:\Users\ZQ\AppData\Local\Android\Sdk\build-tools\34.0.0>apksigner verify -v --print-certs C:\ZQ\change_system_sign\VwCopilotLauncher.apk
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): false
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v3.1 scheme (APK Signature Scheme v3.1): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: EMAILADDRESS=seqc.zcdev@seres.cn, CN=Seres, OU=Seres, O=Seres, L=Chengdu View, ST=SiChuan, C=ZH
Signer #1 certificate SHA-256 digest: f4e8fbc3b6c23a000639e3df8f1b4be1ed153436e638f7bdc65598f9d0d3c7e8
Signer #1 certificate SHA-1 digest: 816003d74e06bad2bab5f440801ed9ce2f75b89e
Signer #1 certificate MD5 digest: 907c255625cb183c7906de565522b446
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048
Signer #1 public key SHA-256 digest: 7c51217f508f3c11341e5e025e7dc6c8eb103f1e850a6000433b8ae9cda3915b
Signer #1 public key SHA-1 digest: 5c09f551e8f356d979d7da239fd65857fc84d330
Signer #1 public key MD5 digest: e278637218a2bdfcac56bd279ac80dee