Как заставить Proguard сохранить мой файл ресурсов .xml? - PullRequest
10 голосов
/ 01 мая 2011

Я успешно использую 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 ]

8 голосов
/ 03 мая 2011

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

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

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

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

5 голосов
/ 05 июня 2018

Вы должны добавить новый файл 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>; }

1 голос
/ 01 мая 2011

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

...