设置android:extractNativeLibs = false以减少应用大小

时间:2017-03-24 11:14:24

标签: android apk

我不确定,如果我做对了。它似乎正在做对位。如果我将标志android:extractNativeLibs设置为true,则应用程序占用大约70MB的用户空间(是的......)但是如果我将此标志设置为false,则设备上安装的应用程序的大小会跳到大约95MB。所以我不确定用户是否会喜欢这个。

3 个答案:

答案 0 :(得分:17)

这有点棘手。当extractNativeLibs设置为false时,您的APK尺寸将更大

旧行为

当extractNativeLibs设置为true(默认)或未添加到清单时,您的本机库可以压缩存储在APK中。它们在安装过程中由PackageManager提取,并将副本放到/ data / app /中。因此,本机库有两个副本 - 一个在APK中压缩,一个未压缩在/ data / app /.

这种方法具有以下优点:

  • 较小的APK尺寸,因为库已压缩

缺点:

  • 增加了安装尺寸(设置=>应用中的“存储”或“在磁盘上”),因为除了APK之外,提取的本机库占用磁盘空间
  • 安装时间更长
  • Google Play的优化程度较低,例如在生成更新补丁时

新行为

Google在Marshmallow(Android 6)中引入的新方法是通过将extractNativeLibs设置为“false”来启用的。它希望这些库在APK(STORE方法)和zipaligned中未压缩存储。在安装过程中无需提取它们。在应用启动时,可以直接从APK加载库。

优点:

  • 减少了安装大小(Settings => Apps中的“存储”或“在磁盘上”),因为无需提取库。基本上,占用的空间通常只比APK大小
  • Google Play的下载大小没有增加,因为它在APK
  • 之上使用了自己的压缩功能
  • 通过Google Play优化更新补丁生成,从而缩小所有更新尺寸。如果您更新本机lib,压缩版本将产生巨大差异,导致更大的补丁,而未压缩库的补丁将相对较小。

缺点:

  • 较大的APK大小,因为本机库未压缩

预计,我没有发现两个选项的加载性能有明显差异。

结论

extractNativeLibs =“false”选项对您的if:

非常有用
  • 你不关心APK的大小 - 要么是低于100 Mb的限制,要么你已经在使用扩展文件(OBB)并且可以处理APK大小的增加
  • 您关心的是Google Play中应用的更新尺寸
  • 您的本地图书馆不是很大。

例如,对于使用Unity制作的游戏,由于大​​型本机库,此选项几乎不适用。

更新:Android App Bundles

Android应用套件是Google Play宣布的新分发机制,更多详情可在官方网站https://developer.android.com/platform/technology/app-bundle/https://developer.android.com/guide/app-bundle/上找到

与传统的APK相比,它具有明显的优势,其中最重要的是150 Mb最大尺寸限制。 重要提示:这是下载大小,而不是应用包本身或生成的APK的大小。 (APK由Play生成并即时交付给设备,有关其工作原理的详细信息应在官方Android资源上提供。)

构建AAB时,默认情况下 extractNativeLibs 标志设置为“false”。但是,由于Google Play会在传送到终端设备的APK之上应用压缩,因此不会影响下载大小。这意味着这个标志只带来了Android App Bundles的好处 - 安装速度更快,磁盘尺寸更小,几乎没有额外成本,因为没有压力达到最大尺寸限制。

然而,一个令人困惑的事情是如何在接近150 Mb限制时计算下载大小,因为AAB大小并不表示下载大小。 bundletool 中有一个特殊的命令,或者您可以尝试直接将其上传到Play。如果您的AAB低于150 Mb,则无需担心。

(更新:对于应用程序包使用150 Mb大小限制而不是500 Mb;显然在开发人员预览中有500 MB可用,但截至目前尚未公开)。

答案 1 :(得分:6)

如果您的APK包含多个ABI,

extractNativeLibs="false"可能会适得其反。假设你使用的是每个ABI 10 MB的库,可以压缩到5 MB。如果你有3个ABI,那么结果是:

<强> extractNativeLibs = “真”

APK:       15 MB (3 x 5 MB)
Extracted: 10 MB
Total:     25 MB

<强> extractNativeLibs = “假”

APK:       30 MB (3 x 10 MB)
Extracted:  0 MB
Total:     30 MB

答案 2 :(得分:0)

虽然有一些重要的先决条件可以使用,但事情变得更加复杂:

  • APK 中的.so文件无法压缩 - 必须存储它们。
  • 使用zipalign -p 4
  • ,.so文件必须页面对齐

更新:以下部分仅适用于Android Studio 2.1及更低版本。 从Android Studio 2.2 Preview 2和最新的构建工具开始,构建过程将自动在APK中存储未压缩和页面对齐的本机库。

更多信息:link

更新:如果您在某个时候手动为自己的应用进行了签名,则 时会调用zipalign。

  

警告:您必须在应用构建过程中的两个特定点之一使用zipalign,具体取决于您使用的应用签名工具:

     
      
  • 如果您使用apksigner,则必须先执行 ,然后才能对APK文件进行签名。如果您使用apksigner对APK进行签名并对APK进行进一步更改,则其签名将失效。
  •   
  • 如果您使用jarsigner,则只能在 APK文件签名后执行zipalign。
  •   

来源:zipalign | Android Developers

Android 6+将阻止您使用未压缩的本机库安装未对齐的APK。较旧的Android并不关心并始终提取本机库。