Как заставить Proguard сохранять файл ресурсов .xml?

Я успешно использую proguard для своих приложений для Android.

Однако с одним приложением у меня возникают проблемы.

В этом приложении используется Java-библиотека с файлом .xml, который хранится в пакете.

InputStream istream = Library.class.getResourceAsStream("resource.xml");

Эта библиотека отлично работает, когда proguard отключен. Однако, запуская proguard, кажется, что xml файл просто полностью удален.

Соответствующий proguard.cfg

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
#-dontobfuscate
#-repackageclasses '' //THIS IS DISABLED
-keepattributes *Annotation*
-keepattributes Signature
-verbose
-dontwarn roboguice.activity.RoboMapActivity
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

Любые идеи о том, как заставить сохранить этот XML файл?

Ответ 1

Прежде всего, выяснилось, что использование ant и моего build.xml script вообще не обрабатывало файл ресурсов .xml. Вам нужно будет вручную добавить действие копии в файл build.xml для файлов ресурсов, которые будут скопированы в выходной каталог.

Тем не менее, решив это, proguard испортил мою работу. Решение было:

 -keeppackagenames the.package.where.the.file.is.kept

Это убедило, что файл .xml можно найти, вызвав Library.class.getResource.

Ответ 2

Вы должны добавить новый файл keep.xml в res/raw.

<?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" />

В инструментах: сохранить, вы перечислите макеты, которые вы хотите сохранить. Вы даже можете сохранить специальные рисованные объекты, если вы используете отражение в своем коде, чтобы получить свои

tools:keep="@drawable/ico_android_home_infosperso"

Я предпочитаю добавить tools:shrinkMode="strict", чтобы я ничего не исключал, если только он не используется наверняка. Возможно, вы захотите взглянуть на эту ссылку Сократите код. Не забудьте добавить эти строки в ваши правила Proguard:

-keepattributes InnerClasses -keep class **.R -keep class **.R$* { <fields>; }

Ответ 3

Вы должны хранить файлы в соответствующей папке /res/xml, /res/assets или /res/raw и обращаться к ним через систему управления ресурсами или менеджер активов соответственно. Подробнее о предоставлении ресурсов можно в Руководство для разработчиков Android.