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

时间:2018-01-16 14:37:28

标签: android android-gradle dependencies android-instant-apps

我遇到困难让apk低于4mb。 检查生成的即时应用程序APK(s) 我看到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;
}

3 个答案:

答案 0 :(得分:3)

我刚刚完成同样的工作,将Instant Apps的大小从13MB提升到4MB。

经过如此多的头痛和无数个小时后,我发现以下包的大小取决于您所包含的依赖关系。

  1. com.google.android.gms.internal
  2. android.support.v4.internal
  3. android.support.v7.internal
  4. 例如,如果您排除广告依赖关系,则内部大小将减少至少500kb。 Android支持库也是如此,排除CardView并查看支持内部缩小。

    我将逐步列出我为一个非常大规模的应用程序执行多功能Instant Apps模块所遇到的所有麻烦:

    移动仅在主应用中使用的依赖关系

    在您的情况下,以下两个项目对于即时应用程序绝对没用,只能在主应用程序中使用:

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

    将它们移动到主应用程序,移动Appindexing可能很难,如果代码与您的视图相结合,但您必须修复它。在我的情况下,我必须从基本模块中的视图实例化AppIndexing,所以我使用Otto(EventBus)来实现。在Base Module中创建了一个事件,将其解雇并捕获到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。我们原来的13MB中约有25%是通过proguard减少的。

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

    登录:

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

    这允许我从基本模块中排除com.google.android.gms:play-services-auth依赖性,这进一步减少了gms内部大小。

    广告:

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

    这允许我们删除com.google.firebase:firebase-corecom.google.firebase:firebase-ads

    P.S:功能排除完全取决于您的需求/需求/妥协。我们采取了这些决定,因为我们希望所有创收功能都在Instant App中。因此,只要我们可以赚钱,我们就不会关心广告或登录。

    希望这有帮助。

答案 1 :(得分:0)

我很确定com.google.android.gms.internal包含公共gms包使用的公共代码,在您的情况com.google.android.gms:play-services-auth(您可能用于Smart Lock)并且无法将其删除。如果你已经降到3.2MB,说实话,我怀疑要变得更小更难。您似乎正在使用Play服务和支持库。在这两者之间,很难将其降低。我发现有用的另一件事是使用configuration splits,尤其是密度分割。

答案 2 :(得分:0)

看起来这是com.google.firebase的依赖树:firebase-ads:

\--- com.google.firebase:firebase-ads:11.8.0
     +--- com.google.android.gms:play-services-ads:11.8.0
     |    +--- com.google.android.gms:play-services-ads-lite:11.8.0

play-services-ads是一个很大的库(在“com.google.android.gms.internal”中为很多代码做出贡献),你可以通过将其换成smaller library来获得成功。 (当然,我建议提交一个问题,以获得官方支持的“精简版”“firebase-ads”。)