与现有软件包相同名称的软件包冲突
由于上述消息,我有一个升级到我的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);
如果您有旧的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)从您的密钥存储列出的证书,看看你是否找到一个匹配,或者你认为是否正确的证书确实匹配。
供您参考:
嗨,更新问题 – 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?
的SHA1除非你做一些特别的东西,你点击Android Studio中的“播放”按钮,它将使用临时的特定于AS的调试密钥对应用程序进行签名,然后将其安装到设备上。 Eclipse做了一些非常相似的事情。
如果你谈论的是采用Android工作室“生成签名APK”请尝试以下调试步骤:
- 亚行手动安装APK,看是否仍然出现错误。
- 通过gradle自己签署apk,看看错误是否仍然存在。
如果这两个步骤都不起作用,我认为假设您之前没有使用相同的密钥是合理安全的。
嗨,问题更新 – turtleboy
你确定密钥库是正确的?如果您确信我认为您的密钥库受到了影响,你可以尝试这个链接。 HTTP://计算器。com/questions/13535424/android-keystore-stopped-working – savepopulation
@turtleboy您是在Android Studio中以release或debug模式签署构建版本吗? –
@savepopulation嗨,我在5年前在我的服务器上保存了原始密钥库的副本。今天早些时候,我下载了该密钥存储并将Android Studio指向它。不幸的是我仍然得到相同的信息。所以我不认为我的密钥库本地副本已损坏。 – turtleboy