【问题标题】:Reducing android app (apk) size减小 android 应用 (apk) 大小
【发布时间】:2014-09-25 21:57:11
【问题描述】:

我现在将在 Google Play 商店上发布我的第一个应用程序。我已经压缩了我的应用程序中使用的图像。我对应用大小有一些疑问。

如果应用程序的大小小于 2 MB,那么用户卸载应用程序的机会就会减少,我的这种说法是否适用于属于教育领域的应用程序?

但是,当我在 Windows 中看到我的 apk 文件时,它显示为 3.10 MB,但是当它安装在设备中时,从应用信息中查看它显示:

Total............................8.68 MB
App..............................7.02 MB
USB storage app..................0.00 B
Data.............................1.66 MB (perhaps it is the size of sqlite db + ttf's)
SD card..........................0.00B

那么,为什么我的应用程序大小增加了这么多,可以最小化吗?

而且,我在我的项目中使用了 4 个库(jar),它们位于 Android Private Libraries,但这些库的副本也在此文件夹之外。

删除它们是否更安全,并且删除它们有助于减小 apk 大小?

我还访问了许多描述Proguard 功能的网页,我真正了解 Proguard 如何减小 apk 的大小,它通过删除未使用的代码并重命名类、字段和语义上的方法来缩小、优化和混淆我们的代码晦涩的名字。结果是较小的 .apk 文件更难进行逆向工程。但是我不知道我的proguard-project.txt应该是什么样子?
我在我的应用程序中使用了 4 个库,即 easyfacebookandroidsdk_2.3.jarandroid-support-v7-appcompat.jargoogle-play-services.jarandroid-support-v4.jar

目前我的proguard-properties.txt 看起来像这样并且它也不使用 WebView

# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;  
#}
-keep class com.facebook.** { *; }
-keepattributes Signature

那么,我应该在proguard-properties.txt 中添加哪些行,以便它可以删除未使用的引用、类等,以减小 apk 大小?

使用https://code.google.com/p/android-unused-resources/ 提供的AndroidUnusedResources.jar 在android 项目中查找未使用的资源。

我认为这与 proguard 已经做过的事情是一样的吗?还是应该在启用proguard后也使用它?

您还可以在回答中提及您认为应该分享的任何缺失的内容。
在此先感谢...

【问题讨论】:

  • 您是从哪里听到 2MB 声明的?我会发布应用程序,并始终尝试减少应用程序的占用空间。如果用户发现您的应用有帮助,他们就不会卸载它。
  • 你是对的,如果用户发现应用程序有帮助,那么他们不会卸载它。 2 MB 是我个人的意见,因为当用户磁盘空间不足时,他有时会删除占用内存的应用程序,不过谢谢
  • 如果用户的设备存储空间不足,他选择删除的应用程序将是他不再使用或不再需要的应用程序。我的建议类似于上面的@ChristopherRucinski。制作一个用户不想卸载的有用的应用程序。 2-8 MB 的应用存储空间也只是杯水车薪。
  • 我确实提供了一些其他想法,您可能会在下面的回答中发现它们有用。就像我说的那样,您可能想要上传一些图片,以便我们可以了解如何以您现在可能知道的方式更多地解压缩它们。另外,我确实说过您可以将数据移动到 SD 卡!在您找到减小 APK 大小的好方法之前,这可能是一个很好的解决方案

标签: java android jar apk proguard


【解决方案1】:

那么,为什么我的应用程序大小增加了这么多,可以将其最小化吗?

几乎完全是因为您的 res 文件夹图像!在 drawable-mdpi、-hdpi、xhdpi 文件夹中,每个图像应该有大约 4 个副本。唯一的区别是它们的大小不同。

删除它们是否更安全,并且删除它们有助于减小 apk 大小?

这些 jar 文件可能没有多个副本!只有一份带有链接的副本!

Proguard

是的,你说的关于 Proguard 是对的。但是,请意识到您在这里谈论的是文本文件。他们真的很小。我的意思是尺寸非常小(以千字节计)。您的问题是兆字节 (MB) 大小。那是图片!!!!

重复。那是图片!!!

启用 proguard 会节省一点大小。

您还可以在回答中提及您认为应该分享的缺失内容吗?

是的,这些对你来说都更重要。请阅读并应用这些。祝你好运!

如果用户发现您的应用有帮助,他们就不会卸载它;但是,您可以做几件事

  • 您能否将图片移至网络async 将它们放入您的应用中?
  • 确保您的文件尽可能完全压缩。使用pngquanttinypng
  • 检查图像中是否有任何重复。您或许可以使用 9-patch
  • 您也许可以为某些图像制作自己的可绘制对象
  • 允许用户将数据移至 SD 卡

  • [EDIT] 在应用在 Play 商店中出现一段时间后,检查开发者控制台并查看使用最少的屏幕尺寸/密度。 em> 从您的应用程序中删除该可绘制文件夹!这可以大大减少大小!但是,请检查我在下面的编辑以了解这种方法的缺点!

  • [编辑 2] 在 Windows 资源管理器中,检查整个 res 文件夹 和整个 java 文件夹的 文件夹大小 。如果您的 java 文件夹很小,那么您减少 APK 大小的所有努力都应该是我上面所说的。

您可能想展示一些图片,因为这样可以让我们看到您正在处理的内容

编辑

@Ashwin N Bhanushali 对于我没有回答的部分问题有一个很好的答案here,但他基本上告诉你,除了我所说的之外,你真的无能为力,再加上一个或两个想法。

我确实有另一个想法是基于他的一个更好的想法,因为 Android Studio 不再在项目中包含 drawable-ldpi 文件夹。所以只有使用 Eclipse 才会有帮助,我的扩展了

  1. 在进行建议的修复后,将 APK 发布到 Google Play 商店
  2. 过了一段时间 -- 一周、一个月等 -- 您可以Google Play Developer Console查看您的应用程序的统计信息 .
  3. 寻找使用最少的屏幕尺寸桶drawable-mdpi、-hdpi、-xhdpi、-xxhdpi)!您可以从您的应用中完全删除这些存储桶!

这是因为图片比文本文件占用更多的字节。所有这些可绘制对象都有相同的图像只是大小不同)。 从较少使用的存储桶中删除图像可以节省大量空间!

请注意,从您的应用中移除这些存储桶将意味着您的应用将不得不在那些使用已移除存储桶的手机上做更多的工作这些用户的应用程序可能会变慢;但是,应用程序的大小可以进一步减小。

编辑 2

文本文件几乎不占用任何内容。查看您项目的文件系统!

在下图中。检查...的大小...

  • java 文件夹
  • res 文件夹

在您的情况下,您会看到 java 文件夹可能非常小10 到几百 KBs);但是,您会看到 res 文件夹非常大几 MB!)。

这意味着您的代码库中的任何压缩或减少都将非常小而且不值得!

因此,减小 APK 大小的最佳方法是按照我上面的说明进行操作!

编辑 3

这是一个您可以立即进行的测试,并查看像 ProguardAndroidUnusedResources.jar 等工具将减少的大小的绝对最大值(以及更多) APK 文件!

您需要做的是从您的项目中删除 ALL 代码,类声明除外。对抽象类、接口、枚举等执行相同的操作...您的项目结构应该保持不变,并且您根本不应该使用任何外部库。

  1. 所以你的所有课程都会有这样的东西......

    public class CustomClass {
    
        private String variable; // List of variables
    
        public CustomClass() { ... } // List of constructors
    
        public getVariable() { ... } // List of Assessors
    
        public setVariable(String val) { ... } // List of Mutators
    
        private String helperMethods() { ... } // List of helper and other methods
    
    }
    
  2. 您应该删除类、接口、枚举等内部的所有代码,如下所示;但是,请不要理会所有图像! ...

    public CustomClass {
    
        // Everything is removed!! No libraries used, nothing. Unless certain classes 
        //     require some methods like Activity. Those methods should be empty though!
    
    }
    
  3. 现在编译并构建您的项目。

  4. 检查新的 APK 大小到您当前的 APK。

    • 这将是您的代码可以实现的最小的压缩文件。是的,你的程序不会做任何事情,但这不是重点。您在这里关心大小,这只是一个测试。
  5. 在您的手机上安装该应用,并检查新的应用大小与您当前的应用大小

    • 这将是您的代码可以实现的最小的未压缩大小的文件。是的,你的程序不会做任何事情,这只是一个测试。

如果您注意到这 2 个应用程序的大小仍然大致相同,那么在此阶段将所有时间花在 Proguard 和 AndroidUnusedResources.jar 上是没有意义的。这是一项测试,看看您将把个人资源用于减少应用程序大小的地方。

【讨论】:

  • 另外 - 默认情况下,Eclipse 通常会在项目中添加 android-support 库。如果您没有在代码中使用这些支持类中的任何一个,只需将该 jar 文件从您的项目中取出。它将减少 600KB 的应用程序占用空间。
  • *AndroidUnusedResources.jar 可在code.google.com/p/android-unused-resources 找到 android 项目中未使用的资源。 * 和proguard有什么区别?
  • 如你所说...**Proguard** reduces size of apk, it **shrinks**, optimizes, and obfuscates our code **by removing unused code** and renaming classes, fields, and methods with semantically obscure names. The result is a smaller sized .apk file that is more difficult to reverse engineer.
  • 我没用过AndroidUnusedResources.jar;但是,似乎**AndroidUnusedResources.jar** reduces size of apk, it **shrinks** our code **by removing unused code**. The result is a smaller sized .apk file that does not have unneeded library code.
  • 我刚刚添加了编辑 3。检查一下。这将是一个简单的测试,您可以通过它来查看代码库 + 库与图像文件的大小。
【解决方案2】:

那么,为什么我的应用程序大小增加了这么多,可以将其最小化吗?

.apk 文件

.apk 文件一点也不神奇。它只是代表 Android 应用程序内容的文件包。如果您在存档工具(如 7Zip)中打开它,您可以浏览并提取其内容。

现在这个 apk 文件是在安装过程中提取的,因此应用程序的大小会增加。

有关编译的更多细节

.java 文件会发生什么?

嗯,首先它们通常由已安装的 JDK 实现编译。在它们被编译(到 .class-files)之后,Android SDK 中的 dx-tool 然后将这些“普通”java-classes 交叉编译成 Dalvik-Bytecode。

然后,这个“特殊”java 代码由基于开源 JRE 实现 Apache Harmony 的 DVM(Dalvik 虚拟机)解释。

我放入 /asset-directory 的资源会怎样?

Android 提供 /assets-directory 来添加一些二进制原始文件(例如 SQLite 数据库)。放入此目录的文件未编译或优化。

如果您将文件放入此目录,这就是您期望 Android 的行为。

我放入 /res/raw 目录的资源会怎样?

与 /assets 目录一样,您也可以在此处放置二进制(或其他)原始文件(例如,帮助页面的 HTML 文件)。这些文件已编译/优化(如果可能)。

Manifest 和其他 XML 文件会发生什么变化?

Android 清单以及其他 XML 文件(布局、字符串等)都被存储并“编译”成二进制 XML 格式。这是速度优化。

所以你知道为什么安装后应用大小会增加。

现在 删除它们(Android 库)是否更安全,并且删除它们有助于减小 apk 大小?

您可以删除google-play-services.jar,因为它仅在开发环境中需要它在运行环境中不需要。提示用户从Play商店安装它。

来到Proguard ::它将删除未使用的java类并进行代码混淆。它不会删除未使用的资源,如布局xmls,drawables等。所以我的意见是运行该工具删除未使用的资源。

以下是一些减小尺寸的技巧。

You can remove drawable-ldpi folder if you are using it.Since there are no more devices with ldpi screen resolution.

Reduce the use of image drawables(i.e .png or jpg files).Use xml drawables and 9-patch drawables.

Remove any debug info related code.

Avoid code duplication.Follow the principal of Don't Repeat yourself.

我认为这足以减少您的应用程序大小。

【讨论】:

  • 您能否解释一下如何从版本(Android Studio)中删除 google-play-services.jar?找不到,但是 play-services 客户端太大了,可以将它包含在 0.8MB 大小的 APK 中...谢谢。
  • 将 google-play-services 添加为您的 gradle 脚本中提供的依赖项。
【解决方案3】:

以下是减小应用程序大小的方法。详细说明在下面的链接中。

https://medium.com/@fahimsakri/put-your-apks-on-diet-cc3f40843c84#.m860q8s1u

  • Proguard
  • 矢量绘图
  • Apk 拆分
  • 优化 png 图片
  • 删除未使用的资源
  • 9 补丁图像
  • 压缩 Jpeg 图像
  • 删除调试信息
  • 避免重复
  • 广泛使用 lint
  • 尽可能重复使用资源
  • 推荐的媒体格式

【讨论】:

    【解决方案4】:

    对于那些从事较小项目的人,请考虑删除所有 app-compat 库。为特定版本的 API 制作多个版本的应用程序可能会更好。我已经看到一个 47Kbyte 的应用程序通过添加兼容性库膨胀到 3Mbytes。

    总结:为了节省空间,避免不必要的库,即使是 Google 提供的库(并且包含在大多数模板中!)。

    【讨论】:

      【解决方案5】:

      尝试启用 http://developer.android.com/tools/help/proguard.html ,即使没有混淆。它将从您的依赖项中删除未使用的 Java 代码。 查看您是否有不需要的依赖项 - 您已添加但未使用的 JAR 检查您的资源是否有大图像或其他文件。您可能需要更改它们的格式或分辨率,或者如果它们不使用则将其删除。

      【讨论】:

        【解决方案6】:

        在大多数情况下,应用程序的大小与您用于创建应用程序的资源文件(图像和其他内容)成正比。请务必考虑以下事项。

        • 尽量使用最少的图片。(在大多数情况下,不需要在 Ldpi 文件夹中添加图片)。
        • 使用矢量图像而不是为所有屏幕放置图像 分辨率。一种方法是使用 SVG ,9 补丁
        • 尝试使用 xml drawable 创建通用图像,例如 方形、矩形、圆形、边框等,而不是 .png 图像 尝试一些图像压缩技术。
        • 尝试从 Api 获取大图像,而不是将其放入 res 文件夹。(仅在需要时下载)。

        库导入

        • 在为 appstore 创建构建时尝试删除不需要的库。
        • 如果您需要库中的特定功能,请尝试 提取所需的类文件并使用它而不是导入 整个图书馆的罐子。
        • 通过删除未使用的导入来清理你的类(虽然它没有 对尺寸有很大影响,但它会使事情变得更简单和 直)。在 ecipe 中选择 src 文件夹->右键->源->组织导入

        【讨论】:

          【解决方案7】:

          通常,在 ProGuard 中,您可以使用以下方法来缩小 APK(这在您模块的 build.gradle 文件中):

          ...
          
          android {
          
              ...
          
              buildTypes {
                  release {
                      minifyEnabled true
                      shrinkResources true
                      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                  }
              }
          
              ...
          
           }
           ...
          

          具体看minifyEnabled trueshrinkResources true

          minifyEnabled 负责混淆和压缩您的代码文件(例如 Java)。它是 ProGuard 的主要功能,有助于缩小 APK 并使其难以进行逆向工程。

          shrinkResources 用于删除未使用的资源文件(例如图像和其他资产)。例如,如果您正在使用 Android 库进行编译,但您没有使用该 Android 库中的某些图像,则它们不会包含在最终构建中。有一个很好的 Android 开发者视频here

          【讨论】:

            【解决方案8】:

            现在您还可以在您的应用中使用矢量可绘制对象来移除针对不同屏幕尺寸的多个可绘制对象并减小 APK 大小。 见:https://stackoverflow.com/a/33984100/5305331

            【讨论】:

              【解决方案9】:

              压缩所有 PNG 文件是一种选择,您可以转到 https://tinypng.com/

              之后删除不必要的库导入,例如,如果您已经为 appcompat 导入了 v7,则不需要导入支持库 v4。

              最后,在完成 apk 的签名过程后,使用 android-sdk 附带的 zipalign 工具了解更多详细信息,请参阅http://developer.android.com/tools/help/zipalign.html

              这就是我所知道的。

              【讨论】:

                【解决方案10】:

                您可以尝试其他答案,它们非常好,但是还有另一个减少大量 apk 大小的小技巧。
                我们在项目中使用了许多库。其中一些是用母语 (c) 开发的,还有一些是为特定版本的架构开发的。

                我们有一些架构:

                • armeabi : Uncommon
                • armeabi-v7a:Common
                • arm64-v8a:Common
                • mips : Rare
                • mips64:Rare
                • x86:Common
                • x86_64:Uncommon

                您可以过滤目标架构并删除无用的选项。例如:

                buildTypes {
                    debug {
                        ...
                    }
                    release {
                        ...
                        ndk {
                            abiFilters "arm64-v8a", "armeabi-v7a", "x86"
                        }
                    }
                }
                

                【讨论】:

                  【解决方案11】:

                  首先查看你的drawables。

                  1. 如果您使用 PSD 来获取应用程序的图像,这些图像可能不会针对 Web 和设备进行优化。您使用 Photoshop“保存为 Web 和设备”来优化图像。您可以从中减少很多 kb。
                  2. 接下来,看看您是否可以用 XML 可绘制对象替换图像。例如,按钮和背景可以使用 XML 完成

                  【讨论】:

                    【解决方案12】:

                    ProGuard 默认应用它的收缩、优化和混淆——这是它的主要目的。您必须在您的 Android 版本中启用它,方法是编辑您的 project.properties 中记录的 ProGuard 行。它为使用 Ant 和 Eclipse 的发布构建启用 ProGuard(优化或不优化)。使用 Ant,您将在构建日志中看到 ProGuard 输出。

                    请参阅 Android 文档 > 工具 > ProGuard

                    然后您应该检查已处理的申请。您可能需要额外的 -keep 选项,例如可能用于 Google Play 服务。您可以保留的越少,您的应用程序就越小。

                    【讨论】:

                      【解决方案13】:

                      您看到文件大小增加的原因是 APK 是压缩文件。使用 Proguard 会有所帮助 - 这是一个很好的资源:

                      http://developer.sonymobile.com/2012/01/31/tips-for-reducing-apk-file-size/

                      但是,我可以向您保证,您可以获得数百万次下载,而不会对文件大小敏感。既来自我的个人经验,也来自查看 Google Play。有数以百万计的下载量超过 2MB 的应用程序。事实上,有很多是 20MB 左右。换句话说,尽你所能保持它的小,但不要担心它会影响使用或下载。

                      【讨论】:

                        【解决方案14】:

                        我可以从经验中指出两点。

                        如果您使用 eclipse 创建 apk 文件,那么资源会被复制(至少在我的情况下发生过),您可以尝试使用 ant 和 build.xml 创建 apk 并比较大小。 还要研究资源的别名。

                        【讨论】:

                          【解决方案15】:

                          将 APK/ZIP 重新压缩到最高,它会比 Android SDK 构建的普通 apk 节省 30%,如果大量文本文件很有用,但如果大量图像则无效。

                          【讨论】:

                          • 我该怎么做?我尝试将 apk 重命名为 zip,然后解压缩到一个文件夹中,然后将该文件夹压缩回 zip 并将 zip 重命名为 apk,但它无法在 android 设备上安装
                          【解决方案16】:

                          查看我的博客Different ways to reduce apk size

                          要点是:

                          • android.enableR8=true // 启用新的 R8 代码收缩器
                          • minifyEnabled true && 添加 Proguard 规则
                          • 使用 Android Studio 的 APK Analyzer 检查您的 APK
                          • 启用资源缩减
                          • 将您的 PNG、JPEG 和 BMP 转换为 WebP
                          • 避免枚举并使用@IntDef 注释
                          • 使用 aaptOptions { cruncherEnabled = false } 压缩图片
                          • 使用Remove Unused Resources android studio 内置函数来移除应用中所有未使用的资源
                          • 使用Code Cleanup android studio 内置函数来删除

                          注意:去启用它! (*只是双重和三重检查之后一切正常)

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2023-04-04
                            • 1970-01-01
                            • 2021-09-22
                            • 1970-01-01
                            相关资源
                            最近更新 更多