Android:使“shrinkResources true”保留所有可绘制项,但删除其他未使用的资源

bvhaajcl  于 2023-03-28  发布在  Android
关注(0)|答案(3)|浏览(139)

我有一个项目,其中包含许多可绘制对象,它们的名称以“a”或“b”开头(例如a1_back,a2_back,b1_start,b2_start等等)。这些可绘制对象不在代码中使用,但在以下代码中使用:

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

所以,在代码中没有使用特定的字符串“a1_back”。这就是为什么当我设置“shrinkResources true”时,所有以“a”和“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" />

但是我有很多可绘制对象,不想单独指定每一个。有没有一种方法可以在“tools:keep”中设置一个模式(以保留所有以“a”或“b”开头的可绘制对象),或者让它保留项目中的所有可绘制对象,但删除其他未使用的资源?
提前感谢!:)

bnl4lu3b

bnl4lu3b1#

有一个解决方法可以使用。为所有要保留的可绘制对象添加前缀

@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);

资源收缩机制分析所有前缀为“_”的可绘制项都可以使用,并且不涉及这些文件。

rekjcdws

rekjcdws2#

动态访问资源时,请使用Android User Guide中使用此示例说明的技巧

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

2guxujil3#

其他答案也可以,但如果您想加倍确保资源得到保留,您可以使用XML中的显式指令来指导构建工具。
Google在这里描述了如何使用keep.xml文件进行模式匹配:https://developer.android.com/studio/build/shrink-code#keep-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,了解哪些资源被保留,哪些资源没有被保留,以及为什么要保留。

相关问题