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

时间:2017-01-14 17:54:52

标签: android apk

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

2 个答案:

答案 0 :(得分:3)

  

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

您错误地列出了该库及其依赖项的大小。假设您自己没有使用NDK,那么该库正在使用NDK,或者它的依赖项正在使用该库。该库大小大致与this PDF viewer的库大小匹配,但我不知道这是否是您正在使用的特定库大小。

该PDF查看库的文档有a section on why the library makes your APK big

  

Android PdfViewer依赖于PdfiumAndroid,它是许多架构的本机库集(大约16 MB)。 Apk必须包含所有这些库,以便在市场上的每个设备上运行。幸运的是,Google Play允许我们上传多个API,例如每个架构一个。有一篇关于自动将您的应用程序拆分为多个apks的文章,可用here。最重要的部分是使用APK Splits改进多个APK创建和版本代码处理,但整篇文章值得一读。您只需在您的应用程序中执行此操作,无需分支PdfiumAndroid等。

您的选择是:

  • 按照文档中的建议进行操作,并使用ABI拆分为每个CPU架构设置单独的APK(只有在通过某种方式分发每个架构支持单独的APK时才有用,例如Play商店)

  • 使用some other PDF rendering option

  • 依赖ACTION_VIEW和用户选择的PDF查看器

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

  • 中呈现它们

答案 1 :(得分:1)

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

  buildTypes {

        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

然后打开你的“proguard-rules.pro”并提及所有规则。如果您没有使用任何外部库,请将其粘贴到“proguard-rules.pro”文件中。

-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 *;
}

如果您使用Okhhtp进行网络服务,那么也可以在您的proguard-rules.pro中使用它

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