2009-06-16 27 views
15

私は、中央サーバからの頻繁な更新が必要なAndroid用ライブラリを開発しています。私のライブラリがそれ自体を更新できるかどうか、またはもし私がちょうど、アプリケーションがインストールされたときにターゲットライブラリをダウンロードするブートストラップライブラリをリリースできるかどうか、私は考えていました。Androidリモートコードの読み込み

このクラスは1.5で "DexClassLoader"と呼ばれていますが、APIドキュメントの他にウェブ上には貴重なものがほとんどないようです。誰かが私が記述したシナリオでこれをうまく使用しましたか?

また、Androidマーケットの条件では、このようなことを許可しますか?

答えて

13

DexClassLoaderを正常に使用しました。実際にあなたのアプリで書き込み可能なdexOutputDirを提供することが重要ですので、/data/dalvik-cacheではありません。そうでなければ、ログには1〜2行の書き込みが失敗し、その後にはClassNotFoundExceptionが続きます。

cl = new DexClassLoader("/full/path/com.example.apk", 
         getFilesDir().getAbsolutePath(),// /data/data/foo/files 
         null, // native lib path, I haven't used this 
         MyClass.class.getClassLoader()); 
// This doesn't make Class.forName() work, instead I do this: 
Class<?> foo = cl.loadClass("com.example.foo"); 

Class.forName()仕事をするために、あなたは(私が持っていない)Thread.setContextClassLoader()を試みることができます。

+0

こんにちは、完全なソースコードを追加してください。これは大きな助けになるでしょう。事前に感謝します。 –

+1

アンドロイド5ロリポップ以上ではARTのために動作しません:http://stackoverflow.com/questions/27349097/load-dex-file-dynamically-on-android-5-0 – gturedi

3

実際、あなたが望むものはサポートされています。 DexClassLoaderは期待通りに動作しませんが、次のコードはうまく動作します。

DexFile df = new DexFile(new File("/data/app/my_downloaded_lib.apk")); 
ClassLoader cl = getClassLoader(); 
Class clazz = df.loadClass("com/my/lib/MyClass", cl); 

市場に関する質問については、私はこれに問題は見られませんが、EULAを必ず読んで確認してください。

+0

これは動作しますが、Fileオブジェクトを作成することは逆効果です。DexFileはパスを取得して開きます。あなたはStringパスを取るコンストラクタを使うことができます。 –

+0

こんにちは、あなたは正しいかもしれませんが、私が答えたとき、これが働く唯一の方法でした。 –

2

DexClassLoaderが正しい答えです。アプリケーションは直接DexFileを使用するべきではありません(クラスローダーによって使用されることを意図しています)。

dexOutputDirパラメータに外部ストレージ(/sdcard)またはアプリのプライベートデータ領域を使用できます。外部ストレージは通常より大容量ですが、カードが取り出されるとアプリケーションが強制終了され、ファイル権限の執行が不十分なため、第三者がコードを置き換えるのは簡単です。これにより、悪意のあるアプリがアプリに任意のアクションを実行させる可能性があります。 (あなたはとにかくそれをしたい場合は、Environment.getExternalStorageDirectory()経由のパスを取得します。。WRITE_EXTERNAL_STORAGE許可が必要です)

アプリ - プライベートデータ領域(Context.getFilesDir()からのパスを取得すること)より安全であり、また、洗浄されるという利点を持っていますアプリがアンインストールされると自動的に起動します。これが推奨されるアプローチです。

+4

私はまた、 SDカードは多少安全ではないでしょう。 – CommonsWare

+0

dexファイルをSDカードのパスに書き込まないでください。これによりセキュリティ上の脆弱性が生じます。 http://www.symantec.com/connect/blogs/android-class-loading-hijacking – ajma

+0

セキュリティの問題に対処するために更新されました。 – fadden

関連する問題