Как указать вред для proguard в файлах сборки градиента android для библиотек, которые вытаскиваются из центра maven

Есть ли способ передать библиотеки, вытащенные из maven central в качестве накладок для proguard? Я хочу, чтобы они были запутаны. Контекст: удалить неиспользуемые классы с помощью proguard для Android

Я никогда не использовал Maven, и я использую Gradle, но либо строю syste, то же самое, я полагаю. И я не думаю, что то, что вы хотите, возможно …

-injars слово -injars относится к файлу конфигурации ProGuard, который является текстовым файлом, считанным инструментами построения.

Единственный способ, который я вижу, это то, что если вы создадите какой-то скрипт, который будет для вас. То есть, прочитайте все зависимости от Maven, создайте соответствующий файл конфигурации ProGuard, указав все необходимые -injars и передайте его процессу сборки. Не уверен, насколько это возможно с Maven.

Это не должно быть слишком сложно с Gradle. С Gradle вы можете легко передать несколько файлов конфигурации ProGuard, и вы можете просто создать метод в файле build.gradle чтобы получить все местоположения файлов .jar из зависимостей и создать временный текстовый файл, который вы затем перейдете в конфигурацию ProGuard.

Я бы предположил, что тот же процесс будет работать с Maven, но опять же, я никогда не использовал его.

EDIT: Я вижу, теперь вопрос задал Грэдль конкретно. Мой ответ для Ant, но это может дать вам идеи.

Полное решение включает следующие этапы:

  1. Создайте собственный файл build.xml
  2. Скопируйте и измените цель «обфускации», чтобы использовать травмы
  3. Используйте значки из каталога, куда их кладет Maven
  4. Автоматизируйте Maven, чтобы поместить банки в каталог. И здесь я потерялся. Недостаточно опыта работы с gradle / maven.

Шаги в деталях:

1. Пользовательский build.xml

В build.xml добавьте «custom», как таковой:

 <!-- version-tag: custom --> <import file="${sdk.dir}/tools/ant/build.xml" /> 

Перед этим битом вставьте код ниже или поместите его в отдельный файл (general-build.xml) и импортируйте его в файл build.xml.

2. Цель

Вставьте следующее:

 <!-- Obfuscate target This is only active in release builds when proguard.config is defined in default.properties. To replace Proguard with a different obfuscation engine: Override the following targets in your build.xml, before the call to <setup> -release-obfuscation-check Check whether obfuscation should happen, and put the result in a property. -debug-obfuscation-check Obfuscation should not happen. Set the same property to false. -obfuscate check if the property set in -debug/release-obfuscation-check is set to true. If true: Perform obfuscation Set property out.dex.input.absolute.dir to be the output of the obfuscation --> <target name="-obfuscate"> <if condition="${proguard.enabled}"> <then> <property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard" /> <property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar" /> <property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar" /> <!-- input for dex will be proguard's output --> <property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}" /> <!-- Add Proguard Tasks --> <property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar" /> <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}" /> <!-- Set the android classpath Path object into a single property. It'll be all the jar files separated by a platform path-separator. Each path must be quoted if it contains spaces. --> <pathconvert property="project.target.classpath.value" refid="project.target.class.path"> <firstmatchmapper> <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/> <identitymapper/> </firstmatchmapper> </pathconvert> <!-- Build a path object with all the jar files that must be obfuscated. This include the project compiled source code and any 3rd party jar files. --> <path id="project.all.classes.path"> <pathelement location="${preobfuscate.jar.file}" /> <path refid="project.all.jars.path" /> </path> <!-- Set the project jar files Path object into a single property. It'll be all the jar files separated by a platform path-separator. Each path must be quoted if it contains spaces. --> <pathconvert property="project.all.classes.value" refid="project.all.classes.path"> <firstmatchmapper> <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/> <identitymapper/> </firstmatchmapper> </pathconvert> <!-- Turn the path property ${proguard.config} from an A:B:C property into a series of includes: -include A -include B -include C suitable for processing by the ProGuard task. Note - this does not include the leading '-include "' or the closing '"'; those are added under the <proguard> call below. --> <path id="proguard.configpath"> <pathelement path="${proguard.config}"/> </path> <pathconvert pathsep='" -include "' property="proguard.configcmd" refid="proguard.configpath"/> <!-- INSERT SOME MAVEN STORAGE DIR BELOW --> <echo level="info">PROJECT.ALL.CLASSES.VALUE === ${project.all.classes.value}</echo> <echo level="info">PROJECT.TARGET.CLASSPATH.VALUE === ${project.target.classpath.value}</echo> <property name="project.all.classes.value2" value="${project.all.classes.value}:/some-maven-dir"/> <echo level="info">PROJECT.ALL.CLASSES.VALUE2 === ${project.all.classes.value2}</echo> <mkdir dir="${obfuscate.absolute.dir}" /> <delete file="${preobfuscate.jar.file}"/> <delete file="${obfuscated.jar.file}"/> <jar basedir="${out.classes.absolute.dir}" destfile="${preobfuscate.jar.file}" /> <proguard> -include "${proguard.configcmd}" -include "${out.absolute.dir}/proguard.txt" -injars ${project.all.classes.value2} -outjars "${obfuscated.jar.file}" -libraryjars ${project.target.classpath.value}(!META-INF/MANIFEST.MF,!META-INF/NOTICE.txt,!META-INF/LICENSE.txt) -dump "${obfuscate.absolute.dir}/dump.txt" -printseeds "${obfuscate.absolute.dir}/seeds.txt" -printusage "${obfuscate.absolute.dir}/usage.txt" -printmapping "${obfuscate.absolute.dir}/mapping.txt" -printconfiguration "${obfuscate.absolute.dir}/used_config.txt" </proguard> </then> </if> </target> 

Другой способ сделать это – скопировать в банки только временные (тот же метод используется для регулярных зависимостей Java-проектов, которые не являются проектами библиотеки Android):

 <property name="lib.javalib1.project.dir" location="${basedir}/../../some-maven-dir" /> <target name="-pre-build"> <subant buildpath="${lib.javalib1.project.dir}" target="package" failonerror="true" /> <copy todir="${basedir}/libs" failonerror="true" verbose="true"> <fileset dir="${lib.javalib1.project.dir}/bin"> <filename name="general-api.jar"/> </fileset> </copy> </target> <target name="-post-package"> <delete verbose="true"> <fileset dir="${basedir}/libs" includes="general-api.jar" /> </delete> </target> 

Но он компилирует банки один за другим и копирует их, поэтому для Maven, где банки уже доступны, это недостаток.

3. Maven dir

«/ Some-maven-dir» – это каталог, в котором хранятся банки.

4. Автоматизация Maven

Я не могу помочь здесь, но я предложил предложение для первой части. Возможно, кто-то может продолжить это.