2017-04-07 343 views
7

由於上述消息,我有一個升級到我的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://stackoverflow.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

回答

0

如果您有舊的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

0

發佈測試版或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

0

的SHA1除非你做一些特別的東西,你點擊Android Studio中的「播放」按鈕,它將使用臨時的特定於AS的調試密鑰對應用程序進行簽名,然後將其安裝到設備上。 Eclipse做了一些非常相似的事情。

如果你談論的是採用Android工作室「生成簽名APK」請嘗試以下調試步驟:

  • 亞行手動安裝APK,看是否仍然出現錯誤。
  • 通過gradle自己簽署apk,看看錯誤是否仍然存在。

如果這兩個步驟都不起作用,我認爲假設您之前沒有使用相同的密鑰是合理安全的。

+1

嗨,問題更新 – turtleboy

相關問題