Androidで、ClassLoaderをカスタマイズして実行時にモジュールをロードする方法について参考リンクをメモ。
流れとしてはdexファイルを読み込んでパッケージローカルに保存、DexClassLoaderを使ってloadClass()する。
ただしこの時注意点があって、DexClassLoaderのコンストラクタには"Optimized Dex"ファイルの出力先ディレクトリを指定する引数がある。これをうっかりSDカードにしてしまうと、SDカードはパーミッション制御の範囲外になるので、悪意のあるアプリによって置き換えられてしまう可能性がある。
"dexファイルを読み込んで・・・"と書いてしまっているが、実際は"dexファイルが入ってるだけのjarファイル"なのでそこだけ注意。
ということで、動的なClassLoadingを行うときのセキュリティ上の注意点についてはとりあえず下記参照。
あと変わり種としてはPackageManagerを使って任意のパッケージからclassを取り出すサンプル:
プラットフォーム的な仕組みであるとか、プラグインモジュールのアーキテクチャに使うと面白そうです。
ただし、Android Developers Blog の記事にもありますが、ロードするDexファイルをビルドするためにAntを使わざるをえないなど、開発に一手間加わってしまう点に注意。