2013年3月5日

【Android】antビルドでProGuard



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の中身を見ても変数名とか難読化されています。