【问题标题】:apkbuilder too slow on certain filesapkbuilder 在某些文件上太慢了
【发布时间】:2014-06-17 17:21:11
【问题描述】:

我的 JNI .so libray 需要 8-10 秒才能使用 apkbuilder 打包 apk。 该库大约 8MB,主要用 C++ 编写。

为了澄清问题,我做了以下测试。

1) 其他.so库

我将 .so 库替换为大约 10MB 的其他 .so 库,主要是用 C 语言编写的。令人惊讶的是,使用新的 .so 需要 1.5 秒,它也是用于相同 CPU 架构的 JNI 库。

2) 虚拟文件

我在我的 libs/armabi-v7a 目录中放置了一个名为 xxx.so 的虚拟文件。需要 1 秒。

3) 不同的 CPU 架构

我所有用于 arm/x86/mips 的 .so 库都需要 8-10 秒。

4) 伪造

我使用十六进制编辑器在具有随机值的随机位置编辑了我的 .so 库。也需要 8-10 秒。

为什么只有我的 .so 库需要很长时间才能使用 apkbuilder 打包到 apk 中?有什么方法可以加快我的 .so 库的这个过程吗?

【问题讨论】:

    标签: android android-ndk shared-libraries apk


    【解决方案1】:

    APK 文件本质上只是一个 ZIP 文件,并且 .so 文件被添加到其中,无需任何 APK 特定的处理。所以最可能的原因是 apkbuilder 试图压缩你的 .so 文件,这需要一些时间,同时认为另一个 .so 文件不可压缩并只是存储它。

    AFAICS 加快此过程的唯一方法是将 apkbuilder 源更改为始终存储而不是压缩 .so 文件。

    【讨论】:

    • 部分资源承诺不压缩存储在APK中,但libs文件夹没有这样的合同义务。
    • 汉斯,是否有任何选项标志“不要尝试放气”我的 .so for apkbuilder?
    • 遗憾的是没有这样的标志。您需要修改 apkbuilder 的源代码。最新源代码在这里:android.googlesource.com/platform/tools/base/+/master/sdklib/…
    • 汉斯,我按照您的建议解决了修复 sdklib 的问题。时间由 zip 压缩器占用。如果我在 SignedJarBuilder 中将 mOutputJar.setLevel 的 zip 级别从 9 更改为 3,它将大大提高整体性能。谢谢。
    【解决方案2】:

    我发现 ZipOutputStream 花费了大部分时间来压缩 .so 文件。

    Android ApkBuilder 使用压缩级别 9,压缩级别最高,但性能最慢。如果我将此级别更改为 3,则整体性能会显着提高,压缩比损失很小。

    您可以更改此级别以修复 sdklib 源代码。 在 SignedjarBuilder.java (com.android.sdklib.internal.build) 中,找到“mOutputJar.setLevel”并更改所需的级别。然后创建 sdklib.jar 并将其复制到您的 Android SDK 目录 (android_sdk/tools/lib)

    您可以在这里下载源代码: https://android.googlesource.com/platform/tools/base/+/master/sdklib/src/main/java/com/android/sdklib/build/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 2015-03-06
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多