包与同名的现有包冲突

tur*_*boy 7 android apk android-studio

我有一个问题,由于上面的消息,我的apk升级将无法安装.

我已阅读SO上的帖子,说当使用其他发布密钥签署应用程序时会发生此消息.

不同键上的示例帖子

.在我的日志中,当我尝试升级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!
Run Code Online (Sandbox Code Playgroud)

.原始应用程序已经投入生产超过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
Run Code Online (Sandbox Code Playgroud)

我在点击'Generate Signed Apk'时指定了正确的释放,但仍然存在错误,尽管有所不同.

该程序包与现有程序包的名称相同

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

链接

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
Run Code Online (Sandbox Code Playgroud)

.

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

[更新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
Run Code Online (Sandbox Code Playgroud)

它使用反射来获取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);
Run Code Online (Sandbox Code Playgroud)

Jua*_*uan 0

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

unzip -p App.apk META-INF/CERT.RSA |openssl pkcs7 -inform DER -noout -print_certs -text
Run Code Online (Sandbox Code Playgroud)

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

供你参考:

从 apk 获取证书详细信息

如何查明使用哪个密钥库来签署应用程序?


归档时间:

查看次数:

6754 次

最近记录:

8 年,6 月 前