スポンサーサイト

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

S!アプリのビルド作業をRakeで自動化する

以前、はてなダイアリーで書いた記事のS!アプリ版を書きました。

S!アプリをEclipseで開発する環境を作ったものの、ProGuardを通す方法が分からなかったので、コマンドラインからrake一発で通せるようにしました。

なお、できたS!アプリの動作確認は、今のところエミュレータでしかしていません。

使い方:

1. Ruby、Rake、ProGuard、7-Zipを導入しておく(もしかすると、Rubyは半角スペースを含まないディレクトリにインストールするほうが安全かもしれません)
2. java,javacコマンドのあるディレクトリ(C:\Program Files\Java\jdk1.6.0_21\binなど)と、ruby,rakeコマンドのあるディレクトリ(C:\Program Files\ruby-1.8\binなど)にパスを通しておく
3. 普通にEclipseでS!アプリを作成(元になるjad,jarファイルができている必要あり)
4. 以下のコードをRakefileという名前でS!アプリプロジェクトのディレクトリに保存
5. 環境に合わせてパスなどを書き換え
6. コマンドラインでプロジェクトのディレクトリに移ってrakeと打てば、pkg/下にjadとjarができる

デフォルトでは全工程を実行しますが、Rakeのターゲットを指定すれば途中まで実行することもできます。

・rake preprocess # プリプロセスまで
・rake compile # コンパイルまで
・rake obfuscate # ProGuardによる難読化/最適化まで
・rake preverify # 事前検証まで

その他、

・rake clean # 中間生成物を削除
・rake clobber # すべての生成物を削除

です。

Javaソースの中で、//#ifdef DEBUG ~ //#endif で囲まれた行はプリプロセスでコメントアウトされます。

なお、差分ビルドはしていません。毎回、全ソースファイルを対象とします。


######## S!アプリ(MEXA) ビルド用Rakefile

require 'rake/clean'


### ↓↓↓環境に合わせて書き換える↓↓↓

# S!アプリ開発ツールMEXA SDKのインストール先
MEXA_DIR = "C:/PROGRA~1/SOFTBANK_MEXA_EMULATOR23"
# Eclipse向けプラグインfor MEXA SDKのインストール先
ECLIPSE_PLUGIN_DIR = "C:/Eclipse_MEXA/eclipse/plugins/com.mexa.emulator.eclipse.plugin_1.0.0"
# ProGuardのパス
PROGUARD_PATH = "C:/JavaDev/ProGuard/lib/proguard.jar"
# 7-Zipのパス
SEVENZIP_PATH = "\"C:/Program Files/7-Zip/7z.exe\""

# コンパイル対象のソース
source_files = FileList["src/*.java"]
source_files.exclude("**/Test*.java") # 除外したいファイルがあればここへ
# jarに含めるリソース
res_files = FileList["res/*"]

# jad、jarを生成するディレクトリ
PACKAGE_DIR = "pkg"

### ↑↑↑環境に合わせて書き換える↑↑↑


MEXA_LIB_DIR = "#{MEXA_DIR}/lib"
MEXA_CLASSPATH = "#{MEXA_LIB_DIR}/stubclasses.zip"
PREVERIFY_PATH = "#{ECLIPSE_PLUGIN_DIR}/bin/preverify.exe"

PREPROCESSED_DIR = "preprocessed"
COMPILED_DIR = "compiled"
OBFUSCATED_DIR = "obfuscated"
PREVERIFIED_DIR = "preverified"
PACKAGE_TMP_DIR = "pkg_tmp"

orig_jad = nil
orig_jar_path = nil
jad_info = nil
new_jad_path = nil
new_jar_path = nil

CLEAN.include(PREPROCESSED_DIR, COMPILED_DIR, OBFUSCATED_DIR, PREVERIFIED_DIR, PACKAGE_TMP_DIR)
if PACKAGE_DIR != "bin" # binディレクトリは削除対象にしない
CLOBBER.include(PACKAGE_DIR)
end

directory PREPROCESSED_DIR
directory COMPILED_DIR
directory OBFUSCATED_DIR
directory PREVERIFIED_DIR
directory PACKAGE_TMP_DIR
directory PACKAGE_DIR

desc "準備 (内部用)"
task :prepare => [] do
# オリジナルのjadファイルを読み込む
# 最初に見つかったjadファイルを採用。普通は1個なので大丈夫なはず。
orig_jad_path = FileList["*.jad"][0]
orig_jar_path = orig_jad_path.ext("jar")
if orig_jad_path.nil?
puts "jad file not found!"
exit
end
orig_jad = IO.readlines(orig_jad_path)

# jadファイルからHashを作る
jad_info = Hash.new
orig_jad.each do |line|
/^(\S+): (.*)$/ =~ line
jad_info[Regexp.last_match(1)] = Regexp.last_match(2)
end

# これから作るjadとjarのパス
new_jad_path = orig_jad_path.gsub(/[^\/]+\.jad/, "#{PACKAGE_DIR}/\\0")
new_jar_path = new_jad_path.ext("jar")
end

desc "プリプロセス"
task :preprocess => [:prepare, PREPROCESSED_DIR] do
rm Dir.glob("#{PREPROCESSED_DIR}/*")
source_files.each do |path|
source = IO.readlines(path)
prepro_source = Array.new
skip = false
### ↓↓↓環境に合わせて書き換える↓↓↓
# この辺りで好きなようにソースを加工できます。
source.each do |line|
# //#ifdef DEBUG ~ //#endif で囲まれた行をコメントアウトする
if /^\s*\/\/\s*#ifdef\s+DEBUG/ =~ line
skip = true
elsif /^\s*\/\/\s*#endif/ =~ line
skip = false
else
line.gsub!(/^/, "//") if skip
end
prepro_source.push(line)
end
### ↑↑↑環境に合わせて書き換える↑↑↑
prepro_path = path.gsub(/^src/, PREPROCESSED_DIR)
File.open(prepro_path, "w") do |file|
file.write(prepro_source)
end
end
end

desc "コンパイル"
task :compile => [:preprocess, COMPILED_DIR] do
rm Dir.glob("#{COMPILED_DIR}/*")
sh "javac -bootclasspath #{MEXA_CLASSPATH} -source 1.3 -target 1.3 -g:none -d #{COMPILED_DIR} #{PREPROCESSED_DIR}/*.java"
end

desc "難読化/最適化"
task :obfuscate => [:prepare, :compile, OBFUSCATED_DIR] do
rm Dir.glob("#{OBFUSCATED_DIR}/*")
sh "java -jar #{PROGUARD_PATH} -injars #{COMPILED_DIR} -outjars #{OBFUSCATED_DIR} -libraryjars #{MEXA_CLASSPATH} -keep public class #{jad_info['MIDlet-1'][/[^,\s]+$/]}"
end

desc "事前検証"
task :preverify => [:obfuscate, PREVERIFIED_DIR] do
rm Dir.glob("#{PREVERIFIED_DIR}/*")
sh "#{PREVERIFY_PATH} -classpath #{MEXA_CLASSPATH} -d #{PREVERIFIED_DIR} #{OBFUSCATED_DIR}"
end

desc "jar作成"
task :jar => [:preverify, PACKAGE_TMP_DIR, PACKAGE_DIR] do
rm_r Dir.glob("#{PACKAGE_TMP_DIR}/*")
rm_f new_jar_path
cp FileList["#{PREVERIFIED_DIR}/*"], PACKAGE_TMP_DIR, {:preserve => true}
cp res_files, PACKAGE_TMP_DIR, {:preserve => true}
cd PACKAGE_TMP_DIR do
sh "#{SEVENZIP_PATH} x ../#{orig_jar_path} META-INF"
sh "#{SEVENZIP_PATH} a -tzip -mx=9 -mfb=128 ../#{new_jar_path} *"
end
end

desc "jad作成"
task :jad => [:jar, PACKAGE_DIR] do
# jarファイルサイズを得る
jar_size = File.size(new_jar_path)

# 新しくjadファイルを作る
new_jad = Array.new
orig_jad.each do |line|
new_line = line.dup
new_line.gsub!(/(MIDlet-Jar-Size: ).*$/, "\\1#{jar_size}")
new_jad.push(new_line)
end

# jadファイルを書き出す
File.open(new_jad_path, "w") do |file|
file.write(new_jad)
end
end

task :default => [:jad, :jar]

スポンサーサイト

tag : Java ケータイ Eclipse Ruby

Eclipse備忘録 - SoftBank S!アプリ(MEXA)編

トップに戻る

★必要なもの

2010年9月現在Mobile Creationのサイトで公開されているS!アプリ開発用のツールは「S!アプリ開発ツール MEXA SDK」と「Eclipse向けプラグイン for MEXA SDK」の2つです。

Eclipseで開発する場合、2つとも必要になります。

なお、事前検証ツール(preverify.exe)がEclipse向けプラグインのほうに含まれるため、Eclipseを使わずに開発する場合、別途preverify.exeを用意する必要があります。

★MEXA Emulatorのプロジェクトを作っておく

インストール後、プログラムを開発し始める前に、MEXA Emulatorのプロジェクトを作っておくと良いと思います。
これは、Eclipseのプロジェクトとは別物で、エミュレータの中に用意される疑似端末のようなものらしいです。(AndroidでいうAVDみたいなもの)

あらかじめサンプルのプロジェクトが1つ用意されていますが、別に作ったほうがいいでしょう。

Eclipseでプロジェクトを新規作成するとき

MEXAプロジェクトを新規作成するとき、「MEXA Emulatorの実行パス」「MEXA Emulatorのプロジェクトパス」「ビルド用クラスパス」がオプションで指定できますが、実質これらは必須項目になります。(デフォルト値のままでは正常に動かないため)
プロジェクト作成後に修正することもできますが、先に指定しておくほうが楽でしょう。

S!アプリ開発ツール MEXA SDKをデフォルト設定でインストールしている場合、これらのパスは以下のようになります。

MEXA Emulatorの実行パス: C:\Program Files\SOFTBANK_MEXA_EMULATOR23

MEXA Emulatorのプロジェクトパス: C:\SOFTBANK_MEXA_EMULATOR23\projects\(※)\(※).vjp
※=MEXA Emulatorのプロジェクト名

ビルド用クラスパス: C:\Program Files\SOFTBANK_MEXA_EMULATOR23\lib\stubclasses.zip

なお、S!アプリ開発ツール MEXA SDKのバージョンが上がると、これらのパスは変わるものと思われます。

★リソースファイルの置き場所

元記事はこちら

画像などのリソースファイルの置き場所ですが、デフォルトではsrcフォルダになっているようです。

ソースコードとは別に管理したいので、resフォルダを作ってそこに入れるようにします。

1. エクスプローラなどで、プロジェクトフォルダの下にresフォルダを作る。
2. プロジェクト名を右クリックして、コンテキストメニューの「リフレッシュ」を選択
3. メニューの「プロジェクト」→「プロパティー」を選択
4. ツリーから「Java のビルド・パス」を選択
5. 「ソース」タブを選択して、「フォルダーの追加...」ボタンを押下
6. resフォルダにチェックを入れて、「OK」ボタンを押下

★ProGuardを通す

S!アプリもケータイJavaの一種なので、ProGuardなどでサイズ削減を図りたいわけですが、Eclipseから実行する方法がどうしても分かりませんでした。

そこで、コマンドラインから実行できるようにしてみました。実行にはRuby、Rakeなどいくつかのツールが必要になりますが、手作業でProGuardを通すよりはかなり便利になります。

詳細はこちらの記事でどうぞ。

tag : Java Eclipse ケータイ

Eclipse備忘録 - Android編

トップに戻る

★古い情報に注意

Androidの開発環境は進化が速いので、情報がすぐに陳腐化します。

例えばAVD(Android Virtual Device)の作成について、ちょっと古い本だとコマンドラインから作成するように書かれていますが、今ではGUIからも作ることができるようになっています。
もっと古い本だと、そもそもAVDについての記述がありません。

また、APIもAndroidのバージョンによってけっこう変わっているらしいです。

できるだけ新しい情報を仕入れるようにして、古い本などには見切りをつけたほうがいいと思います。

tag : Java Eclipse Android

Eclipse備忘録 - Javaアプリケーション編

トップに戻る

★画像などのリソースを含んだ実行可能JARファイルを作る

メニューの「ファイル」→「エクスポート...」を選択し、表示されたツリーから「Java」→「実行可能JARファイル」を選択すると実行可能JARファイルができるのですが、これだとリソースを含めてくれないようです。
以下の手順だとうまくいくようです。

1. メニューの「ファイル」→「エクスポート...」を選択
2. ツリーから「Java」→「JARファイル」を選択して「次へ」ボタンを押下
3. エクスポート先のJARファイルのパスを指定して「次へ」ボタンを押下
4. そのまま「次へ」ボタンを押下
5. アプリケーションのエントリー・ポイントのクラスを指定して「完了」ボタンを押下

ちなみに3.や4.で「次へ」を押さずに「完了」することもできますが、それだと実行可能JARファイルになりません。

Eclipse上から実行する場合とJARファイルにして実行する場合とで、リソースのパスが変わってしまう問題を解消する

表題のとおりの問題が起こるのですが、ググってみると、うまく解消できずにif文で場合分けしていたりする方もいらっしゃるようです。
結論から言うと、この問題は解消できます。解消法はネット上で見つけたのですが、今またググってみたら見つかりませんでした……。出典が示せず申し訳ありませんが、とにかく解消法を記しておきます。
元記事が見つかりました。こちらの記事です。

1. メニューの「実行」→「実行構成...」を選択
2. ツリーから「Javaアプリケーション」→「(自アプリ名)」を選択
3. 「クラスパス」タブを選択
4. 「ユーザー・エントリー」を選択して「拡張...」ボタンを押下
5. 「フォルダーの追加」を選択して「OK」ボタンを押下
6. プロジェクトのルートフォルダーを選択して「OK」ボタンを押下

あとは、プロジェクトのルートフォルダー下にresなどのフォルダーを作ってリソースファイルを入れ、getClass().getResource("res/リソースファイル名")のようにアクセスすれば、Eclipse上からもJARファイルからも同じ位置に見えるようになります。

(追記)
上記は実行構成のクラスパスにフォルダを追加する方法ですが、ビルド・パスのソース・フォルダを追加する方法でもうまくいくようです。SoftBank S!アプリ編「リソースファイルの置き場所」参照

Javadocを日本語で表示する

プログラム中に記述されているクラス名やメソッド名の上にマウスカーソルを持っていくとJavadocがホバー表示されますが、これはデフォルトでは英語になっています。Shift+F2で表示される外部Javadocは日本語(Pleiades All in Oneの場合)なのに、なんでホバー表示は英語なんだろう? と思ったら、参照先が別になっているからでした。

ホバー表示を日本語化する方法はこちらのサイトに載っていました。

1. 日本語版のJavadocをOracleのサイトから頂いてきて、ローカルに展開しておく
2. メニューの「ウィンドウ」→「設定」を選択
3. ツリーから「Java」→「インストール済みの JRE」を選択
4. 表から使用中のJDKを選んで「編集...」ボタンを押下
5. 「JRE システム・ライブラリー」の中のrt.jarのツリーを展開
6. 「ソース添付:(パス名)」を選択して、「ソース添付...」ボタンを押下
7. 「外部フォルダー...」ボタンを押下
8. 1.で展開しておいたJavadocへのパスを指定して「OK」ボタンを押下
9. 「OK」ボタンを押下

これで終わっても良いのですが、デフォルトだとShift+F2で表示される外部JavadocはSunのサイトを参照しています。ネットにつながっていなくても見られるようにするには、これもローカルを参照したほうがいいかもしれません。

10. rt.jarの「Javadocロケーション:(URL)」を選択して、「Javadocロケーション...」ボタンを押下
11. Javadoc URLを選択して、ローカルのJavadocへのパスを指定し、「OK」ボタンを押下
12. 「完了」ボタンを押下

これで、ホバー表示と外部Javadoc表示が両方とも、ローカルの日本語Javadocを参照するようになります。

tag : Java Eclipse

Eclipse備忘録 - Javaアプレット編

トップに戻る

★アプレットビューアの起動時サイズを変更したいとき

(一度アプレットを実行した後でないとできないかも)

1. メニューの「実行」→「実行構成...」を選択
2. 左のツリーで「Java アプレット」の下の自アプレット名が選択されているのを確認
3. 「パラメーター」タブを選択
4. 幅と高さを変更

Eclipse上から実行する場合とJARファイルにして実行する場合とで、リソースのパスが変わってしまう問題を解消する

Javaアプリケーションの場合と同じ問題が起こると思います。対処法も同じ(でいいはず(^^;;)なので、Javaアプリケーション編をご覧ください。

Javadocを日本語で表示する

これもJavaアプリケーションの場合と同じです。Javaアプリケーション編をご覧ください。

★参照ライブラリを追加する

標準で参照されていないライブラリを、新たに追加する方法です。私の場合、アプレットからローカルファイルにアクセスするためにjavaws.jarというライブラリを参照するプロジェクトがあったので、それを例にしてみます。

1. プロジェクトを選択して、メニューの「プロジェクト」→「プロパティー」を選択
2. ツリーから「Java のビルド・パス」を選択
3. 「ライブラリー」タブを選択
4. 「外部 JAR の追加...」ボタンを押下
5. C:/Program Files/Java/jdk1.6.0_21/jre/lib/javaws.jarを指定して「開く」ボタンを押下
6. 「OK」ボタンを押下

tag : Java Eclipse

検索フォーム
RSSリンクの表示
リンク
QRコード
QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。