车载应用配置系统签名

车载应用配置系统签名

在配置系统签名时,核心是在 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. 动态配置签名信息

  1. 在项目根目录 local.properties 添加:
ini 复制代码
SYSTEM_KEY_PATH=keys/platform.jks
SYSTEM_KEY_PASSWORD=platform
SYSTEM_KEY_ALIAS=platform
SYSTEM_ALIAS_PASSWORD=platform
  1. 修改 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()
            }
        }
        // ...
    }
  1. 验证签名,打包完成后,你可以使用 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
相关推荐
半摆烂日常12 小时前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓12 小时前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发13 小时前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best14 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记14 小时前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达15 小时前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器
kv11015 小时前
Android studio国内开发有关
java·数据库·android studio
美狐美颜SDK开放平台15 小时前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk
春猿火17 小时前
某市-2026【网安·论道】misc-afterimage_note-wp
android
恋猫de小郭18 小时前
Shopify 回应为什么从 RN 回到原生,为什么不用 KMP ?
android·前端·flutter