android - 包与同名的现有包冲突

标签 android android-studio apk

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

我读过关于 SO 的帖子说当应用程序使用不同的发布 key 签名时会出现此消息。

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 编写的,它安装在我的旧硬盘上。

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

我将 keystore 从我的旧硬盘驱动器复制到我的新 SSD,并使用它在 Android Studio 中为应用程序的新版本签名。所以我只使用过一个相同的 keystore ,具有相同的密码和别名。

谁能告诉我为什么 Android 说我的升级是用不同的 key 签名的?

[更新1]

我已经提取了新旧 apk 的 CERT.RSA。他们都使用相同的 keystore 和 key ,但我注意到我使用了错误的发布别名。下面是两个 apk 的指纹,上面的是旧的,下面的是新的。

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”时指定了正确的 releasealias,但仍然出现错误,尽管有所不同。

The package conflicts with an existing package by the same name

. 我尝试使用以下链接手动构建新的 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

.

如果两个应用的 keystore 和指纹都匹配,谁能解释为什么新应用仍然不会升级?

[更新 2]

我刚刚记得当我将 Eclipse 项目导入 Android Studio 时,它无法正确构建。 Appication 对象有问题。我的 Appication 对象称为 NfcScannerApplication,我有一个用相同名称实现的类( list 中也有描述)。

导入到 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 类。这可能是为什么即使我使用相同的 keystore 等,Android 仍认为设备上有同名的不同应用程序的原因吗?

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

我现在做的是调用 getContext.getApplicationContext(),它现在工作正常。下面是我现在使用的代码,旧代码在上面被注释掉了。

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


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

最佳答案

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

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

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

供您引用:

Getting certificate details from an apk

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

关于android - 包与同名的现有包冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43278458/

相关文章:

android - 与 Android Studio 中的 Support Library v4 和 Support Library v13 冲突

java - Android Studio 链接引用失败

android - Proguard 和 Android - 没有看到尺寸减小

android - 无法解析或不是字段

android - 使用 kSOAP2 发送带有 int 数组的对象

android - 如何在 Android 应用程序中使用 AdMob 展示自己的广告

Android 在应用程序内部模拟 applicationcontext

java - 为什么我要使用 Android Studio 的 "Expand Boolean"Intention?

android - 如何为我的 Android 应用程序创建 "Licensing add-on"?

设备上的 Android 错误 : Failed to install *. apk *:超时