最新的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()。
答案 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
上传您的符号。