スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

androidでProGuard(ant build)

License Verification Library(LVL)でもProGuardがお勧めされていますが、
Android+ProGuardのサンプルがあまり見つからなかったのでぱくりぱくりしつつ、
build.xmlを書いてみました。

※ProGuard4.5.1で検証しています。また、最新のandroid-sdkだと各種パスが変更になっていますので適宜修正してください。
Proguard.jarの設定などは適宜修正してください。

※さらに追記
framework.aidlが無くなったりと、もうどうにもならない感じですね。
それはそうと、eclipseからexportする際にProGuardかけられるようになっていますので、
素直にそちらを利用するのが無難です。私もいい加減antは捨てました・・・


一応は、LVL用のソースなども取り込んで実行できるようにはなっています。
※生成の途中で、難読化したjarをプロジェクトルートに出力するので、どのような成果になっているかも確認できると思います。
ただ、LVLの仕組みを組み込んでの動作を確認していないのでひょっとしたら難読化の影響で実行時エラーがあるかもしれませんので、その場合はkeepなどを調整してください。
(おそらく、enumに対する設定が必要です)追記しました。
難読化する場合、ILicensingServiceを除外するか、ここから文字列取得しているところを、Stub.DESCRIPTOR指定に変えるなりしないと、サービスのバインドで失敗します。


実行前に、自環境に応じて値を設定してください。
release系のタスクは、署名なども行います(パスワードはプロンプトで入力してください)
質問は受け付けませんが、アドバイスなどの指摘は大歓迎です。
libsがある前提なので、無い場合は空でもいいので、作ってください(もしくは該当エラーを削除)

※ちなみにですが、難読化をfalseにすると、apkのサイズを小さくして最適化するだけなので、
普通のアプリで実行しても役に立つと思います。


<?xml version="1.0" ?>
<project name="プロジェクト名" default="debug">
<!-- ************************************************************************************* -->
<!-- 設定 -->
<!-- ************************************************************************************* -->
<!-- SDK -->
<property name="android-sdk" value="C:/android-sdk-windows" />
<property name="android-sdk-1.6" value="${android-sdk}/platforms/android-1.6" />
<property name="android-tools" value="${android-sdk}/tools" />
<property name="android-tools-1.6" value="${android-sdk-1.6}/tools" />

<property name="sdk-folder" value="${android-sdk-1.6}" />

<!-- ProGuard -->
<property name="proguard.jar" value="${android-tools}/lib/proguard.jar" />

<!-- LVLなどの取り込むソース 不要ならコメントアウト -->
<property name="importsrc" value="../licensing/src" ></property>

<!-- リリース時のkeystoreと別名 -->
<property name="key.store" value="C:/key/android/hoge.keystore" />
<property name="key.alias" value="keyalias" />

<!-- 出力ディレクトリ -->
<property name="outdir" value="dist" />

<!--ソースのエンコード -->
<property name="src.encode" value="MS932" />

<property name="verbose" value="false" />
<condition property="v.option" value="-v" else="">
<istrue value="${verbose}" />
</condition>

<!-- ************************************************************************************* -->
<!-- 基本的には以下はいじらない(Proguardのオプションなどは調整してもいいけど) -->

<property name="android-framework" value="${android-tools}/lib/framework.aidl" />

<!-- 入力フォルダ -->
<property name="resource-dir" value="res" />
<property name="asset-dir" value="assets" />
<property name="srcdir" value="src" />
<condition property="srcdir-ospath"
value="${basedir}\${srcdir}"
else="${basedir}/${srcdir}" >
<os family="windows"/>
</condition>

<property name="gendir" value="gen" />
<condition property="gendir-ospath"
value="${basedir}\${gendir}"
else="${basedir}/${gendir}" >
<os family="windows"/>
</condition>

<property name="external-libs" value="libs" />
<condition property="external-libs-ospath"
value="${basedir}\${external-libs}"
else="${basedir}/${external-libs}" >
<os family="windows"/>
</condition>

<!-- 出力フォルダ -->
<property name="outdir-classes" value="${outdir}/classes" />
<condition property="outdir-classes-ospath"
value="${basedir}\${outdir-classes}"
else="${basedir}/${outdir-classes}" >
<os family="windows"/>
</condition>

<!-- R.java -->
<property name="outdir-r" value="${gendir}" />

<property name="dex-file" value="classes.dex" />
<property name="intermediate-dex" value="${outdir}/${dex-file}" />
<condition property="intermediate-dex-ospath"
value="${basedir}\${intermediate-dex}"
else="${basedir}/${intermediate-dex}" >
<os family="windows"/>
</condition>

<property name="resources-package" value="${outdir}/${ant.project.name}.ap_" />
<condition property="resources-package-ospath"
value="${basedir}\${resources-package}"
else="${basedir}/${resources-package}" >
<os family="windows"/>
</condition>

<!--デバッグ用apk-->
<property name="out-debug-package" value="${outdir}/${ant.project.name}-noal-debug.apk" />
<property name="out.debug.aligned.package" value="${outdir}/${ant.project.name}-debug.apk" />
<condition property="out-debug-package-ospath"
value="${basedir}\${out-debug-package}"
else="${basedir}/${out-debug-package}" >
<os family="windows"/>
</condition>
<condition property="out-debug-al-package-ospath"
value="${basedir}\${out.debug.aligned.package}"
else="${basedir}/${out.debug.aligned.package}" >
<os family="windows"/>
</condition>

<!-- 未署名apk -->
<property name="out-unsigned-package" value="${outdir}/${ant.project.name}-unsigned.apk" />
<condition property="out-unsigned-package-ospath"
value="${basedir}\${out-unsigned-package}"
else="${basedir}/${out-unsigned-package}" >
<os family="windows"/>
</condition>

<!-- 未zipalignapk -->
<property name="out-noal-package-ospath" value="${outdir}/${ant.project.name}-noal.apk" />
<condition property="out-noal-package-ospath"
value="${basedir}\${out-noal-package-ospath}"
else="${basedir}/${out-noal-package-ospath}" >
<os family="windows"/>
</condition>

<!-- 署名済apk -->
<property name="out-signed-package" value="${outdir}/${ant.project.name}-signed.apk" />
<condition property="out-signed-package-ospath"
value="${basedir}\${out-signed-package}"
else="${basedir}/${out-signed-package}" >
<os family="windows"/>
</condition>

<!-- Tools -->
<condition property="aapt" value="${android-tools-1.6}/aapt.exe" else="${android-tools-1.6}/aapt" >
<os family="windows"/>
</condition>
<condition property="aidl" value="${android-tools-1.6}/aidl.exe" else="${android-tools-1.6}/aidl" >
<os family="windows"/>
</condition>
<condition property="adb" value="${android-tools}/adb.exe" else="${android-tools}/adb" >
<os family="windows"/>
</condition>
<condition property="dx" value="${android-tools-1.6}/dx.bat" else="${android-tools-1.6}/dx" >
<os family="windows"/>
</condition>
<condition property="apk-builder" value="${android-tools}/apkbuilder.bat" else="${android-tools}/apkbuilder" >
<os family="windows"/>
</condition>
<condition property="zipalign" value="${android-tools}/zipalign.exe" else="${android-tools}/zipalign" >
<os family="windows"/>
</condition>
<property name="android-jar" value="${sdk-folder}/android.jar" />


<!-- Create the output directories if they don't exist yet. -->
<target name="dirs">
<echo>フォルダ初期化</echo>
<delete dir="${outdir}" failonerror="false"></delete>
<mkdir dir="${outdir}" />
<mkdir dir="${outdir-classes}" />
</target>

<!-- R.java生成 -->
<target name="resource-src" depends="dirs">
<echo>Generating R.java / Manifest.java from the resources...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-m" />
<arg value="-J" />
<arg value="${outdir-r}" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
</exec>
</target>

<!-- Generate java classes from .aidl files. -->
<target name="aidl" depends="dirs">
<echo>Compiling aidl files into Java classes...</echo>
<apply executable="${aidl}" failonerror="true">
<arg value="-p${android-framework}" />
<arg value="-I${srcdir}" />
<fileset dir="${srcdir}">
<include name="**/*.aidl"/>
</fileset>
</apply>
</target>

<macrodef name="zipalign-helper">
<attribute name="in.package" />
<attribute name="out.package" />
<sequential>
<echo>Running zip align on final apk...</echo>
<exec executable="${zipalign}" failonerror="true">
<arg line="${v.option}" />
<arg value="-f" />
<arg value="4" />
<arg path="@{in.package}" />
<arg path="@{out.package}" />
</exec>
</sequential>
</macrodef>

<target name="compile" depends="dirs, resource-src, aidl,check-for-imputsrc">
<antcall target="innerconmpile1"></antcall>
<antcall target="innerconmpile2"></antcall>
</target>
<target name="innerconmpile1" if="importsrc-available">
<javac encoding="${src.encode}" target="1.6" debug="true" extdirs=""
destdir="${outdir-classes}"
bootclasspath="${android-jar}" debuglevel="lines,vars">
<src path="."/>
<src path="${importsrc}"/>
<classpath>
<fileset dir="${external-libs}" includes="*.jar"/>
</classpath>
</javac>
</target>
<target name="innerconmpile2" unless="importsrc-available">
<javac encoding="${src.encode}" target="1.6" debug="true" extdirs=""
destdir="${outdir-classes}"
bootclasspath="${android-jar}" debuglevel="lines,vars">
<src path="."/>
<classpath>
<fileset dir="${external-libs}" includes="*.jar"/>
</classpath>
</javac>
</target>

<target name="check-for-proguard">
<available property="proguard-available" file="${proguard.jar}" />
<echo>checking proguard.jar</echo>
</target>
<target name="check-for-imputsrc">
<available property="importsrc-available" file="${importsrc}" />
<echo>checking import another src</echo>
</target>

<target name="obfuscate" depends="compile, check-for-proguard" if="proguard-available">
<echo>Obfuscating .class files in ${outdir-classes}</echo>

<!-- if we obfuscate, we should set property to not include the external lib -->
<property name="external-lib-includes" value=""/>
<property name="external-lib-excludes" value="*"/>

<!-- Define the .class files to obfuscate -->
<path id="classes-to-obfuscate">

<!-- proGuardの入力用classesフォルダ -->
<pathelement path="${outdir-classes}-unobfuscated"/>

<!-- The admob-sdk-android.jar (which will get obfuscated too) -->
<fileset dir="${external-libs}" />
</path>


<!-- Task definition for the proguard task -->
<taskdef resource="proguard/ant/task.properties" classpath="${proguard.jar}" />
<echo>move to</echo>
<!-- proGuardの入力用classesフォルダに移動 -->
<move file="${outdir-classes}" tofile="${outdir-classes}-unobfuscated" />

<proguard
preverify="true"
optimize="true"
allowaccessmodification="true"
optimizationpasses="3"
overloadaggressively="false"
useuniqueclassmembernames="true"
printmapping="obfuscation_mapping.txt"
><!--windows環境なので、大文字小文字の区別が付かないのでその手のオプションは除去 -->

<injar refid="classes-to-obfuscate" />
<outjar dir="${outdir-classes}" />

<libraryjar>
<pathelement location="${sdk-folder}/android.jar" />
<fileset dir="${external-libs}" />
</libraryjar>
-dontusemixedcaseclassnames
<!-- androidManifest.xmlにのっかる様なクラスは除外 -->
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider

-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
</proguard>
<!-- 難読化結果をJD-Eclipseとかで確認したいので、jarを出しておく -->
<jar destfile="obfuse.jar" basedir="${outdir-classes}"></jar>
</target>

<!-- Convert this project's .class files into .dex files. -->
<target name="dex" depends="obfuscate"> <!-- Can depend on the "compile" task to use original, non-obfuscated code -->
<echo>Converting compiled files and external libraries into ${outdir}/${dex-file}...</echo>

<!-- if we obfuscated, these properties will already be set. -->
<property name="external-lib-includes" value="*"/>
<property name="external-lib-excludes" value=""/>

<apply executable="${dx}" failonerror="true" parallel="true">
<arg value="--dex" />
<arg value="--output=${intermediate-dex-ospath}" />
<arg path="${outdir-classes-ospath}" />
<!-- if obfuscated, exclude external libs, otherwise include -->
<fileset dir="${external-libs}"
includes="${external-lib-includes}"
excludes="${external-lib-excludes}"/>
</apply>
</target>

<!-- Put the project's resources into the output package file. -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package}" />
</exec>
</target>

<!-- Same as package-res-and-assets, but without "-A ${asset-dir}" -->
<target name="package-res-no-assets">
<echo>Packaging resources...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="AndroidManifest.xml" />
<arg value="-S" />
<arg value="${resource-dir}" />
<!-- No assets directory -->
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package}" />
</exec>
</target>

<!-- Invoke the proper target depending on whether or not
an assets directory is present. -->
<!-- TODO: find a nicer way to include the "-A ${asset-dir}" argument
only when the assets dir exists. -->
<target name="package-res">
<available file="${asset-dir}" type="dir"
property="res-target" value="and-assets" />
<property name="res-target" value="no-assets" />
<antcall target="package-res-${res-target}" />
</target>

<!-- Package the application and sign it with a debug key.
This is the default target when building. It is used for debug. -->
<target name="debug" depends="dex, package-res">
<echo>Packaging ${out.debug.aligned.package}, and signing it with a debug key...</echo>
<exec executable="${apk-builder}" failonerror="true">
<arg value="${out-debug-package-ospath}" />
<arg value="-z" />
<arg value="${resources-package-ospath}" />
<arg value="-f" />
<arg value="${intermediate-dex-ospath}" />
<arg value="-rf" />
<arg value="${srcdir-ospath}" />
<arg value="-rj" />
<arg value="${external-libs-ospath}" />
</exec>
<zipalign-helper in.package="${out-debug-package-ospath}"
out.package="${out-debug-al-package-ospath}" />
</target>
<target name="-release-check">
<condition property="release.sign">
<and>
<isset property="key.store" />
<isset property="key.alias" />
</and>
</condition>
</target>

<target name="-release-nosign" depends="-release-check" unless="release.sign">
<echo>No key.store and key.alias properties found in build.properties.</echo>
<echo>Please sign ${out.unsigned.package} manually</echo>
<echo>and run zipalign from the Android SDK tools.</echo>
</target>
<!-- Package the application wit signing it.-->
<target name="release" depends="dex, package-res, -release-nosign" if="release.sign">
<echo>Packaging ${out-unsigned-package} for release...</echo>
<exec executable="${apk-builder}" failonerror="true">
<arg value="${out-unsigned-package-ospath}" />
<arg value="-u" />
<arg value="-z" />
<arg value="${resources-package-ospath}" />
<arg value="-f" />
<arg value="${intermediate-dex-ospath}" />
<arg value="-rf" />
<arg value="${srcdir-ospath}" />
<arg value="-rj" />
<arg value="${external-libs-ospath}" />
</exec>
<echo>Signing final apk...</echo>
<input
message="Please enter keystore password (store:${key.store}):"
addproperty="key.store.password" />
<input
message="Please enter password for alias '${key.alias}':"
addproperty="key.alias.password" />
<signjar
jar="${out-unsigned-package-ospath}"
signedjar="${out-noal-package-ospath}"
keystore="${key.store}"
storepass="${key.store.password}"
alias="${key.alias}"
keypass="${key.alias.password}"
verbose="${verbose}" />

<!-- Zip aligns the APK -->
<echo>run zip aligns</echo>
<zipalign-helper in.package="${out-noal-package-ospath}"
out.package="${out-signed-package-ospath}" />
<echo>makes ${out-signed-package-ospath}</echo>
</target>

<!-- Install the package on the default emulator -->
<target name="debuginstall" depends="debug">
<echo>Installing ${out-debug-package} onto default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg value="${out-debug-package}" />
</exec>
</target>

<!-- Install the package on the default emulator -->
<target name="releaseinstall" depends="release">
<echo>Installing ${out-debug-package} onto default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg value="${out-signed-package-ospath}" />
</exec>
</target>

<target name="release_reinstall" depends="release">
<echo>Installing ${out-debug-package} onto default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="install" />
<arg value="-r" />
<arg value="${out-signed-package-ospath}" />
</exec>
</target>

<!-- Uinstall the package from the default emulator -->
<target name="uninstall">
<echo>Uninstalling ${application-package} from the default emulator...</echo>
<exec executable="${adb}" failonerror="true">
<arg value="uninstall" />
<arg value="${application-package}" />
</exec>
</target>

</project>

関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。