質問

中央サーバーからの頻繁な更新を必要とするAndroid用のライブラリを開発しています。自分のライブラリが自分自身を更新できるか、またはアプリのインストール時にターゲットライブラリをダウンロードするブートストラップライブラリをリリースできるとしたら、どんなに素晴らしいと思いましたか。

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

また、Androidマーケットの条件ではそのようなことが許可されていますか?

役に立ちましたか?

解決

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()(まだ持っていません)。

他のヒント

実際にあなたが望むものはサポートされ、動作します。 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を読んで確認する必要があります。

DexClassLoader が正解です。アプリケーションは、 DexFile を直接使用しないでください(クラスローダーが使用するためのものです)。

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

アプリプライベートデータ領域( Context.getFilesDir()からパスを取得)はより安全であり、アプリをアンインストールすると自動的にクリーンアップされるという利点もあります。これが推奨されるアプローチです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top