Как заставить 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.