使用 Google 开发者密钥签署 APK 后,支持 MirrorLink 的应用程序验证器失败
MirrorLink-aware app validator fails after signing APK with Google developer key
我正在开发支持 MirrorLink 的 Android 应用程序,并在使用 Google 开发者密钥签署 APK 后遇到 Mirrorlink 检查 'application ID' 的问题。
我已经为 Android studio 创建了使用 Mirrorlink 插件生成的空项目,它创建了 Gradle 任务,允许生成带有 Mirrorlink 相关配置信息的 .crt
文件。我只是将此脚本复制到主应用程序模块中我自己的 build.gradle
文件中。但是 Mirrorlink-aware 应用程序验证器显示签名 APK 错误(发布到 Google Play 的标准应用程序签名),而 如果 APK 未签名则没有问题。
如何发现签名后出现的问题?
我尝试了什么:
1) 将 Gradle 脚本与 example app provided by Mirrorlink 对齐 - 运气不好。
2) 插入 v1SigningEnabled false
和 v2SigningEnabled false
- 运气不好。
3) Gradle 已签名和未签名 APK 的输出是相同的,除了输出文件名和 > Task :app:validateSigningRelease
任务。
AndroidManifest.xml 与 Mirrorlink 相关的片段:
<uses-permission android:name="com.mirrorlink.android.service.ACCESS_PERMISSION"/>
<intent-filter>
<action android:name="com.mirrorlink.android.app.LAUNCH"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="com.mirrorlink.android.app.TERMINATE"/>
<category android:name="android.intent.category.DEFAULT"/>
应用模块的build.gradle:
def generateSelfSignedCertificate(version){
def buildType = version == "release" ? "assembleRelease": "assembleDebug"
def rerunAssemble = true
def projectLocation = projectDir.toString()
def certGeneratorLocation = "certificategenerator-android-studio.jar"
def certXmlLocation = projectLocation + "/certificate.xml"
def certificateDestination = projectLocation + "/src/main/assets/self-signed.ccc.crt"
def certificateFolder = projectLocation + "/src/main/assets/"
def certificateIssuer = "CN=SELF-SIGNED"
def developerId = ""
def apkLocation = ""
android.applicationVariants.all { variant ->
if ((variant.name).equals(version)) {
variant.outputs.each { output ->
//noinspection GrReassignedInClosureLocalVar
apkLocation = output.outputFile
}
}
}
if (project.hasProperty("isLast")) {
rerunAssemble = !isLast
}
if (rerunAssemble) {
def subdir = new File(certificateFolder)
if( !subdir.exists() ) {
subdir.mkdirs()
}
exec {
executable 'java'
args "-jar", certGeneratorLocation, "generate-certificate", apkLocation,
android.defaultConfig.applicationId, android.defaultConfig.versionCode,
certXmlLocation, certificateDestination, certificateIssuer, developerId
println(args)
}
if (System.properties['os.name'].toLowerCase().contains("windows")) {
exec {
executable "cmd"
workingDir projectLocation
args "/c", "..\gradlew.bat", buildType, "-PisLast=true"
}
} else {
exec {
executable "bash"
workingDir projectLocation
args "../gradlew", buildType, "-PisLast=true"
}
}
}
}
android {
.....
signingConfigs {
storeFile = 'sign.keyStorePath')
keyAlias = 'sign.keyAlias'
storePassword = 'sign.storePassword'
keyPassword = 'sign.keyPassword'
}
}
afterEvaluate {
if (this.hasProperty("assembleRelease")){
assembleRelease.finalizedBy generateSelfSignedCertificateForRelase
}
}
task generateSelfSignedCertificateForRelase {
doLast {
generateSelfSignedCertificate("release")
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
....
}
运行 "assesbleRelease" 运行没有问题 - 它生成带有 Mirrorlink 应用程序 ID 的 .crt 文件。但是如果我把这个文件放在 "Mirrorlink-aware application validator" - 它会显示错误报告,如下所示:
Checking com.mirrorlink.android.app.LAUNCH intent - OK
Checking com.mirrorlink.android.app.TERMINATE intent - OK
Checking com.mirrorlink.android.service.ACCESS_PERMISSION permission - OK
Checking DEVELOPER entity - INCONCLUSIVE. DEVELOPER entity not found
Checking if developer certificate exists for serverID="" - INCONCLUSIVE. DEVELOPER entity not found
Checking application id - FAIL. Calculated application ID doesn't mach id provided in self signed certificate
Checking self signed certificate - OK
The APK is not configured correctly.
但是如果我删除字符串 signingConfig signingConfigs.release
验证器没有发现问题:
Checking com.mirrorlink.android.app.LAUNCH intent - OK
Checking com.mirrorlink.android.app.TERMINATE intent - OK
Checking com.mirrorlink.android.service.ACCESS_PERMISSION permission - OK
Checking DEVELOPER entity - INCONCLUSIVE. DEVELOPER entity not found
Checking if developer certificate exists for serverID="" - INCONCLUSIVE. DEVELOPER entity not found
Checking application id - OK
Checking self signed certificate - OK
The APK is correctly configured as a MirrorLink Aware application.
好吧,伙计们,我发现了问题:)
我在项目中有 Crashlytics,它创建的文件 crashlytics-build.properties
在每次构建时都略有变化。
是的,此文件由 Mirrorlink 的工具 certificategenerator-android-studio.jar
计数,该工具生成带有证书的 appID。我做了一些逆向工程并检查了这个工具内部发生的事情:它只跳过 assets/self-signed.ccc.crt
文件和 META-INF/
内容。
所以,我在每个 assemble 上的 APK 都略有不同...禁用 Crashlytics 插件可以解决问题。
您可以禁用 Crashlytics 插件(坏主意),或使用 ext.alwaysUpdateBuildId = false
参数跳过创建唯一构建 ID。 Read more here.
我正在开发支持 MirrorLink 的 Android 应用程序,并在使用 Google 开发者密钥签署 APK 后遇到 Mirrorlink 检查 'application ID' 的问题。
我已经为 Android studio 创建了使用 Mirrorlink 插件生成的空项目,它创建了 Gradle 任务,允许生成带有 Mirrorlink 相关配置信息的 .crt
文件。我只是将此脚本复制到主应用程序模块中我自己的 build.gradle
文件中。但是 Mirrorlink-aware 应用程序验证器显示签名 APK 错误(发布到 Google Play 的标准应用程序签名),而 如果 APK 未签名则没有问题。
如何发现签名后出现的问题?
我尝试了什么: 1) 将 Gradle 脚本与 example app provided by Mirrorlink 对齐 - 运气不好。
2) 插入 v1SigningEnabled false
和 v2SigningEnabled false
- 运气不好。
3) Gradle 已签名和未签名 APK 的输出是相同的,除了输出文件名和 > Task :app:validateSigningRelease
任务。
AndroidManifest.xml 与 Mirrorlink 相关的片段:
<uses-permission android:name="com.mirrorlink.android.service.ACCESS_PERMISSION"/>
<intent-filter>
<action android:name="com.mirrorlink.android.app.LAUNCH"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="com.mirrorlink.android.app.TERMINATE"/>
<category android:name="android.intent.category.DEFAULT"/>
应用模块的build.gradle:
def generateSelfSignedCertificate(version){
def buildType = version == "release" ? "assembleRelease": "assembleDebug"
def rerunAssemble = true
def projectLocation = projectDir.toString()
def certGeneratorLocation = "certificategenerator-android-studio.jar"
def certXmlLocation = projectLocation + "/certificate.xml"
def certificateDestination = projectLocation + "/src/main/assets/self-signed.ccc.crt"
def certificateFolder = projectLocation + "/src/main/assets/"
def certificateIssuer = "CN=SELF-SIGNED"
def developerId = ""
def apkLocation = ""
android.applicationVariants.all { variant ->
if ((variant.name).equals(version)) {
variant.outputs.each { output ->
//noinspection GrReassignedInClosureLocalVar
apkLocation = output.outputFile
}
}
}
if (project.hasProperty("isLast")) {
rerunAssemble = !isLast
}
if (rerunAssemble) {
def subdir = new File(certificateFolder)
if( !subdir.exists() ) {
subdir.mkdirs()
}
exec {
executable 'java'
args "-jar", certGeneratorLocation, "generate-certificate", apkLocation,
android.defaultConfig.applicationId, android.defaultConfig.versionCode,
certXmlLocation, certificateDestination, certificateIssuer, developerId
println(args)
}
if (System.properties['os.name'].toLowerCase().contains("windows")) {
exec {
executable "cmd"
workingDir projectLocation
args "/c", "..\gradlew.bat", buildType, "-PisLast=true"
}
} else {
exec {
executable "bash"
workingDir projectLocation
args "../gradlew", buildType, "-PisLast=true"
}
}
}
}
android {
.....
signingConfigs {
storeFile = 'sign.keyStorePath')
keyAlias = 'sign.keyAlias'
storePassword = 'sign.storePassword'
keyPassword = 'sign.keyPassword'
}
}
afterEvaluate {
if (this.hasProperty("assembleRelease")){
assembleRelease.finalizedBy generateSelfSignedCertificateForRelase
}
}
task generateSelfSignedCertificateForRelase {
doLast {
generateSelfSignedCertificate("release")
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
....
}
运行 "assesbleRelease" 运行没有问题 - 它生成带有 Mirrorlink 应用程序 ID 的 .crt 文件。但是如果我把这个文件放在 "Mirrorlink-aware application validator" - 它会显示错误报告,如下所示:
Checking com.mirrorlink.android.app.LAUNCH intent - OK
Checking com.mirrorlink.android.app.TERMINATE intent - OK
Checking com.mirrorlink.android.service.ACCESS_PERMISSION permission - OK
Checking DEVELOPER entity - INCONCLUSIVE. DEVELOPER entity not found
Checking if developer certificate exists for serverID="" - INCONCLUSIVE. DEVELOPER entity not found
Checking application id - FAIL. Calculated application ID doesn't mach id provided in self signed certificate
Checking self signed certificate - OK
The APK is not configured correctly.
但是如果我删除字符串 signingConfig signingConfigs.release
验证器没有发现问题:
Checking com.mirrorlink.android.app.LAUNCH intent - OK
Checking com.mirrorlink.android.app.TERMINATE intent - OK
Checking com.mirrorlink.android.service.ACCESS_PERMISSION permission - OK
Checking DEVELOPER entity - INCONCLUSIVE. DEVELOPER entity not found
Checking if developer certificate exists for serverID="" - INCONCLUSIVE. DEVELOPER entity not found
Checking application id - OK
Checking self signed certificate - OK
The APK is correctly configured as a MirrorLink Aware application.
好吧,伙计们,我发现了问题:)
我在项目中有 Crashlytics,它创建的文件 crashlytics-build.properties
在每次构建时都略有变化。
是的,此文件由 Mirrorlink 的工具 certificategenerator-android-studio.jar
计数,该工具生成带有证书的 appID。我做了一些逆向工程并检查了这个工具内部发生的事情:它只跳过 assets/self-signed.ccc.crt
文件和 META-INF/
内容。
所以,我在每个 assemble 上的 APK 都略有不同...禁用 Crashlytics 插件可以解决问题。
您可以禁用 Crashlytics 插件(坏主意),或使用 ext.alwaysUpdateBuildId = false
参数跳过创建唯一构建 ID。 Read more here.