Android maven 插件:renameManifestPackage 导致 Resources$NotFoundException
Android maven plugin: renameManifestPackage results in Resources$NotFoundException
我遇到了以下问题:
我实现的应用程序包括另一个项目作为依赖项(aar 类型)。这两个项目共享相同的父 pom。依赖项包括应用程序正在使用的资源。要访问库项目中的资源,通过调用 context.getResources().getIdentifier(resourceKey, resourceType, packageName)
获取资源 ID。我通过在给定的 context
对象上调用 getPackageName()
来获取包名称。
在使用
更改项目的包名称之前
<renameManifestPackage>com.example.newpackagename</renameManifestPackage>
访问图书馆资源工作正常。但是在重命名应用程序的包名称后,我得到一个 android.content.res.Resources$NotFoundException
因为 getIdentifier()
调用仍然需要应用程序的旧包名称并调用 getPackageName()
returns 新包名称(正如预期的那样)。
现在我想知道我是否遗漏了什么,或者这是 android maven 插件中的错误? https://github.com/simpligility/android-maven-plugin
答案是:我漏掉了什么。我在项目站点 (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);
我遇到了以下问题:
我实现的应用程序包括另一个项目作为依赖项(aar 类型)。这两个项目共享相同的父 pom。依赖项包括应用程序正在使用的资源。要访问库项目中的资源,通过调用 context.getResources().getIdentifier(resourceKey, resourceType, packageName)
获取资源 ID。我通过在给定的 context
对象上调用 getPackageName()
来获取包名称。
在使用
<renameManifestPackage>com.example.newpackagename</renameManifestPackage>
访问图书馆资源工作正常。但是在重命名应用程序的包名称后,我得到一个 android.content.res.Resources$NotFoundException
因为 getIdentifier()
调用仍然需要应用程序的旧包名称并调用 getPackageName()
returns 新包名称(正如预期的那样)。
现在我想知道我是否遗漏了什么,或者这是 android maven 插件中的错误? https://github.com/simpligility/android-maven-plugin
答案是:我漏掉了什么。我在项目站点 (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);