由于上述消息,我遇到了无法安装升级到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编写,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
点击“生成签名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时,它无法正确构建。应用程序对象出现问题。我的应用程序对象称为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
它使用反射来获取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);
答案 0 :(得分:0)
如果游戏商店拒绝你的apk表示你的密钥库不是原始密钥,则将你签名的apk发布到测试版或alpha版的游戏商店。
如果Play商店接受了你的apk,那么尝试从Play商店更新你安装的apk。
如果您的应用未在Play商店中列出,则可以从设备中提取您之前的apk并比较两个APK签名SHA1
获取apk的SHA1 How do I find out which keystore was used to sign an app?
答案 1 :(得分:0)
除非你做一些特别的事情,否则当你点击" Play" Android Studio中的按钮将使用临时的AS特定调试密钥对应用进行签名,然后将其安装到您的设备上。
Eclipse做了非常相似的事情。
如果您正在谈论使用Android工作室"生成签名APK"然后尝试以下调试步骤:
如果这两个步骤都不起作用,我认为假设您没有使用之前的相同密钥是合理安全的。
答案 2 :(得分:0)
如果你有旧的apk,你可以用它来获取用于签名的证书的详细信息。 (从apk -unziping it-中提取CERT.RSA文件,然后在该文件上运行openssl应用程序。)
unzip -p App.apk META-INF/CERT.RSA |openssl pkcs7 -inform DER -noout -print_certs -text
然后使用keytool(java附带)列出密钥库中的证书,看看是否找到匹配项,或者您认为正确的证书是否真正匹配。
供您参考: