草庐IT

android - 包与同名的现有包冲突

coder 2023-11-27 原文

由于上述消息,我无法安装升级到我的 apk 的问题。

我读过关于 SO 的帖子说当应用程序使用不同的发布 key 签名时会出现此消息。

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。我迁移了旧项目,它构建良好,它将安装到没有安装以前版本的设备上。

我将 keystore 从我的旧硬盘驱动器复制到我的新 SSD,并使用它在 Android Studio 中为应用程序的新版本签名。所以我只使用过一个相同的 keystore ,具有相同的密码和别名。

谁能告诉我为什么 Android 说我的升级是用不同的 key 签名的?

[更新1]

我已经提取了新旧 apk 的 CERT.RSA。他们都使用相同的 keystore 和 key ,但我注意到我使用了错误的发布别名。下面是两个 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

我在单击“生成签名的 Apk”时指定了正确的 releasealias,但仍然出现错误,尽管有所不同。

The package conflicts with an existing package by the same name

. 我尝试使用以下链接手动构建新的 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

.

如果两个应用的 keystore 和指纹都匹配,谁能解释为什么新应用仍然不会升级?

[更新 2]

我刚刚记得当我将 Eclipse 项目导入 Android Studio 时,它无法正确构建。 Appication 对象有问题。我的 Appication 对象称为 NfcScannerApplication,我有一个用相同名称实现的类( list 中也有描述)。

导入到 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 类。这可能是为什么即使我使用相同的 keystore 等,Android 仍认为设备上有同名的不同应用程序的原因吗?

[更新 3] 我好像发现问题了。 :) 我有一个 ContentProvider,它在首次加载应用程序时获取应用程序上下文。我调用 getContext 并将其转换为我的应用程序类。

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

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


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

最佳答案

如果您有旧的 apk,您可以使用它来获取用于签署它的证书的详细信息。 (从 apk 中提取 CERT.RSA 文件 - 解压缩 - 然后在该文件上运行 openssl 应用程序。)

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

然后使用 keytool(Java 自带)列出 keystore 中的证书,看看是否找到匹配项,或者您认为正确的证书是否真的匹配。

供您引用:

Getting certificate details from an apk

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

关于android - 包与同名的现有包冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43278458/

有关android - 包与同名的现有包冲突的更多相关文章

  1. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby-on-rails - 具有同名的模块和类 - 2

    我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use

  4. ruby-on-rails - 在现有数据库上进行 Rails 迁移 - 2

    我正在创建一个新的Rails3.1应用程序。我希望这个新应用程序重用现有数据库(由以前的Rails2应用程序创建)。我创建了新的应用程序定义模型,它重用了数据库中的一些现有数据。在开发和测试阶段,一切正常,因为它在干净的表数据库上运行,但是当尝试部署到生产环境时,我收到如下消息:PGError:ERROR:column"email"ofrelation"users"alreadyexists***[err::localhost]:ALTERTABLE"users"ADDCOLUMN"email"charactervarying(255)DEFAULT''NOTNULL但是我在迁移中有这

  5. ruby-on-rails - Ruby on Rails,使用同名枚举的问题 - 2

    以下是我认为的一些下拉列表:'form-control')%>和'form-control')%>这是我的application_helper.rbdefget_advance_bookingret=[{:require_booking=>'No'},{:require_booking=>'Yes'}]enddefget_instant_bookingret=[{:instant_booking=>'No'},{:instant_booking=>'Yes'}]end但现在的问题是,在我的模型product.rb中,我无法设置具有相同名称的枚举:classProduct我收到的错误是您

  6. ruby-on-rails - ActiveRecord 如何将现有记录添加到 has_many :through relationship in rails? 中的关联 - 2

    在我的Rails项目中,我有三个模型:classRecipe:recipe_categorizationsaccepts_nested_attributes_for:recipe_categories,allow_destroy::trueendclassCategory:recipe_categorizationsendclassRecipeCategorization通过这个简单的has_many:through设置,我怎样才能像这样获取给定的食谱:@recipe=Recipe.first并根据现有类别向此食谱添加类别,并在相应类别上对其进行更新。所以:@category=#Exi

  7. ruby-on-rails - Ruby on Rails - has_one 关系,如何检查它是否具有现有关联? - 2

    我有一个简单的问题,与关联有关。我有一个书的模型,它有_onereservation。预订属于_书本。我想在预订Controller的创建方法中确保在预订时没有预订一本书。换句话说,我需要检查该书是否存在任何其他预订。我该怎么做?编辑:Aaa我做到了,感谢大家的提示,学到了一些新东西。当我尝试提供的解决方案时,出现no_method错误或nil_class等。这让我开始思考,我尝试处理的对象根本不存在。Krule给了我使用book.find的想法,所以我尝试使用它。最终我得到了它的工作:book=Book.find_by_id(reservation_params[:book_id])

  8. ruby - mixin方法名冲突时如何选择调用方法? - 2

    当你在类中包含方法名冲突的模块时,它会使用类定义的方法。有没有办法选择我想运行的?moduleBdefself.hello"helloB"endendclassAincludeBdefself.hello"helloA"endendA.hello#=>thisprints"helloA",whatifIwant"helloB"? 最佳答案 Ben,当你在Ruby中调用一个方法(比如hello)时,会发生以下情况:如果接收者的特征类有一个名为hello的方法,它将被调用。如果不是:如果接收者的类有一个名为hello的实例方法,它将被调

  9. ruby - 在 Ruby + Chef 中检查现有目录失败 - 2

    这是我在ChefRecipe中的一blockRuby:#ifdatadirdoesn'texist,moveoverthedefaultoneif!File.exist?("/vol/postgres/data")execute"mv/var/lib/postgresql/9.1/main/vol/postgres/data"end结果是:Executingmv/var/lib/postgresql/9.1/main/vol/postgres/datamv:inter-devicemovefailed:`/var/lib/postgresql/9.1/main'to`/vol/post

  10. ruby-on-rails - 向现有表添加非空列的问题 - 2

    我在向表中添加不可为空的列时遇到问题。我看了很多关于这个的帖子,它应该是正确的。迁移代码:defchangeadd_column:individual_trainings,:start_on,:timeadd_column:individual_trainings,:end_on,:timechange_column_null:individual_trainings,:start_on,falsechange_column_null:individual_trainings,:end_on,falseend错误:PG::NotNullViolation:ERROR:column"st

随机推荐