Eclipse(ADT)を使ってAndroid Projectで開発している際に、デバッグなどの目的でAndroidのJavaのソースコードを参照したいことがあると思いますが、どうすれば効率がよいかちょっと悩み中です。とりあえず私が現在やっている方法を書きます。ので、もしもっといい方法があれば教えて下さい。
私が悩んだところは以下の2点です。
1. ディレクトリ構成
Repo(git)で取得したpublicリポジトリのディレクトリ構成だと同一の(またはよく似た)Javaパッケージが別のProjectにも入っていたりするので、ソースコードを手軽にアタッチすることが出来ません。なので、SDK部分のソースコードを見たくなったときは、そのソースのある場所を探さなければならないというわずらわしさがあります。私は最初はシンボリックリンクで何とかしようと思ったのですが、面倒すぎて途中で挫折しました。現在は以下のようなrubyスクリプトを書き、必要そうなJavaソースをSDKのホームディレクトリへコピーしています。リポジトリが更新されたら、スクリプトを流しなおします。
require 'fileutils'
#####################################################################
# Android SDK home
$SDK_HOME = "/User/egawa/android/android-sdk-mac_x86-1.0_r1"
# the root directory was pulled down from the public Android repositories
$SRC_ROOT = "/User/egawa/android/gitsources"
#####################################################################
$SDK_SRC_DIR = File.join($SDK_HOME, "sources")
$FILTERS = [
/.+\/src\/main\/java\/(.+$)/,
/packages\/.+\/src\/(.+$)/,
/external\/.+\/src\/(.+$)/,
/external\/.+\/src\/(.+$)/,
/frameworks\/base\/awt\/java\/(.+$)/,
/frameworks\/base\/cmds\/am\/src\/(.+$)/,
/frameworks\/base\/cmds\/input\/src\/(.+$)/,
/frameworks\/base\/cmds\/pm\/src\/(.+$)/,
/frameworks\/base\/cmds\/svc\/src\/(.+$)/,
/frameworks\/base\/core\/java\/(.+$)/,
/frameworks\/base\/graphics\/java\/(.+$)/,
/frameworks\/base\/location\/java\/(.+$)/,
/frameworks\/base\/media\/java\/(.+$)/,
/frameworks\/base\/opengl\/java\/(.+$)/,
/frameworks\/base\/packages\/SettingsProvider\/src\/(.+$)/,
/frameworks\/base\/packages\/SubscribedFeedsProvider\/src\/(.+$)/,
/frameworks\/base\/sax\/java\/(.+$)/,
/frameworks\/base\/test-runner\/(.+$)/,
/frameworks\/base\/tools\/.*\/src\/(.+$)/,
/frameworks\/base\/wifi\/java\/(.+$)/,
/frameworks\/policies\/base\/phone\/(.+$)/
]def match filepath
$FILTERS.each do |filter|
return $1 if filter =~ filepath
end
nil
endSTDOUT.sync = true
puts "copying sources from #{$SRC_ROOT} to #{$SDK_SRC_DIR}"
Dir.glob("#{$SRC_ROOT}/**/*.java").each_with_index do |src, index|
print '#' if index % 100 == 0
next unless matched_src = match(src)
dest = File.join($SDK_SRC_DIR, matched_src)
FileUtils.makedirs(File.dirname(dest))
FileUtils.cp(src, dest)
# log
# puts "#{src} was copied to #{dest}"
end
puts ''
puts 'done.'
2. android.jarの中に含まれていないクラス
ZygoteInitやActivityThreadなどはpublicリポジトリにソースはありますが、SDKのandroid.jarにはクラスが含まれていません。このようなものはコンパイルタイムではEclipseにクラスとして認識されていないので「型を開く(Open by Type)」などでも出てきません。多分アプリを作っている限りは、それらのクラスと直接依存するようなコードを書くことはないと思うので、実際にはあまり不便を感じないかもしれませんが、ランタイムでは、たとえば、デバッグモードで実行し任意の場所で止め、コールグラフからActivityThreadなどのソースに飛びたいことがあります。ソースが見れないときにはEclipseからソースのありかを求められるので、そのときに先ほどのスクリプトで取得したソースコードのディレクトリをexternal folderとして指定することで、参照できるようになります。android.jarに対するソースコードのアタッチとは別になります。