Как я могу заставить 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.