当前位置: 首页 > 知识库问答 >
问题:

包与同名的现有包冲突

卢永寿
2023-03-14

.在我的日志中,当我试图升级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!

.orginal应用程序已经生产了4年多,是用Eclipse编写的,它安装在我的旧硬盘上。

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

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

[更新1]

我已经提取了新旧APK的cert.rsa。它们都使用相同的密钥库和密钥,但我注意到我使用了错误的发行别名。下面是两个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
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,我有一个用相同名称实现的类(清单中也有描述)。

一旦导入到Android Studio,构建并推送到设备上,Android说它找不到应用程序类。所以我使用了下面的代码,它似乎解决了这个问题。

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

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

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

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

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


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

共有1个答案

刁远
2023-03-14
unzip -p App.apk META-INF/CERT.RSA |openssl pkcs7 -inform DER -noout -print_certs -text
 类似资料:
  • 在我的模拟器中,当我尝试以编程方式升级apk时。我得到:

  • 问题内容: 我在用Maven或Eclipse编译一些Scala时遇到问题,我尝试从Java jar导入一个包含名称空间和同名类的类。 我可以用编译。 例如,Java项目(jar)包含: 编译器抱怨: 在Scala 2.9.0.1(和)中使用Maven 3.0.03 / Eclipse 3.7.1 。 我遇到问题的jar是-它肯定包含几个实例,其中存在同名的名称空间和对象。 我正在尝试在Scala中

  • 问题内容: 我在用Maven或Eclipse编译一些Scala时遇到问题,我尝试从Java jar导入一个包含名称空间和同名类的类。 我可以用编译。 例如,Java项目(jar)包含: 编译器抱怨: 在Scala 2.9.0.1(和)中使用Maven 3.0.03 / Eclipse 3.7.1 。 我遇到问题的jar是-它肯定包含几个实例,其中存在同名的名称空间和对象。 我正在尝试在Scala中

  • 问题内容: 在我的Java应用程序中,我使用第三方库。 但是,我发现有些奇怪,有一些嵌套的程序包,有些类的名称可能与程序包的名称相同。 恐怕我不清楚。这是一个例子: 包 在“ com.xx.a”内部有一个名为“ a”的类。 因此,如果我想将此类称为“ a” … 我写: 然后,IDE将认为我的意思是软件包“ com.xx.a.a”。 那我就不能打电话了。 我想知道为什么? 顺便说一句,图书馆提供者似

  • 问题内容: 我正在使用两个具有相同名称的python软件包。 http://www.alembic.io/updates.html https://pypi.python.org/pypi/alembic 是否有规范或Python方式处理名称冲突的两个软件包的安装?到目前为止,我在开发/构建过程中仅偶尔需要一个软件包,因此我一直在使用单独的virtualenv来处理冲突,但是这使构建步骤变得更加复