Как я могу заставить 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-файл сохранить?

3 ответа

Решение

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

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

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

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

Вы должны добавить новый файл 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" так что я делаю сюр, ресурс не исключается, если он не используется наверняка. Возможно, вы захотите взглянуть на эту ссылку. Сократите код. Не забудьте добавить эти строки в ваши правила Pro guard:

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

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

Другие вопросы по тегам