Android 预装 NDK 应用

标签 android android-ndk

我们正在尝试将 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/

相关文章:

android - 在 Apple Store 和 Google Play 中发布

android - Crashlytics 找不到由 Google 服务生成的资源文件。您可能需要执行 :process<Variant>GoogleServices Task

android - 如何从操作栏 Sherlock 中删除 HomeAsAp 按钮箭头?

c++ - "no matching function call to ' 使用 Android NDK 编译时绑定(bind) '"

android - 如何在android ndk中添加多个共享库?

gradle - Android Studio Gradle 构建 : NDK error

android - 如何从我包含在 Android 上的第三方库中删除未使用的资源?

android - 使用首选项——我的 ListView 是空的(无法存储数据)

Android NDK,两个静态库和链接

gcc - 由eglMakeCurrent触发的堆栈保护