2

いくつかのネイティブ ライブラリを含む ROM 用のシステム アプリを開発しました。私は以下を試しました:

  1. このネイティブ ライブラリを /system/lib にコピーしないで、apk に入れます。この場合、システムの起動時にライブラリが /data/data/xxxx/lib にコピーされず、ライブラリが見つからないためアプリの実行に失敗します。( PackageManagerService.java 3301 注: 更新されていない限り、システム アプリケーションのネイティブ バイナリを展開したくありません (バイナリは既に /system/lib の下にあります)。つまり、バイナリを展開します。非システム アプリとシステム アプリのアップグレードのみ)。

  2. このライブラリを /system/lib にコピーします。アプリは最初は正しく実行されますが、アップグレードすると、起動時に新しいバージョンのライブラリが /data/data/xxxx/lib にコピーされます。しかし、Android は /data/data/xxx/lib( In DexClassLoader::findLibrary) の前に /system/lib でライブラリを検索するため、古いバージョンのライブラリが常に読み込まれます。これは、ネイティブ ライブラリのアップグレードに失敗することを意味します。

それで、私は何をすべきですか?ありがとう

4

1 に答える 1

3

System.load()とは対照的に、完全パス パラメータを使用する を使用して、別のライブラリ検索メカニズムを実装できますSystem.loadLibrary()。以下に簡単な例を示します。

public void loadLibrary(Context context, String libName) {
    String packageName = context.getPackageName();
    String libPath = "/data/data/" + packageName + "/lib/" + libName;
    if (new File(libPath).exists()) {
        System.load(libPath);
    } else {
        System.loadLibrary(libName);
    }
}
于 2012-06-27T11:14:15.913 に答える