Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Gradle模块构建顺序2_Android_Gradle_Aar - Fatal编程技术网

Android Gradle模块构建顺序2

Android Gradle模块构建顺序2,android,gradle,aar,Android,Gradle,Aar,我有一个Android和Gradle项目,有很多模块(只有AAR,没有应用程序) 因为谷歌不支持fat-AAR,我需要自己重新打包(我尝试了多个fat-AAR-Gradle插件,但都不起作用,支持根本帮不了我) 因此,我必须自己编写重新打包(作为Groovy脚本,直接写入Gradle构建系统) 为此,我需要: 构建许多AAR——这些是多个渐变模块 将所有这些AAR重新打包到一个大AAR中-这是一个特殊的Gradle模块(上面所有的AAR都设置为该AAR的实现依赖项) 然后使用DexGuard(

我有一个Android和Gradle项目,有很多模块(只有AAR,没有应用程序)

因为谷歌不支持fat-AAR,我需要自己重新打包(我尝试了多个fat-AAR-Gradle插件,但都不起作用,支持根本帮不了我)

因此,我必须自己编写重新打包(作为Groovy脚本,直接写入Gradle构建系统)

为此,我需要:

  • 构建许多AAR——这些是多个渐变模块
  • 将所有这些AAR重新打包到一个大AAR中-这是一个特殊的Gradle模块(上面所有的AAR都设置为该AAR的实现依赖项)
  • 然后使用DexGuard(无ProGuard/R8-这些太弱)混淆所有内容
重新包装对我来说很好。但是

如果我执行此操作以确保干净的发布版本:

./gradlew clean :MbiSdkLibrary:assembleRelease
它首先清理所有东西,然后尝试构建我的脂肪库

问题是MbiSdkLibrary AAR构建与依赖AAR的构建并行启动,而其他AAR的构建尚未完全完成。换句话说,Gradle在确定构建顺序时似乎忽略了依赖关系

随后,MbiSdkLibrary(最终fat AAR)的重新打包在其他(并行)构建中丢失的AAR上随机失败(这是一场竞赛)

当然,我可以通过这种方式实现构建(我测试过,它工作得很好):

  • 首先使用单独的gradle命令构建依赖项AARs
  • 之后构建最终fat AAR(无清洁任务)
但那个解决方案对我来说听起来很愚蠢,我相信Gradle不能被限制到不能正确地做这么简单的事情

我也在谷歌上搜索了很多,并尝试了一些变通方法,包括:

  • 由于某种原因,它对我不起作用(与其他Gradle模块的任务依赖关系对我不起作用)
我的问题与此问题相关:


抱歉,由于某些原因,我不允许在那里交流,因此我不得不用另一个(非常类似的)问题来回答so。

我能够使用GradleBuild类型的任务解决这个问题

但是它使构建速度慢了5倍,并且消耗了更多的内存

这是我的方法

// Note: This method is a bit hacky solution:
// - It creates a child Gradle build which can easily cause OOM error
// Awaiting response for the Gradle related question:
// - https://stackoverflow.com/questions/59624688/gradle-module-build-order-2
// - Hopefully someone knows better way hot to do this properly

def aarDependencies_setupModuleDependencies(task) {
    String buildType
    if (task.name == 'preBuild') {
        buildType = ''
    } else if (task.name == 'preDebugBuild') {
        buildType = 'Debug'
    } else if (task.name == 'preReleaseBuild') {
        buildType = 'Release'
    } else {
        return
    }
    List<String> taskList = new ArrayList<>()
    project.ext.REPACKAGING__PROJECT_DEP.each { dirFn ->
        String moduleName = dirFn[1]
        String taskToRun = ":$moduleName:assemble$buildType"
        taskList.add(taskToRun)
    }
    task.dependsOn tasks.create(name: "buildDependenciesFor${buildType}", type: GradleBuild) {
        dir "../../"
        buildFile 'build.gradle'
        setTasks(taskList)
        doFirst {
            aarDependencies_log("Ensuring dependencies for build type '${buildType}' are available...")
        }
        doLast {
            aarDependencies_log("Ensuring dependencies for build type '${buildType}' are available: DONE")
        }
    }
}
//注意:这个方法有点老套:
//-它会创建一个子渐变构建,这很容易导致OOM错误
//等待Gradle相关问题的答复:
// - https://stackoverflow.com/questions/59624688/gradle-module-build-order-2
//-希望有人知道更好的方法来正确地做这件事
def aarrependencies_setupModuleDependencies(任务){
字符串构建类型
如果(task.name=='preBuild'){
buildType=“”
}else if(task.name=='preDebugBuild'){
buildType='Debug'
}else if(task.name=='preReleaseBuild'){
buildType='Release'
}否则{
返回
}
List taskList=new ArrayList()
project.ext.repacking\uuuu project\u DEP.each{dirFn->
字符串moduleName=dirFn[1]
字符串taskToRun=“:$moduleName:Assembly$buildType”
任务列表。添加(taskToRun)
}
task.dependsOn tasks.create(名称:“buildDependenciesFor${buildType}”,类型:GradleBuild){
目录“./../”
构建文件“build.gradle”
设置任务(任务列表)
首先{
aarDependencies_日志(“确保生成类型“${buildType}”的依赖项可用…”)
}
多拉斯特{
aarDependencies_log(“确保生成类型“${buildType}”的依赖项可用:完成”)
}
}
}