由於上述消息,我有一個升級到我的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,請使用下列鏈接:
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);
你確定密鑰庫是正確的?如果您確信我認爲您的密鑰庫受到了影響,你可以嘗試這個鏈接。 HTTP://計算器。com/questions/13535424/android-keystore-stopped-working – savepopulation
@turtleboy您是在Android Studio中以release或debug模式簽署構建版本嗎? –
@savepopulation嗨,我在5年前在我的服務器上保存了原始密鑰庫的副本。今天早些時候,我下載了該密鑰存儲並將Android Studio指向它。不幸的是我仍然得到相同的信息。所以我不認爲我的密鑰庫本地副本已損壞。 – turtleboy