当我在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)
答案 0 :(得分:1)
答案 1 :(得分:0)
在我的项目中,我将在Gradle文件中使用manifestPlaceholders
变量:
manifestPlaceholders = [appname: "My App"]
然后在清单中,执行以下操作:
android:label="${appname}"
这使您可以为不同的构建类型使用不同的应用程序名称(如果愿意的话)