Android:"shrinkResources true"保留所有可绘制对象,但删除其他未使用的资源



我有一个项目,其中包含许多可抽签的项目,该项目以" A"或" B"开始命名(例如A1_back,A2_back,B1_Start,B2_Start,B2_Start和Merany More)。这些可绘制的物品不是在代码中使用的,而是由以下代码使用:

String name = image.getName();//getName() returns for examle "a1_back"
res = getResources().getIdentifier(name, "drawable", getPackageName());

因此,在代码中没有任何地方使用特定的字符串" a1_back"。这就是为什么当我设置" 缩小的true "时,我所有以" A"one_answers" B"开头的可抽签。

我已经读到,您可以指定哪些资源继续使用以下XML文件:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used_c"
    tools:discard="@layout/unused2" />

但是我有很多可抽签的方法,不想单独指定每个物品。有没有办法在"工具:保持"中设置模式(保持所有可抽签以" a"或" b"开头)或使其在项目中保留所有可绘制的物品,但请删除其他未使用的资源?

预先感谢!:)

有一个可以使用的解决方法。为您要保留的所有抽签添加一个前缀

@Nullable
private Drawable getDrawableByName(@NonNull final Context context, @NonNull final String name) {
    final String prefixName = String.format("prefix_%s", name);
    return getDrawable(context, prefixName);
}
@Nullable
protected Drawable getDrawable(@NonNull final Context context, @NonNull final String name) {
    final Resources resources = context.getResources();
    final int resourceId = resources.getIdentifier(name, "drawable", context.getPackageName());
    try {
        return resources.getDrawable(resourceId, context.getTheme());
    } catch (final Resources.NotFoundException exception) {
        return null;
    }
}

这里的技巧

final String prefixName = String.format("prefix_%s", name);

资源收缩机制分析了所有带有" prefix_"的可绘制物的方法,并且它不会触及这些文件。

动态访问资源时,使用此示例中的Android用户指南中的解释

String name = String.format("img_%1d", angle + 1);
res = getResources().getIdentifier(name, "drawable", getPackageName());

其他答案有效,但如果您想确保保留资源,则可以指导XML中的明确说明的构建工具。

Google描述了如何使用keep.xml文件与模式匹配的方式:https://developer.android.com/studio/build/shrink-code-code#keep-weame-resources

这是Google使用的示例,请注意*的使用:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

您还可以检查构建文件build/outputs/mapping/debug/resources.txt以说明保留了哪些资源,哪些资源以及为什么。

最新更新