Android Proguard Obfuscation用のAntビルド
-
08-10-2019 - |
質問
AndroidのSample/Simple Hovfuscation Antタスクと誰もが共有できますか?私が完全なAPKを持っていることを条件に、私はただパス *クラスHRU Proguardをパスする必要があります。
解決
解決策を見つけました:
- 得る Proguard -proguard.jarを既知のディレクトリにコピーする(myproject/proguardなど)
- proguard.cfgを準備 - 何とどのように最適化/難読化するかを説明します。このプロセスは、Proguard'sで徹底的に説明されています マニュアル
- フォローアリの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>
このアリタスクは、Javaビルダーの後、Androidパッケージビルダーの前にEclipseのビルダー(プロパティ/ビルダー)タスクに追加する必要があります。
「Build All」を押します(Eclipseメニューで自動ビルドチェックをオフにすることをお勧めします)
他のヒント
Androidビルドプロセスは、最初にJavaソースファイル(.java)をJavaクラスファイル(.class)にコンパイルし、次にこれらのクラスファイルをDalvikコード(classes.dex)に変換し、最後にこのDalvikコードをAPKファイルにパッケージ化します。
ProguardはJavaクラスファイルを読み取り、書き込みます。そのため、コンパイルステップと変換ステップの間にこのパイプラインに挿入する必要があります。 Dalvikコード自体を読み書きしたり書いたりしないため、APKファイルで動作することはできません。
Proguardに関するAndroid SDKドキュメント Android-9のANTビルドで難読化ステップを有効にする方法について説明します。要するに、ファイルのdefault.propertiesに「proguard.config = proguard.cfg」という行を追加してから、「ANTリリース」を実行する必要があります。
注意: :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 .
- パスにSDKツールがない場合は、WindowsでAndroidツールへのフルパスを使用する必要があります。 c: android sdk ツール
これにより、現在のSDKツールに準拠した新鮮なbuild.xmlが作成され、Barmaleyの返信で説明されている多くの手動作業を自動化するようです。
その後、私は走ることができました ant release
, 、結果の構築と難読化の世話をしました。
ANTを介して難読化を自動化するには、次のことが必要です。
- Proguard Obfuscatorを有効にします (明らかに)
- 作成します
ant.properties
適切なkey.store paramsをファイルして入力します(参照 これは返信です 詳細については)。
Proguard Obfuscation Processは.classファイルを必要とするため、IDEビルド(.java)または後(.dex packed)の前にアリを起動できません。
この投稿をご覧ください。グローバルアリビルドにProguardステップを追加する方法を説明しています。
http://www.androidengineer.com/2010/07/optimizing-obfuscating-and-shrinking.html
アイデアビルドを本当に使用したい場合は、以下を試すことができます。
- アイデアを構築した後、APKをAPKTOOLで開梱します。
- .dexファイルをdex2jarで.classに変換します
- 前の投稿が表示されるように、Proguardを実行してください
申し訳ありませんが、apktoolとdexjarのリンクを添付していませんが、初心者として複数のハイパーリンクを投稿することはできません。