我有同样的需求,之后重研究2天,我想出了一个解决这个问题。这并不简单,并且需要您能够修改Android系统代码。
基本上PackageManagerService防止系统应用到他们的解压本地二进制文件(.so文件),除非他们已经被更新。所以解决这个问题的唯一方法就是修改PMS.java(正确命名,因为试图解决这个问题让我处于一种可怕的情绪)。
对系统的第一次开机,我写一个isPackageNative(PackageParser.Package PKG)检查各系统封装机二进制文件的功能:
private boolean isPackageNative(PackageParser.Package pkg) throws IOException {
final ZipFile zipFile = new ZipFile(pkg.mPath);
final Enumeration<? extends ZipEntry> privateZipEntries = zipFile.entries();
while (privateZipEntries.hasMoreElements()) {
final ZipEntry zipEntry = privateZipEntries.nextElement();
final String zipEntryName = zipEntry.getName();
if(true) Log.e(TAG, " Zipfile entry:"+zipEntryName);
if (zipEntryName.endsWith(".so")) {
zipFile.close();
return true;
}
}
zipFile.close();
return false;
}
这个功能检查每一个包本机库,如果有一,我解开它。 PMS在scanPackageLI(....)中检查。搜索的方法如下代码:
if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg))
,并添加isPackageNative(PKG)检查。还有其他一些小的修改需要,但是一旦你有了这个方向,你可能会想出它。希望能帮助到你!
从技术上讲,我相信.so文件应该被复制到/data/data/com.yourpackage.name/lib目录中,但是我在预装的应用程序中遇到同样的问题,不会将其复制到APK。 – Devunwired
我们所做的只是使用任何压缩工具(例如7zip)手动解压APK这样的文件。然后,我们创建了一个make文件,在编译android源代码时将文件复制到/out/..../system/lib目录。在我们的例子中,我们希望将它包含在ROM映像中,因为它是本地应用程序所需要的,这就是为什么我们需要将它复制到/ system/lib目录。 – artsylar
你可以参考这个论坛https://groups.google.com/group/android-ndk/browse_thread/thread/2d08a95b3038e532?hl=ja 他们有同样的问题,我们的 – artsylar