我现在将在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.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
中添加哪些行,以便它可以删除未使用的引用,类等,以减少apk大小?
使用https://code.google.com/p/android-unused-resources/处提供的AndroidUnusedResources.jar在android项目中查找未使用的资源。
我认为这与proguard已经完成的一样吗?或者是否应该在启用proguard后使用?
此外,您可以在答案中提及您认为应该分享的任何遗漏。
提前致谢...
答案 0 :(得分:42)
几乎完全是因为您的res文件夹图像!您应该在drawable-mdpi,-hdpi,xhdpi文件夹中拥有大约4个每个图像的副本。唯一的区别是theu都是不同的大小。
可能没有那些jar文件的多个副本!只有一个副本链接到它!
是的,你说的是关于Proguard的。但是,要意识到你在这里谈论文本文件。他们真的很小。我的意思是真的很小(千字节)。您的问题是兆字节(MB)大小的问题。那是图片!!!!
<强>重复。那是图像!!!!
启用proguard会节省一点尺寸。
是的,在您的情况下,这些都更重要。请阅读并应用这些。祝你好运!
如果用户发现您的应用有用,那么他们就不会将其卸载;但是,你可以做几件事
async
这些图片移至您的应用中吗? 允许用户将数据移至SD卡。
[编辑]应用在Play商店暂时后,检查开发者控制台,查看最少使用的屏幕尺寸/密度。 从您的应用中删除该可绘制文件夹!这可能会减少大小的数量!但是,请查看下面的编辑,了解这种方法的缺点!!
您可能想要展示一些图片,因为这样可以让我们看到您正在处理的内容
@Ashwin N Bhanushali对于我没有回答的部分问题有一个很好的答案here,但他基本上告诉你,除了我所说的,加上一个想法或2,你没有什么可以做的。更多。
我确实有另一个想法是基于他的一个更好的想法,因为Android Studio不再包含项目中的drawable-ldpi文件夹了。因此,只有使用Eclipse,我的扩展
才有用这是有效的,因为图片比文本文件 占用更多字节。所有这些drawable都有相同的图像(只是不同的尺寸)。 从较少使用的存储桶中删除图像可以节省大量空间!!
请注意,从您的应用中移除这些存储桶意味着您的应用必须在使用已删除存储桶的手机上执行更多操作。 这些用户的应用可能会慢一些;但是,应用程序的大小可以减少更多。
文本文件几乎不占用任何内容。查看项目的文件系统!
在下图中。检查......的大小。
在您的情况下,您会看到java文件夹的大小可能非常小( 10到几百KB );但是,您会看到res文件夹的大小非常大(几个MB!)。
这意味着任何压缩或代码库 的减少非常小而且不值得!!
因此,降低APK尺寸的最佳方法是按照我上面的说明操作!
以下是您可以立即执行的测试,并且可以看到 Proguard 和 AndroidUnusedResources.jar 等工具的绝对最大值(加上更多)将减小APK文件!
您需要做的是从项目中删除所有代码,但类声明除外。对抽象类,接口,枚举等执行相同的操作......您的项目结构应该保持不变,那么您根本不应该使用任何外部库。
所以你们所有的课程都会有这样的东西......
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!
}
现在编译并构建您的项目。
将新APK尺寸检查为当前的APK。
在手机上安装应用,并根据当前的应用尺寸检查新的应用尺寸
如果您注意到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
答案 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 true
和shrinkResources true
:
minifyEnabled
负责混淆和缩小代码文件(例如Java)。这是ProGuard的主要功能,有助于缩小APK并使其难以进行逆向工程。
shrinkResources
用于删除未使用的资源文件(例如图片和其他资源)。例如,如果您正在使用Android库进行编译,但是您没有在该Android库中使用某些图像,则它们将不会包含在最终版本中。有一个很好的Android开发者视频here。
答案 7 :(得分:1)
现在,您还可以在应用中使用矢量绘图来移除不同屏幕尺寸的多个drawable并减少APK大小。 见:https://stackoverflow.com/a/33984100/5305331
答案 8 :(得分:0)
首先查看你的drawables。
答案 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)
在大多数情况下,应用程序大小与用于创建应用程序的资源文件(图像和其他内容)成比例。总是考虑以下内容。
图书馆导入
答案 12 :(得分:0)
我可以从经验中指出两件事。
如果你使用eclipse创建apk文件,那么资源是重复的(至少它发生在我的情况下),你可以尝试使用ant和build.xml来创建apk并比较大小。 另请查看资源别名。
答案 13 :(得分:0)
将APK / ZIP重新压缩为高,它将比Android SDK正常的apk版本节省30%,如果有大量文本文件则有用,但如果大量图片则无效。
答案 14 :(得分:0)
你可以尝试另外的答案并且它们非常好但是还有另一个减少大量apk尺寸的小技巧 我们在项目中使用了很多库。其中一些是用母语(c)开发的,其中一些是为特定版本的架构开发的。
我们有一些架构:
Uncommon
Common
Common
Rare
Rare
Common
Uncommon
您可以过滤目标体系结构并删除无用的选项。例如:
buildTypes {
debug {
...
}
release {
...
ndk {
abiFilters "arm64-v8a", "armeabi-v7a", "x86"
}
}
}
答案 15 :(得分:0)
查看我的博客Different ways to reduce apk size
要点是:
注意:启用它! (*请仔细检查两次,然后再检查一切正常)