アプリケーションパッケージ(.apk)中のクラスを列挙する

アプリケーションパッケージ(以降"apk")自身はzip形式のアーカイブファイルだが、内部に格納されるクラスはdex形式(Dalvik)でもclass(Java)でもよく、そのために仮想マシンがdex形式を必要とするか否かを決定するため、システムプロパティandroid.vm.dexfileが用意されている。

  • PathClassLoader.java (抜粋)
boolean wantDex = System.getProperty("android.vm.dexfile", "").equals("true");

といっても、現在の我々がAndroid SDKで開発するアプリケーション/ライブラリィをパッケージングする場合、(特にADTを使う場合は間違いなく)dex形式な訳で、今回のコードも格納されるのはdex形式であることを前提にしている。

  • enumClassNames (現在のContextが属するパッケージ(apk)からdex形式のクラス名エントリを列挙する)
public static Enumeration enumClassNames(Context context) {
    String packageName = context.getApplicationInfo().sourceDir;
    DexFile dexFile = new DexFile(new File(packageName));
    return dexFile.entries();
}

たった3行のメソッドだが、これが中々出来ずにいた訳で、やっと能動的にクラスを選択できるようになった。