我们正在尝试将 NDK 应用程序预安装到 /system/app
目录中。如果我在 ZIP 文件管理器中打开 apk 文件,.so
文件位于 lib 目录中。但是,当我们预装apk
文件时,apk的.so
文件并没有复制到system/lib
目录下,导致应用失败当我们在设备中启动它时。
谁能告诉我应该在 Android.mk
中为 APK 文件设置什么,以便 .so
文件将从 APK 文件中提取并复制到 system/lib
目录?我们需要将应用程序包含在系统镜像中。
我们将不胜感激任何反馈。
谢谢, 艺术类
最佳答案
我有同样的需求,经过 2 天的大量研究,我想出了解决这个问题的方法。这并不简单,还需要您能够修改 Android 系统代码。
基本上,PackageManagerService 会阻止系统应用程序解压缩其 native 二进制文件(.so 文件),除非它们已被更新。所以解决这个问题的唯一方法是修改 PMS.java(这个名字很贴切,因为试图解决这个问题让我心情很糟糕)。
在系统首次启动时,我通过编写一个 isPackageNative(PackageParser.Package pkg) 函数来检查每个系统包中的 native 二进制文件:
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) 检查。还需要进行其他一些小的修改,但是一旦您有了这个方向,您可能就会弄清楚。希望对您有所帮助!
关于Android 预装 NDK 应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6546713/