12

誰でもAndroid用のサンプル/単純な難読化ANTタスクを共有できますか? 完全な APK があり、*class を Proguard に渡し、*.dex を準備して APK をビルドするだけでよい場合

4

4 に答える 4

12

私は解決策を見つけました:

  1. Proguardを取得- proguard.jar を既知のディレクトリ (MyProject/proguard など) にコピーします。
  2. proguard.cfg を準備します - 何をどのように最適化/難読化するかを記述します。このプロセスは、Proguard のマニュアルに詳しく説明されています
  3. 次のANTのbuild.xml(またはこのようなsmth)を準備します-この人に感謝します

完全な 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. この ANT タスクは、Java ビルダーの後、Android パッケージ ビルダーの前に、Eclipse のビルダー (プロパティ/ビルダー) タスクに追加する必要があります。

  2. 「Build All」を押します (Eclipse メニューの Automatic Build チェックをオフにすることをお勧めします)。

于 2011-02-14T15:29:09.577 に答える
9

Androidビルドプロセスは、最初にJavaソースファイル(.java)をJavaクラスファイル(.class)にコンパイルし、次にこれらのクラスファイルをDalvikコード(classes.dex)に変換し、最後にこのDalvikコードをAPKファイルにパッケージ化します。

ProGuardはJavaクラスファイルの読み取りと書き込みを行うため、コンパイルステップと変換ステップの間にこのパイプラインに挿入する必要があります。Dalvikコード自体の読み取りまたは書き込みを行わないため、APKファイルでは機能しません。

ProGuardのAndroidSDKドキュメントでは、Android-9のAntビルドで難読化手順を有効にする方法について説明しています。つまり、ファイルdefault.propertiesに「proguard.config = proguard.cfg」という行を追加してから、「antrelease」を実行する必要があります。

于 2011-01-07T23:52:39.293 に答える
4

注意: barmaley の返信は 2011 年のものであり、Android SDK Tools バージョン 8 または 10 で有効なようです。

Android SDK Tools バージョン 18.1.1 を使用してこのソリューションを適応させようとしましたが、エラーで失敗し続けました。
taskdef class com.android.ant.SetupTask cannot be found

最終的に、私がしたことはこれでした:

rm build.xml
android update project -p .
  • PATH に SDK ツールがない場合は、Android ツールへのフル パスを使用する必要があります。たとえば、Windows ではC:\Android\sdk\tools です。

これにより、現在の SDK ツールに準拠した新しい build.xml が作成され、barmaley の返信に記載されている多くの手作業が自動化されているようです。

その後、 を実行することができましたant release。これにより、結果の .apk ファイルがすぐにビルドおよび難読化されました。

ant による難読化を自動化するには、次のことを行う必要があります。

  1. Proguard難読化ツールを有効にします(明らかに)
  2. ファイルを作成ant.propertiesし、適切な key.store パラメーターを入力します (詳細については、この SO 返信を参照してください)。
于 2013-11-15T00:56:45.213 に答える
2

proGuard の難読化プロセスには .class ファイルが必要なため、IDE ビルド (.java) の前または後 (.dex パック) に Ant を起動することはできません。

グローバル Ant ビルドに proGuard ステップを追加する方法が説明されているこの投稿をご覧ください。

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

本当に IDEA ビルドを使用したい場合は、以下を試すことができます。

  • IDEA ビルド後、apktool で apk を解凍します。
  • dex2jar を使用して .dex ファイルを .class に変換します
  • 前の投稿が示すようにproGuardを実行します

申し訳ありませんが、apktool と dexjar のリンクを添付していませんが、私は初心者なので、複数のハイパーリンクを投稿することはできません。

于 2011-01-26T08:43:29.067 に答える