1

我想使用 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 配置的库。这是我遇到的错误(由于在两个“库”的同一命名空间中使用了一个文件):

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'
        }
4

2 回答 2

2

以下是我解决这个问题的方法:默认情况下,每个结构文件夹都被视为一个项目,但是只有“结构”需要作为一个项目处理,因为它包含一个“res”文件夹和一个带有所需元数据值的“AndroidManifest.xml”文件. 所以我只保留“结构”作为一个项目,并将其他依赖项更改为简单的 *.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'
于 2017-04-23T17:02:50.107 回答
1

您可以通过仅更改一个文件(无需修改 Fabric)来禁用 BuildConfig java 类的生成。对于所有有问题的项目,将其放在 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
    }
}

}

于 2017-10-10T11:04:04.317 回答