编程语言
首页 > 编程语言> > android-即时应用程序低于4mb的困难.如何减少apk大小

android-即时应用程序低于4mb的困难.如何减少apk大小

作者:互联网

我在将APK降到4mb以下时遇到了困难.
检查生成的即时应用APK之后
我看到com.google.android.gms.internal几乎是1.4mb.
我只是无法找到这么大块的原因.必须是某种依赖.

enter image description here

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

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

解决方法:

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

经过如此多的头痛和无数小时的努力之后,我发现以下软件包的大小取决于您所包含的依赖项.

> com.google.android.gms.internal
> android.support.v4.internal
> android.support.v7.internal

例如,如果排除广告依赖关系,内部大小将至少减少500kb. Android支持库也是如此,不包括CardView,而是看到支持的内部尺寸缩小.

我将逐步列出我在大型应用程序的多功能Instant Apps模块中遇到的所有麻烦:

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

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

api "com.google.firebase:firebase-appindexing:$rootProject.googleLibs"
api "com.android.support:multidex:$rootProject.multidex"

将它们移至主应用程序,如果代码与您的视图耦合在一起,但必须修复它,则移动Appindexing可能会很困难.就我而言,我必须从基本模块中的视图实例化AppIndexing,因此我使用Otto(EventBus)进行了此操作.在基本模块中创建一个事件,将其触发并捕获到Main App的AppIndexing帮助器类中.

从所有程序包中明确排除Google支持小组

它可能看起来很荒谬,但它的大小可以说明一切,使用显式排除项更改所有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'
}

为每个模块启用Proguard

正如其他人提到的,enable proguard for each module.proguard减少了我们原来的13MB的大约25%.

排除即时应用程序中不会使用的功能

登录:

对于我们来说,Instant App不需要登录功能.因此,我将与登录/身份验证相关的所有内容移到了主应用程序,并使用事件总线在基本模块中需要的地方触发了操作.例如,基本模块中包含导航抽屉中的“登录/注销”操作(在Instant App中隐藏但在Main应用程序中可见).因此,我为每个事件触发一个事件,并在Main App Module中捕获该事件以显示“登录屏幕”或进程注销.

这使我可以从基本模块中排除com.google.android.gms:play-services-auth依赖项,从而进一步减少了gms内部结构的大小.

广告:

我们仅出于尺寸目的将广告从基本模块移至主应用程序.我们使用类似的技术(事件总线)进行了此操作,以调用从基本模块渲染广告,并通过助手类在Main App中进行实际渲染.

这使我们可以删除com.google.firebase:firebase-core和com.google.firebase:firebase-ads

附言:功能排除完全取决于您的需求/意愿/妥协.我们做出这些决定是因为我们希望所有创收功能都可以在Instant App中使用.因此,只要我们能赚钱,我们就不会在意广告或登录.

希望这可以帮助.

标签:android-gradle,dependencies,android-instant-apps,android
来源: https://codeday.me/bug/20191110/2013623.html