包与同名的现有包冲突

时间:2017-04-07 12:41:53

标签: android android-studio apk

由于上述消息,我遇到了无法安装升级到apk的问题。

我已阅读有关SO的帖子,说当使用其他发布密钥对应用进行签名时会发生此消息。

example post on different keys

。 在我的日志中,当我尝试升级apk时,我得到以下内容:

04-07 13:28:03.796 2072-2072/? W/InstallAppProgress: Replacing package:com.xxx.rr3

04-07 13:28:04.326 3675-3845/? W/PackageManager: verifying app can be installed or not

04-07 13:28:04.378 3675-3845/? W/PackageManager: Package com.xxx.rr3 signatures do not match the previously installed version; ignoring!

。 原始应用程序已经投入生产超过4年,并使用Eclipse编写,Eclipse安装在我的旧硬盘上。

6个月前,我的老板给我买了一个SSD驱动器,我安装了Android Studio。我迁移了旧项目,它构建得很好,它将安装到一个没有安装以前版本的设备上。

我将密钥库从旧硬盘复制到我的新SSD,然后用它在Android Studio中签署新版本的应用程序。所以我只使用过同一个密钥库,使用相同的密码和别名。

有人能告诉我为什么Android会说我的升级是用不同的密钥签名的吗?

[UPDATE1]

我已经为旧版和新版apk提取了CERT.RSA。他们都使用相同的密钥库和密钥,但我注意到我使用了错误的版本别名。下面是两个apks的指纹,最上面一个是旧的底部,新的底部。

C:\OpenSSL-Win64\bin>keytool -printcert -file CERT.RSA
Owner: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire
Issuer: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire
Serial number: 6144ad2c
Valid from: Fri Jan 11 08:55:29 GMT 2013 until: Thu May 14 09:55:29 BST 3012
Certificate fingerprints:
         MD5:  50:63:5E:54:9D:D3:C4:71:A9:4E:3C:F4:27:9E:50:CA
         SHA1: 7C:2C:DB:7E:92:D2:01:46:43:8D:D2:B9:A4:D2:B0:F4:85:E7:16:D9
         SHA256: 38:64:89:4D:A2:37:72:AA:CE:90:5E:34:46:B9:D0:A4:CA:18:B7:07:7A:E2:DB:1D:7C:60:CD:70:F6:77:C5:FF
         Signature algorithm name: SHA256withRSA
         Version: 3

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 3F 95 E8 FA 36 5B 26 07   33 72 8B 09 37 0C 18 C5  ?...6[&.3r..7...
0010: 3B 5A 19 42                                        ;Z.B
]
]


C:\OpenSSL-Win64\bin>keytool -list -keystore .keystore
keytool error: java.lang.Exception: Keystore file does not exist: .keystore

C:\OpenSSL-Win64\bin>keytool -printcert -file CERT.RSA
Owner: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire
Issuer: CN=matthew womersley, OU=dev, O=carefreegroup, L=wakefield, ST=west yorkshire
Serial number: 6144ad2c
Valid from: Fri Jan 11 08:55:29 GMT 2013 until: Thu May 14 09:55:29 BST 3012
Certificate fingerprints:
         MD5:  50:63:5E:54:9D:D3:C4:71:A9:4E:3C:F4:27:9E:50:CA
         SHA1: 7C:2C:DB:7E:92:D2:01:46:43:8D:D2:B9:A4:D2:B0:F4:85:E7:16:D9
         SHA256: 38:64:89:4D:A2:37:72:AA:CE:90:5E:34:46:B9:D0:A4:CA:18:B7:07:7A:E2:DB:1D:7C:60:CD:70:F6:77:C5:FF
         Signature algorithm name: SHA256withRSA
         Version: 3

点击“生成签名Apk”后,我指定了正确的发布版本。但是仍然存在错误,尽管有所不同。

  

包与同名的现有包冲突

。 我尝试使用以下链接手动构建新的apk:

link

C:\Users\mattheww\StudioProjects\nfcscanner3>gradlew assembleRelease
Downloading https://services.gradle.org/distributions/gradle-2.14.1-all.zip


Unzipping C:\Users\mattheww\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv\gradle-2.14.1-all.zip to C:\Users\mattheww\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\mattheww\StudioProjects\nfcscanner3\app\build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':app'.
> java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 29.982 secs

如果两个应用上的密钥库和指纹匹配,有人可以解释为什么新应用仍然无法升级吗?

[更新2]

我刚才记得当我将Eclipse项目导入Android Studio时,它无法正确构建。应用程序对象出现问题。我的应用程序对象称为NfcScannerApplication,我有一个由同名实现的类(也在清单中描述)。

一旦导入Android Studio,构建并推送到设备,Android就说它无法找到Application类。所以我使用了以下代码来解决这个问题。

public static NfcScannerApplication getRealApplication (Context applicationContext)
    {
        Log.e(TAG, "inside NfcScannerApplication getRealApplication");
        NfcScannerApplication application = null;

        if (applicationContext instanceof NfcScannerApplication)
        {
            application = (NfcScannerApplication) applicationContext;
        }
        else
        {
            Application realApplication = null;
            Field magicField = null;
            try
            {
                magicField = applicationContext.getClass().getDeclaredField("realApplication");
                magicField.setAccessible(true);
                realApplication = (Application) magicField.get(applicationContext);
            }
            catch (NoSuchFieldException e)
            {
                Log.e(TAG, e.getMessage());
            }
            catch (IllegalAccessException e)
            {
                Log.e(TAG, e.getMessage());
            }

            application = (NfcScannerApplication) realApplication;
        }

        return application;
    }



    // the above method is commented out and this is used
    //because the migration process from Eclipse to Android
    //needed it. see below
    //https://stackoverflow.com/questions/36495954/bootstrapapplication-cannot-be-cast-to-applicationclass

它使用反射来获取Application类。这可能是为什么即使我使用相同的密钥库等,Android也认为设备上有不同的应用程序具有相同的名称?

[更新3] 我好像发现了这个问题。 :)我有一个ContentProvider,在首次加载应用程序时获取应用程序上下文。我调用getContext并将其转换为我的Application类。

我现在所做的是调用getContext.getApplicationContext(),它现在运行正常。下面是我现在使用的代码,上面注明了旧代码。

//old code
//Context context = getContext();
      //nfcAppObj = (NfcScannerApplication) getContext();


//new code
       Context applicationContext = getContext().getApplicationContext();
       nfcAppObj = getRealApplication(applicationContext);

3 个答案:

答案 0 :(得分:0)

如果游戏商店拒绝你的apk表示你的密钥库不是原始密钥,则将你签名的apk发布到测试版或alpha版的游戏商店。

如果Play商店接受了你的apk,那么尝试从Play商店更新你安装的apk。

如果您的应用未在Play商店中列出,则可以从设备中提取您之前的apk并比较两个APK签名SHA1

获取apk的SHA1 How do I find out which keystore was used to sign an app?

答案 1 :(得分:0)

除非你做一些特别的事情,否则当你点击" Play" Android Studio中的按钮将使用临时的AS特定调试密钥对应用进行签名,然后将其安装到您的设备上。

Eclipse做了非常相似的事情。

如果您正在谈论使用Android工作室"生成签名APK"然后尝试以下调试步骤:

  • 手动通过adb安装apk,查看错误是否仍然存在。
  • 通过gradle自己签名,查看错误是否仍然存在。

如果这两个步骤都不起作用,我认为假设您没有使用之前的相同密钥是合理安全的。

答案 2 :(得分:0)

如果你有旧的apk,你可以用它来获取用于签名的证书的详细信息。 (从apk -unziping it-中提取CERT.RSA文件,然后在该文件上运行openssl应用程序。)

unzip -p App.apk META-INF/CERT.RSA |openssl pkcs7 -inform DER -noout -print_certs -text

然后使用keytool(java附带)列出密钥库中的证书,看看是否找到匹配项,或者您认为正确的证书是否真正匹配。

供您参考:

Getting certificate details from an apk

How do I find out which keystore was used to sign an app?