Создание запутанной библиотеки из проекта библиотеки Android - PullRequest
1 голос
/ 07 октября 2011

Я написал приложение для Android, используя проект библиотеки Android, также написанный мной.Я должен выпустить исходный код приложения, но я не хочу распространять исходные коды библиотеки.Эта библиотека, помимо прочего, определяет настраиваемые представления, поэтому она включает макеты и ресурсы XML.Я думал о выпуске этой библиотеки в двоичном виде (возможно, .jar?), На который будет ссылаться основной проект.Я хочу, чтобы эта двоичная библиотека была запутана через Proguard.Это возможно?Как?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 12 декабря 2012

Как уже упоминал Моррисон Чанг, в настоящее время нет никакого способа выпустить проект библиотеки Android в качестве jar-файла, и нет никакого способа запутать проект, за исключением исходного кода java.Однако есть способ запутать исходный код, хотя это официально не поддерживается.

Все, что вам нужно сделать, это запустить команду «ant clean release» в вашей библиотеке.Запутанный источник записывается в «bin / proguard / obfuscated.jar».Просто поместите этот jar-файл в каталог libs вашего экспортированного библиотечного проекта и удалите содержимое каталога src, и вы в значительной степени сделали это.

Однако есть один метод с вышеуказанным подходом.Он не совсем правильно обращается с ресурсами.Чтобы это исправить, вы должны удалить все классы ресурсов (R.class и R $ *. Class) из вашей копии obfuscated.jar.Это в свою очередь потребует от вас отключить запутывание для этих классов ресурсов.Это можно сделать, добавив в файл proguard-project.txt следующее:

-keep public class **.R {
  public *;
}
-keep public class **.R$* {
  public *;
}

Для справки, вот цель муравья, которую я использую для создания обфусцированного проекта библиотеки Android без исходного кода:

<?xml version="1.0" encoding="UTF-8"?>
<project name="library_rules" default="librelease">
  <target name="librelease" depends="release"
      description="Build a sourceless and obfuscated android library.">
    <property name="libname" value="myProject" />
    <property name="librelease.dir" location="bin/${libname}" />
    <delete file="${librelease.dir}"/>
    <mkdir dir="${librelease.dir}"/>
    <mkdir dir="${librelease.dir}/libs"/>
    <mkdir dir="${librelease.dir}/src"/>
    <copy todir="${librelease.dir}/res">
      <fileset dir="res"/>
    </copy>
    <copy file="AndroidManifest.xml" todir="${librelease.dir}" />
    <copy file="ant.properties" todir="${librelease.dir}" />
    <copy file="build.xml" todir="${librelease.dir}" />
    <copy file="project.properties" tofile="${librelease.dir}/project.properties" />
    <jar destfile="${librelease.dir}/libs/${libname}.jar">
      <zipfileset src="bin/proguard/obfuscated.jar" excludes="**/R.class,**/R$$*.class"/>
    </jar>
  </target>
</project>

Экспортируемый проект библиотеки Android будет расположен в bin / myProject.Это было протестировано с использованием инструментов Android SDK v20.0.3 и v21.

1 голос
/ 07 октября 2011

Я не думаю, что вы можете получить то, что вы хотите. Проект библиотеки Android - это полноценный проект Android, содержащий все упомянутые вами ресурсы. Если вы хотите запутать чистый код, чтобы был виден только ваш API, вы можете создать его через Proguard. Однако, поскольку Proguard может обрабатывать только файлы Java, он не знает о Android xml и ресурсах, которые требуют цепочки инструментов Android SDK для упаковки в APK. Короче говоря, если просто Java-код во внешнем jar-файле (который может вызывать API-интерфейсы Android), вы можете Proguard. Если вы думаете о других ресурсах Android, я не верю.

...