首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Google键签署APK后,基于镜像链接的应用验证程序将失败。

使用Google键签署APK后,基于镜像链接的应用验证程序将失败。
EN

Stack Overflow用户
提问于 2019-08-22 20:16:06
回答 1查看 209关注 0票数 0

我正在致力于与Mirrorlink相关的Android应用程序,并在与Google密钥签署APK之后,面对Mirrorlink检查“应用程序ID”的问题。

我已经为Android创建了用Mirrorlink插件生成的空项目,它创建了允许生成与镜像链接相关的配置信息的.crt文件的Gradle任务。我只是将这个脚本复制到主应用程序模块中我自己的build.gradle文件中。但是,镜像链接感知的应用程序验证器显示签名APK (发布到Google的标准应用程序签名)的错误,而如果APK没有签名,则不会发现任何问题。

如何找出该应用程序签署后出现的问题?

我尝试过的是: 1)将Gradle脚本与镜像链接提供的示例应用程序对齐--没有运气。

2)插入v1SigningEnabled falsev2SigningEnabled false --无进展。

3)除了输出文件名和> Task :app:validateSigningRelease任务外,签名APK和未签名APK的分级输出是相同的。

AndroidManifest.xml镜像链接相关片段:

代码语言:javascript
复制
<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"/>

App模块的build.gradle

代码语言:javascript
复制
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感知的应用程序验证器“中,它将显示错误报告,如下所示:

代码语言:javascript
复制
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,验证器就不会发现任何问题:

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-24 14:57:47

好吧,伙计们,我发现了一个问题:)我在项目中使用了Crashlytics,它创建的文件crashlytics-build.properties在每次构建时都有细微的变化。

是的,这个文件由Mirrorlink的工具certificategenerator-android-studio.jar计数,该工具生成带有证书的appID。我做了一些反向工程,并检查了这个工具的内部情况:它只跳过assets/self-signed.ccc.crt文件和META-INF/内容。

所以,我在每个集合上都有不同的APK.禁用Crashlytics插件解决了这个问题。您可以禁用Crashlytics插件(坏主意),或者使用ext.alwaysUpdateBuildId = false param跳过创建唯一的构建ID. 在这里读更多

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57616502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档