与现有软件包相同名称的软件包冲突

与现有软件包相同名称的软件包冲突

问题描述:

由于上述消息,我有一个升级到我的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编写。

6个月前我的老板给我买了一个SSD硬盘,我安装了Android Studio。我迁移了旧的项目,它的构建正常,它会安装到没有安装以前版本的设备上。

我复制从我的旧硬盘的密钥存储到我的新SSD,我用它来登录Android Studio中的应用程序的新版本。所以我只使用过一个相同的密钥库,使用相同的密码和别名。

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

[UPDATE1]

我已经提取的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 

我指定了正确的releasealias上“生成签名的.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中,将无法正确生成。 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://*.com/questions/36495954/bootstrapapplication-cannot-be-cast-to-applicationclass 

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

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

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

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


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

你确定密钥库是正确的?如果您确信我认为您的密钥库受到了影响,你可以尝试这个链接。 HTTP://计算器。com/questions/13535424/android-keystore-stopped-working – savepopulation

+0

@turtleboy您是在Android Studio中以release或debug模式签署构建版本吗? –

+0

@savepopulation嗨,我在5年前在我的服务器上保存了原始密钥库的副本。今天早些时候,我下载了该密钥存储并将Android Studio指向它。不幸的是我仍然得到相同的信息。所以我不认为我的密钥库本地副本已损坏。 – turtleboy

如果您有旧的apk,可以使用它来获取用于签名的证书的详细信息。 (摘自的APK文件CERT.RSA IT--unziping,然后上运行该文件的OpenSSL的aplication。)

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

然后使用密钥工具(即自带JAVA)从您的密钥存储列出的证书,看看你是否找到一个匹配,或者你认为是否正确的证书确实匹配。

供您参考:

Getting certificate details from an apk

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

+0

嗨,更新问题 – turtleboy

发布测试版或Alpha部分已签署的APK Play商店,如果Play商店拒绝你的apk这意味着你的密钥库是不是原来的钥匙。

如果游戏商店接受你的apk,然后尝试从Play商店更新你已安装的apk。当

如果Play商店中没有列出您的应用程序,你可以从设备拉你以前的APK,并比较两者的APK签名SHA1

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

+0

嗨,我们不使用Play商店,因为apk对服务器应用程序有依赖性,我们的一些300位用户可能位于不同版本的服务器应用程序中。所以我决定在我们的私人服务器上托管apk,这样我们就可以控制哪家公司的手机在升级服务器后升级。从仿真器 – turtleboy

+0

拉APK然后同时检查的APK SHA1 – amorenew

+0

我更新了答案 – amorenew

的SHA1除非你做一些特别的东西,你点击Android Studio中的“播放”按钮,它将使用临时的特定于AS的调试密钥对应用程序进行签名,然后将其安装到设备上。 Eclipse做了一些非常相似的事情。

如果你谈论的是采用Android工作室“生成签名APK”请尝试以下调试步骤:

  • 亚行手动安装APK,看是否仍然出现错误。
  • 通过gradle自己签署apk,看看错误是否仍然存在。

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

+1

嗨,问题更新 – turtleboy