减lessAndroid应用程序(apk)的大小
我现在正在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.jar
, android-support-v7-appcompat.jar
, google-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
添加什么行,以便它可以删除未使用的引用,类等,以便减lessapk大小?
使用https://code.google.com/p/android-unused-resources/上提供的AndroidUnusedResources.jar可以在android项目中find未使用的资源。
我认为这是proguard已经完成的同样的事情? 还是应该在启用proguard之后使用?
你也可以在你的回答中提及你觉得应该分享的东西。
提前致谢…
那么,为什么我看到我的应用程序大小增加了很多,可以最小化?
几乎完全是因为你的res文件夹的图像! 您应该在drawable-mdpi,-hdpi,xhdpi文件夹中有大约4个副本。 唯一的区别是theu是所有不同的大小。
删除它们会更安全吗?删除它们可以帮助减小apk大小?
机会是没有这些jar文件的多个副本! 只是一个链接到它的副本!
Proguard的
是的,你所说的对Proguard来说是正确的。 但是,意识到你在这里正在讨论文本文件。 他们真的很小。 我的意思是非常小(千字节)。 您的问题是兆字节(MB)大小的东西。 这是图像!
重复。 这是图像!
启用proguard会节省一点点大小。
你也可以在你的答案中提到你觉得应该分享的东西吗?
是的,这些在你的情况下更重要。 请阅读并应用这些。 祝你好运!
如果用户发现您的应用程序有帮助,那么他们将不会卸载它; 不过, 你可以做几件事情
- 你可以移动图像到网上 ,并将它们
async
到你的应用程序? - 确保您的文件尽可能完全压缩 。 使用pngquant或tinypng 。
- 检查图像中是否有重复 。 您可能可以使用9修补程序 。
- 您可能可以为特定图像制作自己的绘图 。
-
允许用户将数据移动到SD卡 。
-
[编辑]在应用程序已经在Play商店一段时间后 , 检查开发者控制台,看看哪个屏幕大小/密度使用最less。 从您的应用程序中删除该可绘制文件夹! 这可能会减less大小! 但是,请检查我的编辑下面这个方法的缺点!
- [编辑2] 在Windows资源pipe理器中 ,检查整个res文件夹和整个java文件夹的文件夹大小 。 如果你的java文件夹的大小很小,那么你所有的减小APK大小的应该是我上面所说的。
您可能想要展示一些图片,因为这样可以让我们看到您正在处理的内容
编辑
@Ashwin N Bhanushali 在这里对于我没有回答的部分问题有一个很好的答案,但是他基本上告诉过你,除了我所说的话之外,没有什么可以做的,再加上一个想法或者2个。
我确实有一个想法是基于他的想法之一 ,因为Android Studio不再在项目中包含drawable-ldpi文件夹。 所以如果你使用Eclipse,我的扩展只会有帮助
- 进行build议的修复后,将APK发布到Google Play商店
- 经过一段时间 – 一周,一个月等 – 您可以在Google Play Developer Console中 查看您的应用程序的统计数据 。
- 寻找 使用最less 的屏幕尺寸桶 ( drawable-mdpi,-hdpi,-xhdpi,-xxhdpi ) ! 你可以从你的应用程序中删除这些桶完全!
这是有效的,因为图片比文本文件占用更多的字节 。 所有这些可绘制的graphics都有相同的图像 ( 只是大小不同 )。 从较less使用的桶中删除图像可以节省大量的空间!
请注意,从您的应用程序中删除这些存储桶意味着您的应用程序将不得不在使用删除的存储桶的电话上做更多的工作 。 这些用户的应用可能会比较慢 ; 但是,应用程序的大小可以减less更多。
编辑2
文本文件几乎不占用任何东西。 看看你的项目的文件系统!
在下面的图片。 检查大小…
- java文件夹
- res文件夹
在你的情况下,你会看到java文件夹的大小可能非常小 (从10到几百KB )。 然而,你会看到res文件夹的大小真的很大 ( 几MB )。
这意味着, 任何压缩,或减less你的代码库将是非常小,不值得!
因此,缩小APK大小的最佳方法是遵循上面的说明!
编辑3
这里是一个testing,你可以马上做,看到像Proguard和AndroidUnusedResources.jar这样的工具的绝对最大(加上更多)将减小APK文件的大小!
你必须做的是从你的项目中除了类声明除去所有的代码。 为Abstract类,Interfaces,Enums等做同样的事情…你的项目结构应该保持不变,而且你根本不应该使用任何外部库。
-
所以,你们所有的class级都会有这样的事情…
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 }
-
你应该删除类,接口,枚举等内部的所有代码,如下所示: 然而,离开你的所有图像! …
public CustomClass { // Everything is removed!! No libraries used, nothing. Unless certain classes // require some methods like Activity. Those methods should be empty though! }
-
现在编译并build立你的项目。
-
检查新的APK大小到您当前的APK。
- 这将是您可以使用代码实现的最小可能的压缩大小文件。 是的,你的程序不会做任何事情,但这是重点。 你在乎这里的大小,这只是一个testing。
-
在您的手机上安装应用程序,并检查新的应用程序大小,以您当前的应用程序大小
- 这将是您的代码可以实现的最小可能的解压缩大小文件。 是的,你的程序不会做任何事情,这只是一个testing。
如果您注意到这两个应用程序的大小仍然相同,那么在这个阶段花时间使用Proguard和AndroidUnusedResources.jar是毫无意义的。 这是一个testing,看看你会花在你的个人资源在应用程序的大小减less。
那么,为什么我看到我的应用程序大小增加了很多,可以最小化?
.apk文件
.apk文件根本不是神奇的。 这只是一组代表Android应用程序内容的文件。 如果您在档案工具(如7Zip)中打开它,您可以浏览并提取它的内容。
现在这个apk文件是在安装过程中提取的,因此增加了应用程序的大小。
有关编译的更多细节
.java文件会发生什么?
那么,首先他们通常是由安装的JDK实现编译的。 在将它们编译为.class文件之后,Android SDK中的dx工具将这些“正常”的java类交叉编译为Dalvik-Bytecode。
这个“特殊”的java代码然后由DVM(Dalvik虚拟机)解释,这个基于开源的JRE实现的Apache Harmony。
我放入/ asset-directory的资源会发生什么变化?
Android提供/ assets-directory来添加一些二进制原始文件(例如SQLite数据库)。 放入此目录的文件不会被编译或优化。
如果你把你的文件放到这个目录下,这就是你对Android的期望。
我放入/ res / raw-directory的资源会发生什么变化?
像/ assets-directory一样,你也可以在这里放置二进制(或其他)原始文件(例如帮助页面的HTML文件)。 这些文件被编译/优化(如果可能的话)。
Manifest和其他XML文件会发生什么变化?
Android-Manifest和其他XML文件(布局,string等)被存储并“编译”成二进制XML格式。 这是一个速度优化。
所以你得到了答案为什么安装后应用程序的大小增加。
现在是删除它们(Android库)更安全,删除它们可以帮助减lessapk的大小?
你可以删除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(ie .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.
我认为这足以减less应用程序的大小。
以下是减less应用程序大小的方法。 详细解释在下面的链接。
https://medium.com/@fahimsakri/put-your-apks-on-diet-cc3f40843c84#.m860q8s1u
- Proguard的
- vector绘制
- APK分裂
- 优化PNG图像
- 删除未使用的资源
- 9个补丁的图像
- 压缩Jpeg图像
- 删除debugging信息
- 避免重复
- 广泛使用棉绒
- 尽可能重用资源
- 推荐的媒体格式
对于那些你做的小项目,考虑删除所有的应用程序库。 您可能更适合为特定版本的API制作多个版本的应用。 我已经看到一个47K字节的应用程序气球,只需添加兼容性库,即可达到3M字节。
总结 :为了节省空间,避免不必要的库,甚至是Google提供的库(包括在大多数模板中)。
尝试启用http://developer.android.com/tools/help/proguard.html ,即使没有混淆。 它将从您的依赖中删除未使用的Java代码。 查看是否有不需要的依赖关系 – 已添加但未使用的JAR检查您的资源是否存在大图像或其他文件。 您可能想要更改其格式或分辨率,或者如果它们未被使用,请将其删除。
通常,在ProGuard中,您可以使用以下缩小您的APK(这是在您的模块的build.gradle
文件中):
... android { ... buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } ... } ...
具体来看, minifyEnabled true
和shrinkResources true
:
minifyEnabled
负责混淆和缩小代码文件(例如Java)。 这是ProGuard的主要function,并有助于缩小您的APK,并使其难以逆向工程。
shrinkResources
用于删除未使用的资源文件(如图像和其他资源)。 例如,如果您正在使用Android库进行编译,但是您没有在该Android库中使用某些图像,则不会将其包含在最终版本中。 这里有一个很好的Android开发者video。
现在,您还可以在应用程序中使用vector绘制工具来删除不同屏幕尺寸的多个可绘制对象,并减小APK的大小。 请参阅: https : //stackoverflow.com/a/33984100/5305331
这是一个选项,你压缩所有的PNG,你可以去https://tinypng.com/ 。
之后,删除不必要的库导入,例如,如果您已经导入v7 for appcompat,则不需要导入支持库v4。
最后,在使用android-sdk附带的apk使用zipalign工具签名程序完成后,请参阅http://developer.android.com/tools/help/zipalign.html 。
这是我所知道的一切。
首先看你的drawables。
- 如果您使用PSD来获取应用程序的图像,那么这些图像可能不会针对网页和设备进行优化。 你Photoshops“保存为Web和设备”来优化图像。 你可以从这个减less很多kbs。
- 接下来,看看你是否可以用XML drawablereplace图像。 例如,button和背景可以使用XML来完成
默认情况下,ProGuard应用其缩小,优化和混淆 – 这是它的主要目的。 您必须在您的Android版本中启用它,方法是编辑您的project.properties
logging的ProGuard行。 它使ProGuard(有或没有优化)可以通过Ant和Eclipse进行发布。 使用Ant,您将在构build日志中看到ProGuard输出。
请参阅Android文档>工具> ProGuard 。
然后你应该检查你处理的应用程序。 您可能需要额外的维护选项,例如可能用于Google Play服务。 你可以保留越less,你的应用程序就越小。
你看到增加的文件大小的原因是APK是压缩文件。 使用Proguard可以帮助 – 这是一个很好的资源:
http://developer.sonymobile.com/2012/01/31/tips-for-reducing-apk-file-size/
不过,我可以向您保证,您可以获得数百万次的下载,而不会受到文件大小的影响。 无论是从我个人的经验,还从看Google Play。 有成千上万的下载数以百万计的应用程序,其中文件大小超过2MB。 实际上,有很多是20MB左右。 换句话说,尽你所能保持它的小,但不要担心,它会影响使用或下载。
在大多数情况下,应用程序大小是与用于创build应用程序的资源文件(图像和其他东西)相称的。总是要考虑以下几点。
- 尝试使用最小的图像(大多数情况下,不需要在Ldpi文件夹中添加图像)。
- 使用vector图像,而不是把所有屏幕分辨率的图像。一种方法是使用SVG,9补丁
- 尝试使用xml drawable创build通用图像,如正方形,矩形圆形,边框等,而不是.png图像尝试一些图像压缩技术。
- 尝试从Api中获取大图像,而不是将其放在res文件夹中(仅在需要时才下载)。
库导入
- 尝试在为appstore创build构build时删除不需要的库。
- 如果你需要一个特定的function库,然后尝试提取所需的类文件,并使用它,而不是导入整个库jar。
- 通过删除未使用的导入来清理你的类(尽pipe它对大小没有太大的影响,但它会使事情变得更加简单和直接)。在eclipe中selectsrc文件夹 – >右键单击 – >源 – >组织导入
我可以从经验中指出两件事。
如果你使用eclipse来创buildapk文件,那么资源是重复的(至less它发生在我的情况),你可以尝试使用ant和build.xml来创buildapk并比较大小。 还要考虑别名资源。
重新压缩APK / ZIP为高,它会比通过Android SDK的普通apk版本节省30%以上,如果大量的文本文件,而不是大量的图像有用。
- 在styles_base.xml文件错误 – android应用程序 – 找不到匹配给定名称的资源'android:Widget.Material.ActionButton'
- 设置从Facebooklogin获取用户电子邮件ID的权限
- 什么是默认的ActionBar标题字体大小?
- 如何使QR码适用于Android Market和App Store
- 更改导航抽屉中菜单项的文本颜色
- Android:如何将ActionBar“Home”图标更改为应用程序图标以外的其他内容?
- 为LinearLayout定义一个百分比宽度?
- 如何在编辑文本之间放置一个水平的因子线
- SimpleCursorTreeAdapter和CursorLoader for ExpandableListView