2011-01-07 16 views

Odpowiedz

12

znalazłem rozwiązanie:

  1. Get Proguard - kopia proguard.jar do znanego katalogu (słownie myproject/PROGUARD)
  2. Przygotuj proguard.cfg -describing co i jak optymalizować/Niewidoczność. Ten proces opisany dokładnie w Proguard na manual
  3. Przygotuj następujące build.xml Ant (lub smth jak ten) - wielki thanx this guy

UPDATE kompletny build.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project name="MyProject" default="zipalign" basedir="."> 
    <property name="target" value="android-8"/> 
    <!--property file="default.properties" /--> 
    <property name="encoding" value="UTF-8"/> 

    <!-- dirs --> 
    <property name="sdk.dir" location="Location of Android SDK"/> 
    <property name="proguard.dir" value="proguard" /> 
    <property name="src.dir" value="src"/> 
    <property name="gen.dir" value="gen"/> 
    <property name="res.dir" value="res"/> 
    <property name="assets.dir" value="assets"/> 
    <property name="libs.dir" value="libs"/> 
    <property name="out.classes.unoptimized.dir" value="out"/> 
    <property name="out.classes.optimized.dir" value="out/optimized"/> 

    <!-- files --> 
    <property name="manifest.file" value="AndroidManifest.xml"/> 
    <property name="signed.apk" value="${ant.project.name}-signed.apk"/> 
    <property name="unsigned.apk" value="${ant.project.name}-unsigned.apk"/> 
    <property name="final.apk" value="${ant.project.name}.apk"/> 
    <property name="android.jar" value="${sdk.dir}/tools/platforms/${target}/android.jar"/> 
    <property name="unoptimized" value="unoptimized.jar" /> 
    <property name="optimized" value="optimized.jar" /> 
    <property name="proguard.config" value="${proguard.dir}/proguard.cfg"/> 

    <!-- tools --> 
    <property name="dx.jar" value="${sdk.dir}/platform-tools/lib/dx.jar"/> 
    <property name="aapt" value="${sdk.dir}/platforms/${target}/tools/aapt.exe"/> 
    <property name="zipalign" value="${sdk.dir}/tools/zipalign.exe"/> 
    <property name="jarsign" value="jarsigner.exe location is here"/> 
    <property name="keystore" value="Your key store is here"/> 
    <property name="keyalias" value="Your key alias is here"/> 


    <path id="android.antlibs"> 
     <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" /> 
     <pathelement path="${sdk.dir}/tools/lib/jarutils.jar" /> 
    </path> 

    <taskdef name="setup" 
     classname="com.android.ant.SetupTask" 
     classpathref="android.antlibs" /> 
    <setup import="false"/> 

    <!--taskdef name="aaptexec" 
      classname="com.android.ant.AaptExecLoopTask" 
      classpathref="android.antlibs" /--> 

    <target name="clean" description="Removes output files created by other targets."> 
     <echo>Cleaning...</echo> 
     <delete dir="${out.classes.unoptimized.dir}" verbose="true" /> 
     <delete dir="${out.classes.optimized.dir}" verbose="true" /> 
    </target> 

    <target name="dirs"> 
     <echo>Creating output directories if needed...</echo> 
     <mkdir dir="${out.classes.unoptimized.dir}" /> 
     <mkdir dir="${out.classes.optimized.dir}" /> 
    </target> 

    <!-- Compiles this project's .java files into .class files. --> 
    <target name="compile" depends="dirs" 
      description="Compiles project's .java files into .class files"> 
     <echo>Compiling sources...</echo> 
     <javac encoding="${encoding}" target="1.6" debug="true" extdirs="" 
       destdir="${out.classes.unoptimized.dir}" 
       bootclasspathref="android.target.classpath" 
       includeantruntime="true"> 
      <src path="${src.dir}" /> 
      <src path="${gen.dir}" /> 
      <classpath> 
       <fileset dir="${libs.dir}" includes="*.jar" /> 
      </classpath> 
     </javac> 
    </target> 

    <target name="preobfuscate" depends="compile"> 
     <echo>Preparing to obfuscation...</echo> 
    <jar destfile="${unoptimized}" 
     basedir="${out.classes.unoptimized.dir}" 
     includes="**/**" 
     excludes="optimized/**" 
     /> 
    </target> 

    <!-- Obfuscation with ProGuard --> 
    <target name="optimize" unless="nooptimize" depends="preobfuscate"> 
     <echo>Proguard obfuscation...</echo> 
     <java jar="${proguard.dir}/proguard.jar" fork="true" failonerror="true"> 
      <jvmarg value="-Dmaximum.inlined.code.length=16" /> 
      <arg value="@${proguard.dir}/proguard.cfg" /> 
      <arg value="-injars ${unoptimized}" /> 
      <arg value="-outjars ${optimized}" /> 
      <arg value="-libraryjars ${android.jar}" /> 
     </java> 
     <unzip src="${optimized}" dest="${out.classes.optimized.dir}" /> 
     <!-- Delete optimized jar (now unzipped into bin directory) --> 
     <delete file="${optimized}"/> 
     <delete file="${unoptimized}"/> 
    </target> 

    <target name="dex" description="Converting JVM bytecodes into Dalvik bytecodes" depends="optimize"> 
     <echo>Converting bytecodes to Dalvik VM bytecodes...</echo> 
     <java jar="${dx.jar}" fork="true"> 
      <arg line="--dex --verbose --output=${out.classes.optimized.dir}/classes.dex ${out.classes.optimized.dir}"/> 
     </java> 
    </target> 

    <target name="aapt" depends="dex" description="compile resources"> 
     <echo>Packing resources...</echo> 
     <exec executable="${aapt}" logerror="true" osfamily="windows"> 
      <arg line="p 
      -f 
      -M ${manifest.file} 
      -I ${android.jar} 
      -S ${res.dir} 
      -A ${assets.dir} 
      -F ${out.classes.optimized.dir}/${unsigned.apk} 
      -m -J ${gen.dir}"/> 
     </exec> 
    </target> 

    <target name="sign" depends="aapt" description="sign apk"> 
     <input message="Please enter keystore password (store:${keystore}):" 
         addproperty="keystore.password" /> 
     <echo>Signing apk...</echo> 
     <exec executable="${jarsign}" logerror="true" osfamily="windows"> 
      <arg line="-verbose 
      -keystore ${keystore} 
      -storepass ${keystore.password} 
      -signedjar ${out.classes.optimized.dir}/${signed.apk} 
      ${out.classes.optimized.dir}/${unsigned.apk} ${keyalias}"/> 
     </exec> 
    </target> 

    <target name="zipalign" depends="sign" description="zip align"> 
     <echo>Aligning apk...</echo> 
     <exec executable="${zipalign}" logerror="true" osfamily="windows"> 
      <arg line="-f 
      -v 
      4 
      ${out.classes.optimized.dir}/${signed.apk} 
      ${final.apk}"/> 
     </exec> 
    </target> 

</project> 
  1. To zadanie ANT musi zostać dodane do zadań budowniczych Eclipse (Właściwości/Builders) po twórcy Javy i twórcy pakietów Androida.

  2. Prasa "Build All" (lepiej off Automatyczna kontrola budowy w menu Eclipse)

+0

czy opublikujesz kompletny build.xml? – eros

+0

nie można znaleźć jarutils.jar – eros

+0

Dlaczego dodałeś "lepiej wyłączyć sprawdzanie kompilacji automatycznej w menu Eclipse"? Czy jest to znacznie wolniejsze od domyślnych kreatorów Eclipse Java/Android? Jeśli tak, czy to tylko z powodu kroku Proguard, czy też proces budowania mrówek jest zły w wykrywaniu zależności? –

9

Proces kompilacji systemu Android najpierw kompiluje pliki źródłowe Java (.java) do plików klasy Java (.class) , a następnie konwertuje te pliki klas do kodu Dalvik (classes.dex), a na końcu pakuje ten kod Dalvik do pliku APK.

ProGuard odczytuje i zapisuje pliki klasy Java, więc musi zostać wstawiony do tego potoku między etapem kompilacji a krokiem konwersji. Nie czyta ani nie pisze samego kodu Dalvik, więc nie może działać na pliku APK.

The Android SDK documentation on ProGuard omawia, jak włączyć krok zaciemniania w kompilacji Ant dla Androida-9. W skrócie, musisz dodać wiersz "proguard.config = proguard.cfg" do pliku default.properties, a następnie uruchomić "release ant".

+1

Nie jest to dokładnie to, o co prosiłem ... Buduję plik APK systemu Android od wewnątrz IDE (Intellij) i przed kompilacją lub po kompilacji mogę uruchomić dowolne zadanie kompilacji ANT. Czy możliwe jest zdefiniowanie w tym celu oddzielnego zadania ANT? – barmaley

+2

Ponieważ krok ProGuard musi zostać wykonany w środku potoku budowania, nie można po prostu dodać zadania Ant przed lub po kompilacji IDEA. Musisz utworzyć skrypt Ant build.xml dla całego procesu kompilacji i zmodyfikować go. Polecenie android z zestawu SDK systemu Android tworzy dla Ciebie plik Ant. Alternatywnie IDEA może utworzyć dla Ciebie plik Ant (Build> Generuj kompilację Ant ...). Wtyczka IDEA dla systemu IDEA wydaje się już tworzyć plik Ant za pomocą zestawu SDK systemu Android. Następnie możesz uruchomić kompilację Ant z IDEA (pasek menu po prawej, zakładając, że wtyczka Ant jest włączona). –

1

Proces obfuskacji proGuard wymaga plików .class, więc nie można uruchomić Anta przed budową IDE (.java) lub po (.dex).

rzucić okiem na to stanowisko, gdzie wyjaśnił, w jaki sposób dodać krok PROGUARD w globalnej Ant produkcji:

http://www.androidengineer.com/2010/07/optimizing-obfuscating-and-shrinking.html

Jeśli naprawdę chcesz skorzystać z wbudowanych idea, można spróbować wykonać następujące czynności.

  • Po kompilacji IDEA rozpakuj pakiet apk z apktoolem.
  • Konwersja .dex pliki .class z dex2jar
  • Run PROGUARD jak poprzedniego postu koncert ty

Przepraszam, że nie przywiązują cię więzi apktool i dexjar ale jak jestem nowicjuszem Nie mogę opublikować więcej niż jednego hiperłącza.

+0

Wiem, ale potrzebuję po prostu build.xml dla Anta :) – barmaley

3

Uwaga: odpowiedź barmaley jest od 2011 roku, i wydają się być ważne dla systemu Android w wersji SDK Tools albo 8 lub 10.

próbowałem dostosowania tego rozwiązania przy użyciu Android SDK Tools w wersji 18.1.1, ale trzymane na braku błędu:
taskdef class com.android.ant.SetupTask cannot be found

Nawet tually, co zrobiłem, było to:

rm build.xml 
android update project -p . 
  • Jeśli nie mają narzędzia SDK na swojej drodze, trzeba użyć pełnej ścieżki do android narzędzia, na przykład w systemie Windows: C: \ Android \ sdk \ tools

To stworzyło nową build.xml, który jest zgodny z aktualnymi SDK Tools, i wydają się zautomatyzować wiele pracy ręcznej, który jest opisany w odpowiedzi barmaley użytkownika.

Po tym czasie mogłem uruchomić ant release, który zajął się budowaniem i zaciemnianiem wyniku. Plik APK po wyjęciu z pudełka.

W celu zautomatyzowania zaciemniania poprzez mrówki, musisz:

  1. Enable Proguard obfuscator (oczywiście)
  2. Utwórz plik ant.properties i wypełnić go z odpowiednich params key.store (patrz this SO reply szczegóły).
+0

Masz rację - było kilka zmian od 2011 roku. – barmaley

Powiązane problemy