忘れちゃいそうなアレやコレをメモっておくサイト。



まとめ中...

antを使ってビルドする

antを使ってビルドするには...
  1. プロジェクトを作成 (コマンド or Eclipseから)
  2. ant用ビルドファイルの自動生成
  3. ビルド

ant用ビルドファイルの自動生成


ant用のビルドファイルbuild.xmlファイルを自動生成するには,プロジェクトフォルダのルートへ移動して以下のコマンドを実行する。

android update project -p ./

以下のファイルが自動生成される。
ファイル名概要
build.xmlこのプロジェクトをビルドするための設定ファイル。
このxml自体編集しなくても追加することができるようになっている。
local.propertiesビルドする個別の環境の設定ファイル
このファイルはバージョン管理システムにアップしてはいけない。
また将来,updateコマンドによって更新される可能性があるので編集しないこと。

コマンドによってプロジェクトを生成したときはant.propertiesが自動で生成される。
自動生成されたときのファイル内容は以下のとおり。

# This file is used to override default values used by the Ant build system.
#
# This file must be checked into Version Control Systems, as it is
# integral to the build system of your project.

# This file is only used by the Ant script.

# You can use this to override default values such as
#  'source.dir' for the location of your java source folder and
#  'out.dir' for the location of your output folder.

# You can also use it define how the release builds are signed by declaring
# the following properties:
#  'key.store' for the location of your keystore and
#  'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.

コメント以外なにも設定されていない。

このファイルに署名化に関係する設定値を追加する。
プロパティ名設定値
key.storeキーストアへのパス
build.xmlからの相対パス
key.aliasエイリアス名
key.store.passwordキーストアのパスワード。
パスワードを設定しなければ入力が求められる。
key.alias.passwordエイリアスのパスワード。
パスワードを設定しなければ入力が求められる。

antでビルド

build.xmlのreleaseターゲットをEclipse上で実行するとエラーが発生する。

パスワードの入力処理でエラーになっていると考えられる。
このためantコマンドから実行する。

ant -f <ビルドファイル名> <ターゲット名>

コマンドを確認するには...

ant -h

コマンドからリリースビルド(releaseターゲット)を実行するとパスワード入力が求められる。
(key.store.password, key.alias.passwordを設定していないとき)

ant release

パスワードをant.propertiesに設定しておけば入力が求められない。
(けどそれでいいのか...!?)

ビルドのカスタマイズ

コマンドによって自動生成されたbuild.xmlはカスタマイズできるようになっている。

カスタマイズ内容はbuild.xmlのコメントに書かれているターゲットを上書きすることができる。
ターゲット名概要
-pre-buildaidl,aapt実行直前に呼ばれる。
-pre-compilejavacタスク直前に呼ばれる。
-post-compilejavacタスク実行後に呼ばれる。
-post-packageパッケージ処理後、署名前に呼ばれる。
-post-buildすべての処理の一番最後にコールされるターゲット
-pre-cleanクリーン処理直前に呼ばれる。

カスタムはcustom_rules.xmlファイルに設定する。
このファイルは存在していなくても良い。

カスタマイズビルドによるログ関数の削除

proguardによるログ処理の削除方法があるが,引数までは削除できていない。
今回はビルド処理をカスタマイズしてログ関数自体を削除することを試みる。
  1. tmpフォルダを作成する
  2. srcフォルダのjavaファイルからログ処理を置換する。
  3. tmpフォルダからビルドを実行する。
    これ以降は通常のビルド処理と同じ。
srcフォルダのパスを変更する
置換後のsrcフォルダを参照してビルドするためにsrcフォルダのパスを変更する。
これは
ログ関数の置換処理
「-code-gen」ターゲットでaidlの実行等でsrcフォルダを参照しているため,これよりも前に実行されるターゲットで置換処理を実行する。
そのターゲットは-pre-buildになる。
「-pre-build」のカスタマイズ

ant.properties
source.dir=tmp
original.source.dir=src

custom_rules.xml
<?xml version="1.0" encoding="UTF-8"?>

<project>
    <!-- ant.propertiesでsource.dirにtmpフォルダを設定しておく -->
	<property name="tmp.absoltue.dir" location="${source.dir}"/>
	<property name="original.source.absolute.dir" location="${original.source.dir}"/>

	<target name="-pre-build">
	    
	    <!-- 置換前のパスを確認する -->
	    <if>
	        <condition>
	            <and>
	                <isset property="source.dir" />
	                <length string="${source.dir}" trim="true" when="greater" length="0" />
	                <isset property="original.source.dir" />
	                <length string="${original.source.dir}" trim="true" when="greater" length="0" />
	            </and>
	        </condition>
	        <else>
	            <fail message="replace source dir not set. ${source.dir}, ${original.source.dir}"/>
	        </else>
	    </if>

            <delete dir="${tmp.absoltue.dir}" />

	    <!-- 置換後のフォルダを更新する -->
	    <mkdir dir="${source.dir}"/>

	    <!-- ログ処理の置換処理を実行する -->
	    <copy todir="${tmp.absoltue.dir}" overwrite="true" encoding="UTF-8">
	        <fileset dir="${original.source.absolute.dir}">
		        <include name="**/*.java" />
	        </fileset>
	        <filterchain>
	            <tokenfilter>
	                <!-- テスト用の置換文字列 -->
				    <!-- <replaceregex pattern="Log.[deivw]\(.*?\);" replace="{new String(&quot;Test&quot;);}" flags="g" /> -->
				    
				    <!-- 空のブロックに置換する -->
				    <replaceregex pattern="Log\.[deivw]\(.*?\);" replace="{}" flags="g" />
	            </tokenfilter>
	        </filterchain>
	    </copy>
	</target>

    <target name="-pre-clean">
        <delete dir="${tmp.absoltue.dir}" />
    </target>
	
</project>

検証
proguardによるログ削除とantによるカスタムビルドによるログ削除の違いを検証する。

元になったソース。

package jp.co.akerusoft.antbuild;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class AntBuildActivity extends Activity
{
	static final private String TAG = "AntBuildActivity"; 
	
	@Override public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		Log.d(TAG, "Thread id:" + Thread.currentThread().getId());

		boolean isOutput = true;
		
		if(isOutput)
			Log.e(TAG, getClass().getSimpleName() + ":" + getString(R.string.hello_world));
		else if(isOutput)
			Log.v(TAG, getClass().getSimpleName() + ":" + getString(R.string.hello_world));
		else
		{
			Log.v(TAG, getClass().getSimpleName() + ":" + getString(R.string.hello_world));
		}
		
		Log.w(TAG, "warning.");Log.i(TAG, "information.");
		
		DebugClass d = new DebugClass(this);
	}
}

proguardでログを削除した(下記参照)ものをリバースエンジニアリングした結果。

package jp.co.akerusoft.antbuild;

import android.app.Activity;
import android.os.Bundle;

public class AntBuildActivity extends Activity
{
  public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903041);
    new StringBuilder("Thread id:").append(Thread.currentThread().getId()).toString();
    new StringBuilder().append(getClass().getSimpleName()).append(":").append(getString(2130968577)).toString();
    new a(this);
  }
}

antのカスタムビルドでログを削除した結果。

package jp.co.akerusoft.antbuild;

import android.app.Activity;
import android.os.Bundle;

public class AntBuildActivity extends Activity
{
  public void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    setContentView(2130903041);
    new a(this);
  }
}



難読化してビルド

リリースビルドするときにproguardを使用するときは設定ファイル「project.properties」を変更する。
既にコメント化されているものを解除することで使用できるようになる。

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-16

プロジェクト個別に設定したいものはファイル「proguard-project.txt」に設定する。

SDK r20からproguardの最適化を有効に設定されたファイルが追加されている。
SDK Tools | Android Developers

そのファイルは以下のパスにある。

${sdk.dir}/tools/proguard/proguard-android-optimize.txt

このファイルを使用することでproguardによるログの削除を使用することができる。
ログを削除するとき,設定ファイルは以下のようになる。

proguard-project.txt
-assumenosideeffects class android.util.Log
{
    public static int d(...);
    public static int e(...);
    public static int i(...);
    public static int v(...);
    public static int w(...);
}

署名

署名されているか確認する方法

リリースビルドされたapkファイルが署名されているか確認する方法。

jarsigner -verify -verbose -certs <APKファイル名>



×

この広告は60日間更新がないwikiに表示されております。

フリーエリア

Menu

メニューサンプル1

メニューサンプル2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人のみ編集できます