Android预安装NDK应用程序

art*_*lar 9 android android-ndk

我们正在尝试将NDK应用程序预安装到/system/app目录中.如果我在ZIP文件管理器中打开apk文件,该.so文件位于lib目录中.但是,当我们预安装apk文件时,apk的.so文件不会复制到system/lib目录,导致应用程序在我们在设备中启动时失败.

任何人都可以告诉我应该Android.mk在APK文件中设置什么,以便从APK文件.so中提取文件并复制到system/lib目录?我们需要将应用程序包含在系统映像中.

任何反馈将不胜感激.

谢谢,artsylar

Nik*_*hil 4

我有同样的需求,经过两天的大量研究,我想出了解决这个问题的方法。这并不简单,还要求您能够修改 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;
  }
Run Code Online (Sandbox Code Playgroud)

该函数检查每个包中是否有本机库,如果有,我将其解压。PMS 在 scanPackageLI(....) 中执行此检查。在方法中搜索如下代码:

   if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg))
Run Code Online (Sandbox Code Playgroud)

并添加 isPackageNative(pkg) 检查。还需要进行其他一些小的修改,但是一旦有了这个方向,您可能就会弄清楚。希望能帮助到你!