关闭部分代码以加快构建时间(Gradle)

2020年9月14日 15点热度 0条评论

我有一个Android项目,它随着时间的推移而增长,并且随着规模的增长,gradle的构建时间也越来越长。

当它处于65k限制之内时,这是可以忍受的-约为 14s
现在使用multidex时,需要 36s

所以我的问题是-是否有任何方法可以“关闭”未使用的代码部分,使其恢复到65k的限制以下?

例如关闭通过gradle引入的亚马逊s3 sdk,它具有数千种方法。

我知道您可以使用proguard剥离代码,但这只会增加构建时间。

我很高兴在打开使用它的零件时在运行时崩溃,只是想加快测试速度。

当我从gradle导入中删除Amazon时,我显然得到了:Error:(24, 26) error: package com.amazonaws.auth does not exist
有没有办法以某种方式忽略该错误?我知道在Picasso中,它会进行运行时检查,以查看是否具有OkHttp,如果没有,请使用标准网络。

static Downloader createDefaultDownloader(Context context) {
    if (SDK_INT >= GINGERBREAD) {
       try {
         Class.forName("com.squareup.okhttp.OkHttpClient");
         return OkHttpLoaderCreator.create(context);
       } catch (ClassNotFoundException ignored) {}
    }
    return new UrlConnectionDownloader(context);
}

有什么我可以做的吗?还是其他方式?

解决方案如下:

可以为每种构建类型分别指定编译时依赖性。我使用此方法仅在发行版本中包括“仅生产”依赖项,从而减少了调试版本的方法数量。

例如,我仅将Crashlytics包含在发行版本中。因此,在build.gradle中,我仅包括版本构建(以及beta和alpha)的依赖项:

releaseCompile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
    transitive = true;
}

然后,我将Crashlytics的功能抽象为一个名为
CrashReportingService的类。在我的调试源代码中,此类不执行任何操作:

/ app / src /
调试 /java/com/example/services/CrashReportingService.java:

public class CrashReportingService {
    public static void initialise(Context context) {
    }

    public static void logException(Throwable throwable) {
    }
}

然后在发布源代码中充实实现:

/ app / src /
发布 /java/com/example/services/CrashReportingService.java

public class CrashReportingService {
    public static void initialise(Context context) {
        Fabric.with(context, new Crashlytics());
    }

    public static void logException(Throwable throwable) {
        Crashlytics.getInstance().core.logException(throwable);
    }
}

现在,Crashlytics仅包含在发行版本中,并且在我的调试版本中没有对Crashlytics的引用。回到65k方法之下,万岁!