使用 Fabric 的 Unity 5.6 自定义 gradle 配置

Unity 5.6 custom gradle configuration with Fabric

我想为使用 gradle 构建的 Unity Android 配置 Fabric 依赖项。我现在正在导出项目并使用 Android Studio 来消除错误,然后准备一个自定义工作 "mainTemplate.gradle" 这样我就可以直接从 Unity 5.6 构建。 以下是 Unity 建议的已配置依赖项:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // other dependencies
    compile project(':answers')
    compile project(':beta')
    compile project(':crashlytics')
    compile project(':crashlytics-wrapper')
    compile project(':fabric')
    compile project(':fabric-init')
}

每个 Fabric 文件夹都被视为具有自己的 gradle 配置的库。 这是我遇到的错误(由于在两个 "libraries" 的同一命名空间中使用了一个文件):

Uncaught translation error: java.lang.IllegalArgumentException: already added: Lio/fabric/unity/crashlytics/android/BuildConfig;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lio/fabric/unity/android/BuildConfig;

我尝试添加以下内容但没有成功:

android {
    dexOptions {
        preDexLibraries = false
    }

我也试过没有成功:

task androidReleaseJar(type: Jar, dependsOn: assembleRelease) {
            from "$buildDir/intermediates/classes/release/"
            exclude '**/BuildConfig.class'
        }

我是这样解决这个问题的: 默认情况下,每个结构文件夹都被视为一个项目,但只有 "fabric" 需要作为一个项目处理,因为它包含一个 "res" 文件夹和一个具有所需元数据值的 "AndroidManifest.xml" 文件。所以我只保留 "fabric" 作为一个项目,并将其他依赖项更改为作为简单的 *.jar 文件处理。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile fileTree(dir: 'fabric-init/libs', include: ['*.jar'])
    compile fileTree(dir: 'crashlytics-wrapper/libs', include: ['*.jar'])
    compile fileTree(dir: 'crashlytics/libs', include: ['*.jar'])
    compile fileTree(dir: 'beta/libs', include: ['*.jar'])
    compile fileTree(dir: 'answers/libs', include: ['*.jar'])
    compile project(':fabric')
}

并且在 Settings.gradle 我只保留一个项目参考:

//include 'answers'
//include 'beta'
//include 'crashlytics'
//include 'crashlytics-wrapper'
include 'fabric'
//include 'fabric-init'

您可以通过仅更改一个文件(不修改 Fabric)来禁用 BuildConfig java class 的生成。将此放在 Plugins/Android/mainTemplate.gradle 的末尾,用于所有问题项目:

['crashlytics', 'crashlytics-wrapper', 'fabric', 'fabric-init'].each { name ->
project(":$name").tasks.whenTaskAdded { task ->
    if (task.name == 'generateDebugBuildConfig' || task.name == 'generateReleaseBuildConfig' ) {
        task.enabled = false
    }
}

}