Android のソースコードを Eclipse 上から閲覧
Android のソースコードを Eclipse 上で見たい、という欲求があって、でも Android のソースは散らばっているので、一箇所にまとめるコマンドラインツールを Java で書いてみました。
ソースコードは一番下です。
使い方
cd android-sdk/platforms/android-1.6 mkdir sources cd sources java CopyAndroidSrc ~/mydroid
~/mydroid というのは Android のソース一式があるディレクトリです。このようにするとカレントディレクトリにソースコードが適切にコピーされてきます。
上記を行った後、Eclipse でプロジェクトをリフレッシュすれば、Android のコードをどんどん追いかけられます。
ソースコード
import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.nio.channels.FileChannel; import java.util.ArrayList; public class CopyAndroidSrc implements FileFilter { static ArrayList<File> src = new ArrayList<File>(); static FileFilter filter = new CopyAndroidSrc(); private static void list(File dir) { File[] files = dir.listFiles(filter); for (File file : files) { if (file.isDirectory()) { list(file); } else { src.add(file); } } } public static void main(String[] args) throws Exception { if (args.length == 0) { System.out.println("Usage: java CopyAndroidSrc <root>"); System.exit(0); } list(new File(args[0])); for (File file : src) { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line; File dir = new File("."); while ((line = br.readLine()) != null) { if (line.startsWith("package")) { String pkg = line.substring("package".length()); pkg = pkg.trim(); pkg = pkg.substring(0, pkg.length() - 1); pkg = pkg.replace('.', File.separatorChar); dir = new File(pkg); dir.mkdirs(); break; } } br.close(); File dest = new File(dir, file.getName()); FileChannel srcChannel = new FileInputStream(file).getChannel(); FileChannel destChannel = new FileOutputStream(dest).getChannel(); try { System.out.println("copy... " + dest.getPath()); srcChannel.transferTo(0, srcChannel.size(), destChannel); } finally { srcChannel.close(); destChannel.close(); } } } @Override public boolean accept(File f) { if (f.isDirectory()) { if (f.getName().charAt(0) != '.') { return true; } else { return false; } } if (f.getPath().indexOf("/out/target/common/") != -1) { return false; } String name = f.getName(); if (name.length() > 5) { name = name.substring(name.length() - 5); return name.equalsIgnoreCase(".java"); } return false; } }
追記 2009/11/26
自動生成されたファイルを除外するように変更。