4

最新的 Fabric 文档说

如果将 Android 插件用于 Gradle 版本 2.2.0+ 和 externalNativeBuild DSL,则应删除 androidNdkOut 和 androidNdkLibsOut 属性,因为 Fabric 插件会自动检测这些路径。但这对我不起作用,因为我猜我的本机代码位于库模块中。我在库模块中有本机代码,并在应用程序模块中启用了 Crashlytics。我怎样才能让它工作?

我正在使用 com.android.tools.build:gradle:2.3.3 和 io.fabric.tools:gradle:1.23.0。

错误:

com.crashlytics.tools.android.project.codemapping.CodeMappingException:Crashlytics 找不到 NDK 输出目录“[我的应用程序模块路径]/obj”。-androidNdkOut 设置是否配置正确?

更新。我将 Crashlytics 配置移至我的库模块:

buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath('com.android.tools.build:gradle:2.3.3') {
            force = true
        }
        classpath 'io.fabric.tools:gradle:1.23.0'
    }
}

repositories {
    jcenter()
}

apply plugin: 'com.android.library'
apply plugin: 'io.fabric'

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    publishNonDefault true

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "core"
        }

        externalNativeBuild {
            ndkBuild {
                abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64", "mips", "mips64"
            }
        }
    }

    lintOptions {
        abortOnError false
    }

    buildTypes {
        debug {
            debuggable true
            jniDebuggable true
            minifyEnabled false
        }
        release {
            debuggable false
            jniDebuggable false
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    externalNativeBuild {
        ndkBuild {
            path 'jni/Android.mk'
        }
    }
}

crashlytics {
    enableNdk true
    baseManifestPath '../app/src/main/AndroidManifest.xml'
}

dependencies {
    compile "com.android.support:support-v4:${rootProject.ext.supportLibVersion}"
    compile "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
    compile "com.android.support:design:${rootProject.ext.supportLibVersion}"
    compile "com.google.android.gms:play-services-maps:${rootProject.ext.playServicesVersion}"
    compile "com.google.android.gms:play-services-location:${rootProject.ext.playServicesVersion}"
}

我的应用模块现在只包含依赖项:

dependencies {    
    // Crashlytics Kit
    compile('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
        transitive = true
    }
    // NDK Kit
    compile('com.crashlytics.sdk.android:crashlytics-ndk:1.1.6@aar') {
        transitive = true
    }
}

但现在我收到错误

在 com.crashlytics.tools.gradle.CrashlyticsExtension 类型的对象上找不到参数 [我的清单的路径] 的方法 baseManifestPath()。

4

2 回答 2

9

我面临同样的问题。我有主应用程序模块“应用程序”和“库”模块包含 ndk 源。

2019 年 6 月更新

上个月,我在使用 gradle 执行“crashlyticsUploadSymbolsRelease”命令时遇到了错误。似乎 libs 文件的位置已更改。

下面的代码让我可以看到带有行号的 NDK 崩溃:

crashlytics {
    enableNdk true
    androidNdkOut '../library/build/intermediates/cmake/release/obj'
    androidNdkLibsOut '../library/build/intermediates/stripped_native_libs/release/out/lib'
}

希望能帮助到你。

于 2017-10-09T08:54:18.557 回答
1

来自 Fabric 的 Mike。当 NDK 资产直接构建到您的应用程序中时,这种改进将有所帮助,但在构建为单独的库项目时则无济于事。当本机代码是外部库的一部分时,项目结构可能会有所不同。在运行符号上传之前,您需要包含一个 Ant 或 Gradle 任务来临时创建适当的项目结构。

一旦你组装了适当的项目结构并且你的 AndroidManifest.xml 文件可用,你需要设置一些属性供 Fabric 插件使用。

使用蚂蚁

对于 Ant,您应该创建一个带有以下属性的 fabric.properties 文件:

enableNDK=true
androidBaseManifest=AndroidManifest.xml
externalCSymUpload=true

然后,要运行符号上传,调用crashlytics-devtools.jar可以在 Ant 插件 zip 文件中找到的符号。调用java -jar crashlytics-devtools.jar -properties fabric.properties将启动上传过程。

androidBaseManifest 属性AndroidManifest.xml使用应用的 API 密钥和包名称定义文件的路径。

使用 Gradle For Gradle,您需要一个最小的 Android build.gradle 文件,并且您可以直接在 crashlytics {} 块中定义属性:Fabric Gradle 插件要求在您的 build.gradle 中应用 Android Gradle 插件。

apply plugin: 'com.android.library'
apply plugin: 'io.fabric'

android {
  compileSdkVersion <CURRENT COMPILESDKVERSION>
  buildToolsVersion "<YOUR BUILD TOOLS VERSION>"

  defaultConfig {
    applicationId "<YOUR APP'S PACKAGE NAME>"
  }
}

crashlytics {
  enableNdk true
  baseManifestPath 'AndroidManifest.xml'
}

然后运行./gradlew crashlyticsUploadSymbolsRelease以上传您的符号。

于 2017-07-10T17:40:43.450 回答