如何优化(减少)我的android应用程序的大小

如何优化(减少)我的android应用程序的大小,android,apk,Android,Apk,我创建了一个android应用程序,其中只包含2个Web视图,其中包含一些java脚本,一个内置的PDF阅读器API,重约2MB,所有PDF(压缩)约25MB,以及其他图像(也压缩)etc小于1MB,约为30MB。因此,生成应用程序后,我的应用程序大小约为55MB。我认为这是不可接受的。 那么,为什么我的应用程序有这么大的尺寸,以及我如何能更大程度地减小我的android应用程序的尺寸。使用Proguard。从build.gradle文件中,像这样启用Proguard buildTypes

我创建了一个android应用程序,其中只包含2个Web视图,其中包含一些java脚本,一个内置的PDF阅读器API,重约2MB,所有PDF(压缩)约25MB,以及其他图像(也压缩)etc小于1MB,约为30MB。因此,生成应用程序后,我的应用程序大小约为55MB。我认为这是不可接受的。
那么,为什么我的应用程序有这么大的尺寸,以及我如何能更大程度地减小我的android应用程序的尺寸。

使用Proguard。从build.gradle文件中,像这样启用Proguard

  buildTypes {

        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
然后打开你的“proguard rules.pro”并提及所有规则。如果不使用任何外部库,请将其粘贴到“proguard rules.pro”文件中。

发现“lib”是15MB,大约是我应用程序大小的35%,这是不可接受的,因为我只使用了2MB的单个ext库

您计算错了该库的大小及其依赖项。假设您自己没有使用NDK,那么该库正在使用NDK,或者其依赖项正在使用该库。该库的大小与的大致匹配,尽管我不知道这是否是您正在使用的特定库

该PDF查看库的文档包括:

Android PdfViewer依赖于PdfiumAndroid,这是一组用于许多体系结构的本机库(大约16MB)。Apk必须包含所有这些库,才能在市场上可用的每个设备上运行。幸运的是,Google Play允许我们上传多个APK,例如,每个架构一个APK。有一篇关于自动将应用程序拆分为多个APK的好文章。最重要的部分是通过APK拆分改进多APK创建和版本代码处理,但整篇文章值得一读。您只需要在应用程序中执行此操作,不需要分叉PdfiumAndroid之类的东西

你的选择是:

  • 按照文档中的建议,使用ABI拆分来为每个CPU体系结构提供单独的APK(这仅在您通过支持每个体系结构的单独APK的某种方式(如Play Store)进行分发时才有帮助)

  • 使用

  • 依靠
    ACTION\u VIEW
    和用户选择的PDF查看器,从应用程序中删除PDF呈现功能

  • 从应用程序中删除PDF,将其转换为HTML/CSS/图像并在
    WebView中呈现


“为什么我的应用程序有这么大的尺寸”——很可能是依赖关系。使用Android Studio中的APK分析器(构建>分析APK…)来找出您的空间的去向。“我怎样才能更大程度地缩小android应用程序的大小”——首先找出你的空间在哪里。然后,也只有那时,才担心如何使它变小。@commonware谢谢你的评论,我做了一个APK分析,发现“lib”是15 MB,大约是我应用程序大小的35%,这是不可接受的,因为我只使用了一个2 MB的ext库。其余的文件夹都可以。现在我如何解决这个问题?有什么建议吗???@commonware这是我在APK Analyzer中得到的确切信息-
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-allowaccessmodification
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-keepattributes EnclosingMethod

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keep public class com.google.android.gms.ads.** {
   public *;
}

-keep public class com.google.ads.** {
   public *;
}
# For OkHttp3
-keepattributes Signature
-keepattributes Annotation
-keep class okhttp3.** { *; }
-keep interface okhttp3.* { *; }
-dontwarn okhttp3.*