4

時間の経過とともに成長した Android プロジェクトがあり、サイズが大きくなると gradle のビルド時間が長くなりました。

65k の制限を下回っている間 (約14秒) は耐えられました。現在、multidex では36秒かかります。

だから私の質問は - 使用されていないコードの部分を「オフ」にして、65k の制限以下に戻す方法はありますか?

たとえば、gradle を介して取り込まれ、数千のメソッドを持つ amazon s3 sdk をオフにします。

プロガードでコードを削除できることは知っていますが、それではビルド時間がさらに長くなります。

それを使用するパーツを開いたときに実行時にクラッシュすることに満足しています。テストをより迅速にしたいだけです。

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

このような私にできることはありますか?それとも他の方法ですか?

4

3 に答える 3

3

これを行う唯一の現実的な方法 (私が知っている) は、プロジェクトをリファクタリングして、パッケージを個別のモジュールに分割することです。したがって、モジュールごとに個別の gradle ビルド ファイルが必要になりますが、各モジュールが変更されるたびに再コンパイルするだけで済みます。たとえば、データ アクセス パッケージと UI パッケージを用意できます。それはかなり自然な分割のように思えます。

これは残念な答えだと思いますが、あなたが不満を言っている問題は、ビルドの依存関係が余分な不要なライブラリとメソッド呼び出しをすべて必要とすることです.コードがそれらを使用するわけではありません.

私があなたに提供できる唯一のヒントは、Google Play API キットには何万ものメソッド呼び出しがあるということです。使用しているピースのみを使用できる場合は、65k の制限を下回る可能性がはるかに高くなります。

于 2016-04-26T00:19:42.830 に答える
1

各ビルド タイプのコンパイル時の依存関係を個別に指定することができます。このメソッドを使用して、リリース ビルドのみに「運用専用」の依存関係を含め、デバッグ ビルドのメソッド数を減らします。

たとえば、リリース ビルドには Crashlytics のみを含めます。したがって、リリースビルド (およびベータ版とアルファ版)build.gradleのみの依存関係を含めます。

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

次に、Crashlytics の機能を というクラスに抽象化しますCrashReportingService。私のデバッグ ソース コードでは、このクラスは何もしません。

/app/src/ debug /java/com/example/services/CrashReportingService.java :

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

    public static void logException(Throwable throwable) {
    }
}

そして、リリース ソース コードで実装を具体化します。

/app/src/ release /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 への参照はありません。65,000 メソッド以下に戻ってください。万歳!

于 2016-04-30T20:07:23.647 に答える