スポンサーサイト

上記の広告は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

続Ruby1.9.1

自分で書いたちょっとしたRubyスクリプト10本をRuby1.9.1に対応させてみました。
といっても、shebang行の下に
# -*- coding: Windows-31J -*-
とマジックコメントを入れただけです。

そして、Ruby1.9.1と1.8.7の両方で動くかテスト。ごく簡単なスクリプトなので、問題なく動きました。

tag : Ruby

Ruby 1.9.1

思い立って、Ruby 1.9.1(-p376)をインストールしてみました。(OSはWindowsXP SP3)
Ruby 1.8.7(-p174)と競合したりするのかなーと思ったんですが、今のところ特に問題になるようなことはなさそうです。

1.9.1用のスクリプトhoge.rbを実行するのに"ruby hoge.rb"とせずに、サボって"hoge.rb"とだけ打ったら1.8.7のほうが動いて、あれ?と思いましたが、たぶん拡張子.rbの関連付けが1.8.7のほうになっているからだろうと思います。これは、このままのほうがいいです。(常用するのは1.8.7のほうなので)

tag : Ruby

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