androidNdkOut和androidNdkLibsOut自动检测库无法正常工作

时间:2017-07-10 12:22:50

标签: android-ndk google-fabric crashlytics-android

最新的Fabric文档说

  

如果使用带有externalNativeBuild DSL的Gradle版本2.2.0+的Android插件,则应删除androidNdkOut和androidNdkLibsOut属性,因为Fabric插件会自动检测这些路径。   但它不适合我,因为我的本机代码位于库模块中。我在库模块中有本机代码,并在app模块中启用了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输出目录'[我的app模块路径] / 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}"
}

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

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类型的对象上找不到参数[我的Manifest的路径]的方法baseManifestPath()。

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我有主应用程序模块'app'和'library'模块包含ndk源。 以下代码允许我查看带行号的ndk崩溃:

crashlytics {
    enableNdk true
    androidNdkOut '../library/build/intermediates/cmake/release/obj'
}

希望它有所帮助。

答案 1 :(得分:1)

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

组装完适当的项目结构后,您可以使用AndroidManifest.xml文件,您需要为Fabric插件设置一些属性才能使用。

使用Ant

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

enableNDK=true
androidBaseManifest=AndroidManifest.xml
externalCSymUpload=true

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

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

使用Gradle 对于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上传您的符号。