« Android - ソース公開 & iPhone - 出荷台数 | メイン | iPhoneネイティブアプリ開発関連のドキュメントの日本語版が公開 »

Android - Eclipseで開発時にAndroid SDKのソースコードを見る方法

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
end

STDOUT.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に対するソースコードのアタッチとは別になります。

トラックバック

このエントリーのトラックバックURL:
http://www.grandnature.net/bin/mt-tb.cgi/91

コメントを投稿

About

2008年10月31日 12:53に投稿されたエントリーのページです。

ひとつ前の投稿は「Android - ソース公開 & iPhone - 出荷台数」です。

次の投稿は「iPhoneネイティブアプリ開発関連のドキュメントの日本語版が公開」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。