代码之家  ›  专栏  ›  技术社区  ›  phil155

Android maven-plugin:renameManifestPackage导致资源$NotFoundException

  •  5
  • phil155  · 技术社区  · 8 年前

    我遇到了以下问题: 我实现的应用程序包含另一个项目作为依赖项(aar类型)。两个项目共享同一个父pom。依赖关系包括应用程序正在使用的资源。要访问库项目中的资源,可以通过调用 context.getResources().getIdentifier(resourceKey, resourceType, packageName) 。我通过调用获取包名称 getPackageName() 在给定的 context 对象 在使用更改项目的包名称之前

    <renameManifestPackage>com.example.newpackagename</renameManifestPackage> 
    

    访问图书馆资源工作得很好。但在重命名应用程序的程序包名称后,我得到一个 android.content.res.Resources$NotFoundException 因为 getIdentifier() call仍然需要应用程序的旧包名称,并调用 获取软件包名称() 返回新值(如预期)。
    现在我想知道我是否遗漏了什么,或者这是安卓maven插件中的一个bug? https://github.com/simpligility/android-maven-plugin

    1 回复  |  直到 8 年前
        1
  •  2
  •   phil155    8 年前

    答案是:我错过了一些东西。我在项目现场就这个问题开了一张罚单( https://github.com/simpligility/android-maven-plugin/issues/736 ). 事实证明,我所看到的问题是 renameManifestPackage 配置,因为重命名清单包和资源都超出了此配置的范围。

    然而,有一个不太糟糕的变通方法:

    而不是从 Context 对象,则可以从 Resources 对象这部分有点难看:需要添加一个仅用于检索包名称的资源,因为其他资源通常会发生更改:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!-- The only purpose of this resource is to retrieve the resource package name -->
        <item name="used_for_package_name_retrieval" type="id"/> 
    </resources>
    

    Resources resources = context.getResources();
    String packageName = resources.getResourcePackageName(R.id.used_for_package_name_retrieval);
    

    学分为: http://www.piwai.info/renaming-android-manifest-package/