0

で独立して、またはアプリケーションの依存関係として構築しているかどうかを検出:働く他のプロジェクトのための1つのAAR、にすべてのライブラリモジュールをマージする、android-fat-aarを使用してライブラリは私のプロジェクトは、以下の構造を有するのGradle

--\Project 
    --\Library Module A 
    --\Library Module B  
    --\Library Module C  
    --\Application Module 

- 私を魔法のように。

私のライブラリをテストするために、ライブラリを含むアプリケーションモジュールもあります。最新のGradleのバージョンと脂肪AARバージョンにアップグレードした後

、アプリケーションモジュールを構築することは不可能である

Github Issue - com.android.dex.DexException: Multiple dex files define ...

ライブラリモジュールBをマージするライブラリモジュールCに、これらの依存関係を、の代わりにに、を埋め込むように宣言する必要があります。

dependencies { 
    testCompile 'junit:junit:4.12' 
    compile('com.android.support:support-v4:10.0.1') 
    embedded project(':Library-Module-B') 
    embedded project(':Library-Module-C') 
} 

前述したように、これはライブラリを単独でビルドすると機能しますが、アプリケーションモジュールをビルドしても機能しません。

私はこのエラーが発生した理由をこれらのライブラリのいずれもログ出力に応じて複数回含まれていなかっますので、私は小さな回避策を考え出すことは、トリックを行うだろうと思ったので、知っているドント

    ライブラリが(それが再び動作するため)または脂肪AAR

に設定されているデフォルトの依存関係にすべての埋め込み依存関係を追加できるようにすることも可能trueの場合にコンパイルする組み込み独立か

  • 変更を構築している場合
  • チェックライブラリが検出した場合、ライブラリが独立してビルドされている場合、またはアプリケーションがライブラリと一緒に構築されている場合私は、GradleのでAndroidのライブラリを構築する(とandroid-fat-aarを聞いたことがないと本当に慣れていないんだと

  • 答えて

    2

    私は単に

    したがってEXT-プロパティを使用して、それを解決する可能性が - 私アプリケーションモジュール

    android { 
        rootProject.ext.set("applicationBuild", true) 
        compileSdkVersion 23 
        . 
        . 
        . 
    } 
    

    およびサブモジュール

    boolean applicationBuild = rootProject.hasProperty("applicationBuild") 
    
        if (!applicationBuild) { 
        embedded ..... 
        embedded ..... 
        embedded ..... 
        }else{ 
        compile .... 
        compile .... 
        compile .... 
        } 
    
    でそれを設定します

    このプロパティは、アプリケーションモジュールを構築するときにのみ設定されます

    0

    、私はので、多分他の誰かが何かを思い付くことができ、正常に動作し、より良い解決策があるかどうかと言うことはできません。

    あなたが気にしている検出を行うには、たとえばgradle.taskGraph.whenReady { }を使用して、そこにアプリケーションのタスクが存在するかどうかtaskGraphを確認します。taskGraphは、このビルドで実行されるタスクを表します。 defaultTasks(存在しない場合))とそのすべての依存関係。

    実際にこの時点は、構成フェーズの後にあるため、依存関係がcompileembeddedかどうかを変更するには遅すぎる可能性があります。しかし、あなたが示唆したように太ったままの構成を変更するのは間に合うかもしれません。ちょうどそれと遊んで、それがwhenReady閉鎖内から働く方法を参照してください。

    +0

    ありがとうございます。私は、afterEvaluateメソッドに埋め込まれた依存関係をコンパイルの依存関係に追加しようとしましたが、動作するようです。問題は、洗練されたソリューション(fat-aarを変更する)が必要な場合、アプリケーションモジュール名をハードコードできないということです。何らかの理由でモジュールに関する情報を取得するソリューションが必要です。ビルドプロセスを開始します –

    +0

    'afterEvaluate'では?私は 'afterEvaluate'について何も言わなかった。どのようにあなたのチェックをしていますか、この時点で 'taskGraph'は準備ができていないかもしれません。モジュールはビルドプロセスを開始せず、実行するタスクを呼び出してビルドプロセスを開始します。どのタスクが実行され、アプリケーションがビルドされているかどうかをチェックしています。ライブラリモジュールからアプリケーションモジュールを分離し、アプリケーションモジュールをスタンドアロンにしたり、他のアプリケーションと同様にライブラリを使用したりすることも考えられます。 – Vampire

    関連する問題