I have developed a system app for my rom which includes some native libraries.I have tried below:
-
do not copy this native libraries into /system/lib, but let it in the apk. In this case, the libraries will not be copied to /data/data/xxxx/lib on system start and my app will failed to run since library can not found.(PackageManagerService.java 3301Note: We don't want to unpack the native binaries for system applications, unless they have been updated (the binaries are already under /system/lib). In other words, we're going to unpack the binaries only for non-system apps and system app upgrades.)
-
copy this libraries to /system/lib. My app run correctly first, but when I upgrade it, the new version of libraries will be copied to /data/data/xxxx/lib on start up. But since android will looking for libraries at /system/lib before /data/data/xxx/lib( In DexClassLoader::findLibrary), the older version of libraries will always be loaded. It means that I will failed to upgrade native libraries then.
So, What should I do? Thanks
You can use System.load()
, which use a full path parameter, to implement a different library search mechanism, in contrast to System.loadLibrary()
. Below is a simple example:
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);
}
}