减少Android应用程序(apk)的大小

时间:2014-08-03 04:06:15

标签: java android jar apk proguard

我现在将在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

那么,为什么我看到我的应用规模大幅增加,是否可以最小化?

而且,我在我的项目中使用了Android Private Libraries中的4个库(jars),但是这些库也在这个文件夹之外复制了它们。

删除它们更安全,&删除它们有助于减少apk尺寸?

此外,我访问过许多描述Proguard内容的网页,我真正理解Proguard如何减小apk的大小,它通过删除未使用的代码并重命名类,字段和方法来缩小,优化和混淆代码语义晦涩的名字。结果是较小的.apk文件,更难以进行逆向工程。但我不知道我的proguard-project.txt应该怎么样? 我在我的应用中使用了4个库easyfacebookandroidsdk_2.3.jarandroid-support-v7-appcompat.jargoogle-play-services.jar& android-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后使用?

此外,您可以在答案中提及您认为应该分享的任何遗漏。
提前致谢...

16 个答案:

答案 0 :(得分:42)

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

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

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

可能没有那些jar文件的多个副本!只有一个副本链接到它!

Proguard的

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

<强>重复。那是图像!!!!

启用proguard会节省一点尺寸。

您还可以在答案中提及您认为应该分享的任何遗漏内容吗?

是的,在您的情况下,这些都更重要。请阅读并应用这些。祝你好运!

如果用户发现您的应用有用,那么他们就不会将其卸载;但是,你可以做几件事

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

  • [编辑]应用在Play商店暂时后,检查开发者控制台,查看最少使用的屏幕尺寸/密度。 从您的应用中删除该可绘制文件夹!这可能会减少大小的数量!但是,请查看下面的编辑,了解这种方法的缺点!!

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

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

修改

@Ashwin N Bhanushali对于我没有回答的部分问题有一个很好的答案here,但他基本上告诉你,除了我所说的,加上一个想法或2,你没有什么可以做的。更多。

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

才有用
  1. 在进行推荐修复
  2. 后,将APK发布到Google Play商店
  3. 经过一段时间后 - 一周,一个月等 - 您可以查看{{3}中应用检查统计数据 } 即可。
  4. 寻找使用最少的屏幕尺寸 drawable-mdpi,-hdpi,-xhdpi,-xxhdpi 您可以完全从应用中删除这些存储桶
  5. 这是有效的,因为图片比文本文件 占用更多字节。所有这些drawable都有相同的图像只是不同的尺寸)。 从较少使用的存储桶中删除图像可以节省大量空间!!

    请注意,从您的应用中移除这些存储桶意味着您的应用必须在使用已删除存储桶的手机上执行更多操作。 这些用户的应用可能会慢一些;但是,应用程序的大小可以减少更多。

    编辑2

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

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

    • java 文件夹
    • res 文件夹

    enter image description here

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

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

    因此,降低APK尺寸的最佳方法是按照我上面的说明操作!

    编辑3

    以下是您可以立即执行的测试,并且可以看到 Proguard AndroidUnusedResources.jar 等工具的绝对最大值(加上更多)将减小APK文件!

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

    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. 在手机上安装应用,并根据当前的应用尺寸检查新的应用尺寸

      • 这将是您可以使用代码实现的最小的未压缩大小文件。是的,你的程序什么都不做,这只是一个测试。
    6. 如果您注意到2个应用程序仍然大小相同,那么在Proguard和AndroidUnusedResources.jar上花费所有时间在此阶段毫无意义。这是一项测试,可以确定您将个人资源用于减少应用规模的位置。

答案 1 :(得分:3)

那么,为什么我看到我的应用规模大幅增加,是否可以最小化?

.apk文件

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

现在这个apk文件在安装过程中被解压缩,因此应用程序的大小有所增加。

有关编译的更多细节

.java文件会怎样?

嗯,首先它们通常由已安装的JDK实现编译。在编译它们(到.class文件)之后,Android SDK中的dx工具会交叉编译那些&#34; normal&#34; java-classes到Dalvik-Bytecode。

这&#34;特别&#34;然后由DVM(Dalvik虚拟机)解释java-code,它基于开源JRE实现Apache Harmony。

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

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

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

我放入/ res / raw-directory的资源会怎么样?

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

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

Android-Manifest以及其他XML文件(布局,字符串等)被存储并且&#34;编译&#34;成二进制XML格式。这是速度优化。

所以你得到了安装后应用程序大小增加的答案。

现在 删除它们更安全(Android库),&amp;删除它们有助于减少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.

我认为这足以减少您的应用规模。

答案 2 :(得分:3)

以下是减少应用程序大小的方法。详细信息请参见以下链接。

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

  • Proguard
  • vector drawables
  • Apk分裂
  • 优化png图像
  • 删除未使用的资源
  • 9-patch images
  • 压缩Jpeg图像
  • 删除调试信息
  • 避免重复
  • 广泛使用lint
  • 尽可能重用资源
  • 推荐的媒体格式

答案 3 :(得分:2)

对于那些做大得多的小项目的人,请考虑删除所有app-compat库。您可能最好为特定版本的API制作应用程序的多个版本。我刚刚通过添加兼容性库看到了一个47Kbyte应用程序气球到3Mbytes。

摘要:为了节省空间,避免使用不必要的库,甚至包括Google提供的库(并包含在大多数模板中!)。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您可以选择压缩所有PNG,然后转到https://tinypng.com/

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

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

这就是我所知道的。

答案 6 :(得分:1)

通常,在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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

首先查看你的drawables。

  1. 如果您使用PSD获取应用的图片,则这些图片可能不会针对网络和设备进行优化。 You Photoshops&#34; Save for Web and Devices&#34;优化图像。你可以从中减少很多kbs。
  2. 接下来,看看是否可以用XML drawable替换图像。例如,按钮和背景可以使用XML
  3. 完成

答案 9 :(得分:0)

默认情况下,ProGuard应用其缩小,优化和混淆 - 这是其主要目的。您必须通过编辑project.properties中记录的ProGuard行,在Android版本中启用它。它使用Ant和Eclipse实现ProGuard(有或没有优化)的发布版本。使用Ant,您将在构建日志中看到ProGuard输出。

请参阅Android文档&gt;工具&gt; ProGuard

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

在大多数情况下,应用程序大小与用于创建应用程序的资源文件(图像和其他内容)成比例。总是考虑以下内容。

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

图书馆导入

  • 在为appstore创建构建时尝试删除不需要的库。
  • 如果您需要某个图书馆的特定功能,请尝试 提取所需的类文件并使用它而不是导入 整个库罐。
  • 通过删除未使用的导入来清理您的课程(尽管它不会有 对尺寸有很大影响,但它会使事情变得更简单 直接)。在eclipe中选择src folder-&gt; rightclick-&gt; source-&gt; organiz imports

答案 12 :(得分:0)

我可以从经验中指出两件事。

如果你使用eclipse创建apk文件,那么资源是重复的(至少它发生在我的情况下),你可以尝试使用ant和build.xml来创建apk并比较大小。 另请查看资源别名。

答案 13 :(得分:0)

将APK / ZIP重新压缩为高,它将比Android SDK正常的apk版本节省30%,如果有大量文本文件则有用,但如果大量图片则无效。

答案 14 :(得分:0)

你可以尝试另外的答案并且它们非常好但是还有另一个减少大量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"
        }
    }
}

答案 15 :(得分:0)

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

要点是:

  • android.enableR8 = true //启用新的R8代码收缩器
  • minifyEnabled true &&添加Proguard规则
  • 使用Android Studio的APK分析器检查您的APK
  • 启用资源缩减
  • 将您的PNG,JPEG和BMP转换为WebP
  • 避免枚举,并使用@IntDef批注
  • 使用aaptOptions {cruncherEnabled = false} 压缩图像
  • 使用“删除未使用的资源” android studio内置功能来删除应用程序中所有未使用的资源
  • 使用代码清理android studio内置功能删除
  

注意:启用它! (*请仔细检查两次,然后再检查一切正常)