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

自動生成されたファイルを除外するように変更。