当字符串资源用作Android应用程序标签时,PackageManager异常

时间:2019-04-30 01:01:30

标签: android

当我在AndroidManifest.xml的@string/my_app_name标记下的android:label中使用字符串资源(<application>)时,突然发现安装时引发异常。仅在安装或更新应用程序时才会引发该异常。 my_app_name在应用程序的其他位置使用,没有任何错误。

我的xml文件最近没有更改,但是这种例外只是最近才开始出现。它可能与Android Studio,Gradle或API更新相关,但我不确定此异常开始与哪个特定更新一起出现。我正在运行所有组件的最新稳定版本(Android Studio 3.4,Gradle 5.1.1,针对Android API 28)。重新启动Android Studio,清理,重建,清除缓存等都无济于事。

我确定它是label属性,因为它是引用的字符串,并且如果将android:label@string/my_app_name更改为硬编码文本,该异常将消失。我在做什么错了?

AndroidManifest.xml(为简洁起见进行了修剪):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mycompany.myapp"
    android:installLocation="internalOnly"
    android:versionCode="123"
    android:versionName="1.23"
    >

    ...permission-related things...

    <application
        android:allowBackup="true"
        android:allowClearUserData="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/my_app_name"
        android:theme="@style/Theme.AppCompat"
        tools:ignore="GoogleAppIndexingWarning">

        <activity
        ...activity-related things...
        </activity>

        <service
        ...service-related things...
        </service>

    </application>

</manifest>

Strings.xml(为简洁起见进行了修剪):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="my_app_name">My App</string>
    ...
</resources>

logcat输出:

2019-04-29 20:29:39.384 22487-22534/? W/PackageManager: Failure retrieving text 0x7f10002a in package com.mycompany.myapp
    android.content.res.Resources$NotFoundException: String resource ID #0x7f10002a
        at android.content.res.Resources.getText(Resources.java:348)
        at android.app.ApplicationPackageManager.getText(ApplicationPackageManager.java:1678)
        at android.content.pm.PackageItemInfo.loadUnsafeLabel(PackageItemInfo.java:204)
        at android.content.pm.PackageItemInfo.loadLabel(PackageItemInfo.java:194)
        at tvw.f(SourceFile:32)
        at tvw.c(SourceFile:1)
        at txt.c(SourceFile:7)
        at ude.run(Unknown Source:2)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at ifd.run(Unknown Source:5)
        at java.lang.Thread.run(Thread.java:764)

2 个答案:

答案 0 :(得分:1)

经过更多研究,我发现了类似的错误:

从“设置”→“构建,执行,部署”→“即时运行”中禁用“即时运行”,然后取消选中“启用即时运行”(只需取消选中该框)

SO

答案 1 :(得分:0)

在我的项目中,我将在Gradle文件中使用manifestPlaceholders变量:

 manifestPlaceholders = [appname: "My App"]

然后在清单中,执行以下操作:

android:label="${appname}"

这使您可以为不同的构建类型使用不同的应用程序名称(如果愿意的话)