
Androidのapkを作成するときのProGuardの掛け方は書いてる方がたくさんいるんですが、
antビルドの場合にどうやって掛ければいいか分からなかったので、
いろいろ試して成功しました。
結果をメモしておきます。
ローカル設定を反映
まずは、プロジェクトのbuild.xmlを作成します。android update project --path ./
と打って、local.properties、build.xmlなどを作成します。
Build.xmlの編集
次に、build.xmlのターゲットに下のようにタスクを追加します。<javac srcdir="src/" destdir="bin/classes" encoding="utf-8" classpath="${sdk.dir}/platforms/${target}/android.jar" includeAntRuntime="false"/>
<target name="production_jar">
<taskdef resource="proguard/ant/task.properties" classpath="${path-to-proguard.jar}"/>
<proguard configuration="proguard.cfg"/>
</target>
proguard.jarは
android-sdks/tools/proguard/lib/proguard.jar
にあります。
proguard.cfg
proguard.cfgに出力設定を書いていきます。# classファイル
-injars bin/classes
# 出力先ファイル名
-outjars artifacts/library.jar
# ターゲットAndroid向けに変更する
-libraryjars /usr/local/java/android-sdk/platforms/android-8/android.jar
# 変更したメソッド名のマップ
-printmapping bin/proguard.map
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep public class * {
public protected *;
}
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
ビルド
最後に、
ant production_jarとコマンドを打てばビルドされました。
jarの中身を見ても変数名とか難読化されています。
0 件のコメント:
コメントを投稿