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

Java 减少android应用程序(apk)的大小,java,android,jar,apk,proguard,Java,Android,Jar,Apk,Proguard,我现在将在Google play store上发布我的第一个应用程序。我已经压缩了应用程序中使用的图像。我有一些关于应用程序大小的问题 如果应用程序的大小小于2MB,则用户卸载应用程序的可能性较小,我的这一说法是否适用于属于教育领域的应用程序? 然而,当我在windows中看到我的apk文件时,它显示为3.10 MB,但当它安装在设备中时(从应用程序信息查看),它显示: Total............................8.68 MB App...................

我现在将在Google play store上发布我的第一个应用程序。我已经压缩了应用程序中使用的图像。我有一些关于应用程序大小的问题

如果应用程序的大小小于2MB,则用户卸载应用程序的可能性较小,我的这一说法是否适用于属于教育领域的应用程序?

然而,当我在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私有库中
,但这些库的副本也位于该文件夹之外

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

我还访问了许多描述
Proguard
功能的网页,我真正了解了Proguard是如何减少apk的大小的,它通过删除未使用的代码和使用语义模糊的名称重命名类、字段和方法来缩小、优化和模糊我们的代码。结果是一个较小的.apk文件,更难进行反向工程。但是我不知道我的
proguard project.txt
应该是什么样子?
我在我的应用程序中使用了4个库,即
easyFaceBookandroiddk_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大小?

使用AndroidUnusedResources.jar可以在android项目中查找未使用的资源

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

你也可以在你的回答中提到任何你认为应该分享的遗漏
提前感谢…

那么,为什么我看到我的应用程序大小增加了这么多,可以最小化吗? 几乎完全是因为你的res文件夹图像!在drawable mdpi、-hdpi、xhdpi文件夹中,每个图像应该有大约4个副本。唯一的区别是U的尺寸都不一样

删除它们是否更安全&删除它们有助于减少apk大小? 这些jar文件可能没有多个副本!只需一份带有链接的副本

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

重复。这就是图像

启用proguard将节省一点空间

你也可以在回答中提到你认为应该分享的任何遗漏? 是的,对你来说,这些都更重要。请阅读并应用这些。祝你好运

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

  • 您能否将图像移动到web上
    异步
    将其移动到您的应用程序中
  • 确保您的文件尽可能被完全压缩。使用或
  • 检查图像中是否有重复的。您可能可以使用9-patch进行此操作
  • 您可以为某些图像制作自己的绘图工具
  • 允许用户将数据移动到SD卡

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

  • [编辑2]在Windows资源管理器中,检查整个res文件夹的文件夹大小,以及整个java文件夹的。如果您的java文件夹的大小很小,那么您减少APK大小的所有努力都应该是我上面所说的
您可能需要显示一些图像,因为这样我们可以看到您正在处理的内容

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

我确实有了另一个想法,这个想法是基于他的一个想法,甚至更好,因为Android Studio不再在项目中包含可绘制的ldpi文件夹。因此,只有当您使用Eclipse时,它才会有帮助

  • 在完成建议的修复后,将APK发布到Google Play Store
  • 经过一段时间后——一周、一个月等——您可以中检查应用程序的统计数据
  • 查找使用最少的屏幕大小存储桶(可绘制mdpi,-hdpi,-xhdpi,-xxhdpi)你可以从你的应用程序中删除这些桶 这是因为图片比文本文件占用的字节要多。所有这些抽屉都有相同的图像(只是大小不同)从较少使用的存储桶中删除图像可以节省大量空间

    请注意,从应用程序中删除这些存储桶将意味着您的应用程序必须在使用已删除存储桶的手机上执行更多操作。美联社
    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!
    
    }
    
    ...
    
    android {
    
        ...
    
        buildTypes {
            release {
                minifyEnabled true
                shrinkResources true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    
        ...
    
     }
     ...
    
    buildTypes {
        debug {
            ...
        }
        release {
            ...
            ndk {
                abiFilters "arm64-v8a", "armeabi-v7a", "x86"
            }
        }
    }