15

私は自分のプロジェクトで多くのモジュール (ローカルおよびオンラインのもの、ほとんどの場合 20 以上) を使用していますが、通常、それらのどれもチェックまたは再コンパイルする必要はないと言えます。それらをすべて.jarファイルとして含めてビルド時間を短縮することもできますが、次のことをお勧めします。

  • .jarGradleがすべてのモジュールに対してビルドして再利用する必要があると定義する場所に何かをセットアップします
  • 必要に応じて、このセットアップを無効にしてプロジェクトをビルドします (完全にクリーン ビルドで実行できます)。
  • .jarプロジェクトでモジュールを編集できるようにしたいので、モジュールをファイルとして直接含めたくありません。

ビルド時間を短縮したいのですが、.jarファイルをビルドして手動でプロジェクトに追加する必要はありません。

これが可能であるかどうかについてのアイデアはありますか?いくつかのセットアップまたはgradleタスクなどを介してそれを実現できますか?

4

2 に答える 2

6

.jar に存在し、ダウンロードする必要がある検証ライブラリについて考えてみましょう。それ以外の場合は、いくつかのタイプの製品フレーバーを提供できます。そして、この後、作業用の Build Flavors を選択するだけです。

productFlavors {
        fastDebug {
            applicationIdSuffix ".jar"
        }
        regularDegub {
            applicationIdSuffix ".regular"
        }
        ....
        // Other Configuration
    }

dependencies {
    ...
    // Jar Debug by adding only Jar
    fastDegubCompile fileTree(dir: 'libs', include: '*.jar')
    fastDegubCompile 'com.android.support:support-v4:23.1.1'

    ...
    // Regular Debug with downloading all libraries
    // Including only specific from project files
    regularDegubCompile 'com.squareup.picasso:picasso:2.5.2'
    regularDegubCompile 'com.android.support:support-v4:23.1.1'
    regularDegubCompile files('libs/specific1.jar', 'libs/specific2.jar')

} 

| | 更新 |

したがって、いくつかの回避策の後、Gradleがライブラリをキャッシュに収集し、ソースを表示できることがわかりました。しかし、私はまだプロジェクト構成で正しい検証ライブラリの方法を探しています。

今のところ、Gradle キャッシュの場所からファイルを収集するためのスクリプトを作成しました。そして、ビルドフレーバーを使用できる新しい場所にそれらをコピーします。これは非常に高速に動作しますが (200 個のライブラリで 7 秒未満)、まだ改善が必要です (上記を参照)。

時間がない場合は、次の更新のために、ソリューションを拡張するために自由に記入してください. 理解に感謝。

// Task for calling from Gradle Scripts
// -----------------------------------

task gatheringJarFilesTask << {
    println("Gathering Jars Start...")
    gatheringJarFiles(gradleCacheLocation, foundedJarsList)
    println("------------------------------")
    println("Gathering Jars End! Start copying!")
    copyFiles(projectJarsLocation, foundedJarsList)

}


// Constants, which might be optimized too
// -----------------------------------

def gradleCacheLocation = '/home/kasyangenka/.gradle/caches/modules-2/files-2.1'
def projectJarsLocation = '/home/kasyangenka/Projects/GradleScriptsTest/app/libs'
List<String> foundedJarsList = []

// Main Script Methods
// -----------------------------------

def gatheringJarFiles(baseDirPath, gatheredList) {
    new File(baseDirPath).eachFile {file ->
        println("-> Current file: " + file.getName())
        if (file.isDirectory()) {
            gatheringJarFiles(file.getAbsolutePath(), gatheredList)
        }
        def containsLib = (file.getName().contains(".jar")
                || file.getName().contains(".aar"));

        if (containsLib)  {
            println("->> Adding Jar file: " + file.getAbsolutePath())
            gatheredList.add(file.getAbsolutePath())
        }
    }
}

def copyFiles (destiny, List sourceList) {
    sourceList.each {filePath ->
        copy {
            from filePath
            into destiny
        }
    }
}
于 2016-11-10T14:54:28.263 に答える