Фактическая часть Proguard заканчивается, но затем dex больше не может преобразовывать полученный байт-код.Декс считает LocalVariableTable
неправильным.Эрик Лафортун - лучший источник для объяснения причины (см. Его ответ).
Проблема исчезнет, если вы не только не запутываете, но и пропускаете этап оптимизации (-dontoptimize
).Но вы хотите иметь это для уменьшения размера.Другой способ решить эту проблему - сбросить флаги отладки в javac
и dex
.Единственная проблема в том, что тогда у вас не будет правильных стековых трасс.Вы получите строки трассировки стека без информации об исходном файле или номера строк, такие как:
net.lp.collectionista.domain.items.book.BookItem.getCoverImageForFormField(Unknown Source)
Вы можете сделать это, добавив debug="false"
в тег javac
в муравье main-rules.xml
(вы можете захотетьсначала скопируйте часть в build.xml
).Это установит флаг javac -g:none
.Вы также должны настроить dex, и это сложнее сделать в предоставленном шаблоне ant.Я скопировал макрос dex-helper
, убедился, что он используется, и добавил тег условия, окружающий вызовы dex:
<echo>Converting compiled files and external libraries into ${intermediate.dex.file}...</echo>
<if condition="debug">
<then>
<apply executable="${dx}" failonerror="true" parallel="true">
<arg value="--dex" />
<arg value="--output=${intermediate.dex.file}" />
<extra-parameters />
<arg line="${verbose.option}" />
<arg path="${out.dex.input.absolute.dir}" />
<path refid="out.dex.jar.input.ref" />
<external-libs />
</apply>
</then>
<else>
<apply executable="${dx}" failonerror="true" parallel="true">
<arg value="--dex" />
<arg value="--output=${intermediate.dex.file}" />
<arg value="--no-locals" /><!-- otherwise dex fails on the proguard bytecode -->
<extra-parameters />
<arg line="${verbose.option}" />
<arg path="${out.dex.input.absolute.dir}" />
<path refid="out.dex.jar.input.ref" />
<external-libs />
</apply>
</else>
</if>
Это --no-locals
, который делает это.
Чтобы уменьшить потерю информации о трассировке стека, которую вы можете использовать, соответственно, для информации о номере строки и информации об именах классов и методов:
-keepattributes SourceFile, LineNumberTable
-keep,allowshrinking,allowoptimization class * { <methods>; }
Таким образом, вы можете сделать частичное запутывание, и при этом иметь эквивалентхорошие трассировкиТем не менее, я все же предлагаю вам создавать и сохранять файлы сопоставления после выпуска.
Помимо всего этого не следует указывать -keepattributes LocalVariableTable,LocalVariableTypeTable
и в равной степени -keepparameternames
(если вы запутываете, это само по себе может васв неприятности тоже).Обратите внимание, что второе подразумевает первое, хотя из его названия может быть неясно, что оно влияет на атрибуты.
Лично, и ввиду других проблем с Proguard, я решил сделать запутывание, но минимизировать потериинформации о трассировке стека.Я еще не попробовал предложение @ plowman.
Для получения более подробной информации вы можете найти файлы моего проекта с контролем версий здесь: