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