减少安卓应用 (apk) 大小

2022-09-01 03:10:54

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

如果应用程序的大小小于2 MB,那么用户卸载应用程序的机会就更少了,我的这个声明对于属于教育领域的应用程序是否适用?

但是,当我在窗口中看到我的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如何减小apk的大小,它通过删除未使用的代码并重命名具有语义模糊名称的类,字段和方法来缩小,优化和混淆我们的代码。结果是较小的.apk文件,更难以进行逆向工程。但我不知道我应该是什么样子?
我在我的应用程序中使用4个库,即,,和。Proguardproguard-project.txteasyfacebookandroidsdk_2.3.jarandroid-support-v7-appcompat.jargoogle-play-services.jarandroid-support-v4.jar

目前我的看起来像这样,它也不使用WebViewproguard-properties.txt

# 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属性中添加哪些行.txt以便它可以删除未使用的引用,类等,以减少apk大小?

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

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

你也可以在你的答案中提到任何你认为应该分享的缺失。
提前致谢...


答案 1

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

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

删除它们是否更安全,删除它们可以帮助减少apk大小?

这些 jar 文件很可能没有多个副本!只有一个副本,并带有链接!

护卫

是的,你说的关于Proguard是对的。但是,请注意,您正在谈论此处的文本文件。它们真的很小。我的意思是非常小(千字节)。您的问题是兆字节 (MB) 大小。这就是图像!!!!

重复。这就是图像!!!!

启用 proguard 将在大小方面节省一点。

你也可以在你的答案中提到任何你认为应该分享的缺失的东西?

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

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

  • 你能将图像移动到网络上,然后把它们移到你的应用中吗?async
  • 确保您的文件尽可能完全压缩。使用 pngquanttinypng
  • 检查图像中是否有任何重复。您可以为其使用9-patch
  • 您可以为某些图像制作自己的可绘制对象
  • 允许用户将数据移动到 SD 卡

  • [编辑]在 Play 商店中放置一段时间后,请检查开发者控制台,看看哪个屏幕尺寸/密度使用最少。从您的应用中移除该可绘制文件夹!这可以减少大小很多!但是,请检查我下面的编辑,了解此方法的缺点!

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

您可能希望显示一些图像,因为这将使我们能够看到您正在处理的内容

编辑

@Ashwin N Bhanushali对于我没有回答的问题有一个很好的答案,但他基本上告诉你,除了我说的话,你什么也做不了,再加上一个想法或2个。

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

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

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

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

编辑 2

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

在下图中。检查...

  • java 文件夹
  • res 文件夹

enter image description here

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

这意味着任何压缩或减少代码库都将非常小,不值得!

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

编辑 3

这是一个测试,您可以立即进行,并查看ProguardAndroidUnusedResources等工具的绝对最大值(以及更多.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. 在手机上安装应用,并将新应用大小检查为当前应用大小

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

如果您注意到这两个应用程序的大小仍然相同,那么将所有时间都花在Proguard和AndroidUnusedResources上.jar在这个阶段毫无意义。这是一个测试,用于查看在应用大小缩减方面将个人资源用于何处。


答案 2

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

.apk文件

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

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

有关编译的更多详细信息

.java文件会发生什么情况?

好吧,首先它们通常由已安装的JDK实现编译。在编译它们(.class文件)之后,Android SDK中的dx工具然后将这些“正常”java类交叉编译为Dalvik-Bytecode。

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

我放入 /asset-directory 的资源会发生什么情况?

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

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

我放入 /res/raw-directory 中的资源会发生什么变化?

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

清单和其他 XML 文件会发生什么情况?

Android-Manifest和其他XML文件(Layouts,Strings等)被存储并“编译”成二进制XML格式。这是一种速度优化。

因此,您得到了为什么安装后应用程序大小增加的答案。

现在删除它们(Android库)更安全吗,删除它们可以帮助减少apk大小?

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

来到Proguard ::它将删除未使用的java类,并将进行代码混淆。它不会删除未使用的资源,如布局xml,可绘制对象等。因此,我的意见是运行该工具以删除未使用的资源。

以下是一些减小尺寸的提示。

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.

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


推荐