即时应用程序的难度低于 4mb。如何减少apk大小

Gil*_*oot 6 dependencies android android-gradle-plugin android-instant-apps

我在获得低于 4mb 的 apk 时遇到了困难。在检查生成的免安装应用 APK(s) 后,我看到 com.google.android.gms.internal 几乎是 1.4mb。我只是找不到这个大块的原因。一定是某种依赖。

在此处输入图片说明

我的基本清单文件如下所示:

dependencies {

api "com.android.support:design:$rootProject.supportLib"
api "com.android.support:support-fragment:$rootProject.supportLib"

api "com.android.support:appcompat-v7:$rootProject.supportLib"
api "com.android.support:recyclerview-v7:$rootProject.supportLib"
api "com.android.support:cardview-v7:$rootProject.supportLib"

api 'com.android.support.constraint:constraint-layout:1.0.2'
api "com.google.code.gson:gson:$rootProject.gson"
api "com.google.firebase:firebase-core:$rootProject.googleLibs"
api "com.google.firebase:firebase-ads:$rootProject.googleLibs"
api "com.google.firebase:firebase-appindexing:$rootProject.googleLibs"
api "com.google.android.gms:play-services-auth:$rootProject.googleLibs"
api "com.android.support:multidex:$rootProject.multidex"
api "com.github.bumptech.glide:glide:$rootProject.glide"
annotationProcessor "com.github.bumptech.glide:compiler:$rootProject.glide"
api "com.loopj.android:android-async-http:$rootProject.asyncHttp"

api "org.greenrobot:eventbus:$rootProject.greenRobotEventBus"
api "com.vincentbrison.openlibraries.android:dualcache:$rootProject.dualcache"
api('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
    transitive = true;
}
Run Code Online (Sandbox Code Playgroud)

adn*_*fch 5

我刚刚完成了同样的事情,并将 Instant Apps 的大小从 13MB 增加到 4MB。

经过这么多的头痛和无数个小时,我发现以下包的大小取决于您包含的依赖项。

  1. com.google.android.gms.internal
  2. android.support.v4.internal
  3. android.support.v7.internal

例如,如果您排除 Ads 依赖项,则内部大小将至少减少 500kb。Android 支持库也是如此,排除 CardView 并查看支持的内部大小缩小。

我将逐步列出我在制作一个非常大规模应用程序的多功能即时应用程序模块时遇到的所有麻烦:

移动仅在主应用程序中使用的依赖项

在您的情况下,以下 2 项对于 Instant App 绝对没用,只能在 Main App 中使用:

api "com.google.firebase:firebase-appindexing:$rootProject.googleLibs"
api "com.android.support:multidex:$rootProject.multidex"
Run Code Online (Sandbox Code Playgroud)

将它们移动到主应用程序,如果代码与您的视图相结合,移动 Appindexing 可能会很困难,但您必须修复它。就我而言,我必须从 Base Module 中的视图实例化 AppIndexing,因此我使用 Otto (EventBus) 做到了这一点。在 Base Module 中创建一个事件,触发它并在 Main App 的 AppIndexing helper 类中捕获。

从所有软件包中明确排除谷歌支持组

它可能看起来很荒谬,但大小不言而喻,使用明确的排除项更改所有 Google/Android 支持依赖项:

api("com.android.support:design:$rootProject.supportLib") {
    exclude group: 'com.android.support'
}
api("com.android.support:support-fragment:$rootProject.supportLib") {
    exclude group: 'com.android.support'
}
api("com.android.support:appcompat-v7:$rootProject.supportLib") {
    exclude group: 'com.android.support'
}
api("com.android.support:recyclerview-v7:$rootProject.supportLib") {
    exclude group: 'com.android.support'
}
api("com.android.support:cardview-v7:$rootProject.supportLib") {
    exclude group: 'com.android.support'
}
api('com.android.support.constraint:constraint-layout:1.0.2') {
    exclude group: 'com.android.support'
}
api("com.google.firebase:firebase-core:$rootProject.googleLibs") {
    exclude group: 'com.android.support'
}
api("com.google.firebase:firebase-ads:$rootProject.googleLibs") {
    exclude group: 'com.android.support'
}
api("com.google.firebase:firebase-appindexing:$rootProject.googleLibs") {
    exclude group: 'com.android.support'
}
api("com.google.android.gms:play-services-auth:$rootProject.googleLibs") {
    exclude group: 'com.android.support'
}
Run Code Online (Sandbox Code Playgroud)

为每个模块启用 Proguard

正如其他人提到的,为每个模块启用 proguard。我们最初的 13MB 中大约 25% 被 proguard 减少了。

排除不会在免安装应用中使用的功能

登录:

对我们来说,登录功能不需要在 Instant App 中。因此,我将与登录/身份验证相关的所有内容移至主应用程序,并使用事件总线从基本模块触发需要的操作。例如,导航抽屉中的登录/注销操作(隐藏在即时应用程序中,但在主应用程序中可见)存在于基本模块中。所以我为每个事件触发一个事件并在主应用程序模块中捕获它以显示登录屏幕或处理注销。

这使我能够排除com.google.android.gms:play-services-auth对基本模块的依赖,从而进一步减小了 gms 内部的大小。

广告:

我们不得不将广告从我们的基本模块移到主要应用程序中,仅用于大小目的。我们使用类似的技术(事件总线)调用从基本模块渲染广告并通过辅助类在主应用程序中进行实际渲染。

这使我们能够删除com.google.firebase:firebase-corecom.google.firebase:firebase-ads

PS:功能排除完全取决于您的需求/想要/妥协。我们做出这些决定是因为我们希望我们所有的创收功能都在 Instant App 中。所以只要我们能赚钱,我们不关心广告或登录。

希望这可以帮助。


kab*_*uko 0

我相当确定其中com.google.android.gms.internal包括公共 gms 软件包使用的通用代码,在您的情况下com.google.android.gms:play-services-auth(您可能用于智能锁)并且无法将其删除。如果你已经减少到 3.2MB,老实说我怀疑很难再变小了。您似乎同时使用了 Play 服务和支持库。在这两者之间,很难再把它降下来。我发现另一件有用的事情是使用配置分割,尤其是密度分割。