【问题标题】:very slow fabric initialization in android debugandroid调试中的结构初始化非常慢
【发布时间】:2018-03-27 19:43:46
【问题描述】:

我正在尝试在 android 上集成结构(crashlytics 与 NDK 支持和答案)并且我让它们工作。

但是,当我尝试调试我的应用程序时,fabric 需要很长时间(大约 5 百万)才能完成它的工作。

这是日志:

10-16 11:41:49.680 1534-1559/? V/WindowManager: Relayout Window{326db3dd0 u0 Starting app.company.com}: viewVisibility=0 req=2048x1536 WM.LayoutParams{(0,0)(fillxfill) sim=#20 ty=3 fl=#81830518 pfl=0x20011 wanim=0x103038a vsysui=0x600 needsMenuKey=2 naviIconColor=0}
10-16 11:41:49.701 1534-1559/? D/WindowManager: finishDrawingWindow: Window{326db3dd0 u0 Starting app.company.com} mDrawState=DRAW_PENDING
10-16 11:41:49.714 1534-1559/? I/WindowManager: Screen frozen for +113ms due to Window{326db3dd0 u0 Starting app.company.com}
10-16 11:41:49.945 21418-21684/app.company.com W/art: Verification of io.fabric.sdk.android.services.settings.Settings io.fabric.sdk.android.services.settings.Settings.initialize(io.fabric.sdk.android.Kit, io.fabric.sdk.android.services.common.IdManager, io.fabric.sdk.android.services.network.HttpRequestFactory, java.lang.String, java.lang.String, java.lang.String) took 173.644ms
10-16 11:44:51.139 21418-21684/app.company.com W/art: Verification of boolean io.fabric.sdk.android.services.settings.Settings.loadSettingsSkippingCache() took 181.194s
10-16 11:44:51.164 21418-21418/app.company.com D/libcrashlytics: Initializing libcrashlytics version 1.1.5
10-16 11:44:51.165 21418-21418/app.company.com D/libcrashlytics: Attempting to load unwinder...
10-16 11:49:24.955 21418-21684/app.company.com W/art: Verification of java.lang.String io.fabric.sdk.android.services.common.AbstractSpiCall.overrideProtocolAndHost(java.lang.String) took 303.615ms
10-16 11:49:25.366 21418-21418/app.company.com D/libcrashlytics: Done; using libunwind
10-16 11:49:25.366 21418-21418/app.company.com D/libcrashlytics: Attempting to register signal handler...
10-16 11:49:25.367 21418-21418/app.company.com D/libcrashlytics: Signal handler registered.
10-16 11:49:25.370 21418-21418/app.company.com D/libcrashlytics: Initializing native crash handling successful.

如您所见,

Verification of boolean io.fabric.sdk.android.services.settings.Settings.loadSettingsSkippingCache() took 181.194s

花了将近 300 万,而

Attempting to load unwinder...

也花了 300 万。

当我尝试在不附加调试器的情况下启动应用程序时(只需在 android studio 中运行而不是调试),应用程序就可以正常启动。

非常感谢您在哪里寻找此问题的任何方向。

吉勒姆

编辑 1:

挖了一下,其实是JniNativeApi的调用调用了

System.loadLibrary("crashlytics");

首先这需要很多时间。还不知道第二次冻结。

这很奇怪,因为库看起来很轻(libcrashlytics.so 大约是 600ko)

编辑 2:

这是我的 gradle 构建的结构:

在顶层的 proj.android 文件夹中有一个 build.gradle,其中包含所有子项目通用的所有配置选项(abiFilters、minSdkVersion ...):

    // Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

ext {
    minSdkVersion = 24
    targetSdkVersion = 26
    compileSdkVersion = 26
    buildToolsVersion = '26.0.1'
    abiFilters = [
            'XXX'
    ]
    cppDebugFlags = [
            'YYYYYY'
    ]
    cppReleaseFlags = [
            'ZZZZZ'
    ]
    arguments = [
            '-DANDROID_TOOLCHAIN=clang',
            '-DANDROID_PLATFORM=android-24',
            '-DANDROID_STL=c++_static',
            '-DANDROID_CPP_FEATURES=rtti exceptions'
    ]
}

task wrapper(type: Wrapper) {
    gradleVersion = '4.1'
}

task clean(type: Delete) {
    delete 'stuff'
}

然后我的所有子项目(1 个 com.android.application 和 4 个 com.android.library)都有一个 build.gradle 文件

我不认为库 build.gradle 文件是相关的,因为我没有在其中放入任何与结构相关的初始化,所以这是我的 build.gradle 用于主应用程序:

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        // These docs use an open ended version so that our plugin
        // can be updated quickly in response to Android tooling updates

        // We recommend changing it to the latest version from our changelog:
        // https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin
        classpath 'io.fabric.tools:gradle:1.24.2'
    }
}

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

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    sourceSets.main {
        res.srcDir "res"
        assets.srcDirs 'sources'
        jniLibs.srcDirs "jni"
        java.srcDirs "java sources dirs"
        manifest.srcFile "AndroidManifest.xml"
    }

    defaultConfig {
        applicationId 'app.company.com'
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 2
        versionName '0.1'
        ndk {
            moduleName "moduleName"
            abiFilters rootProject.ext.abiFilters.join(",").split(",")
        }
        externalNativeBuild {
            cmake {
                cppFlags rootProject.ext.cppReleaseFlags.join(",").split(",")
                arguments rootProject.ext.arguments.join(",").split(",")
                targets "target"
            }
        }
    }

    buildTypes {
        debug {
            externalNativeBuild {
                cmake {
                    cppFlags rootProject.ext.cppDebugFlags.join(",").split(",")
                }
                // to do: swap those two lines when when debug testing will be done
                ext.alwaysUpdateBuildId = false // STACKOVERFLOW NOTE: commenting this line doesn't change anything to the problem
                //ext.enableCrashlytics = false
            }
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        cmake {
            path "../../CMakeLists.txt"
        }
    }

    aaptOptions {
        cruncherEnabled = false
        noCompress 'zspine', 'zparticles', 'gz'
    }
}

crashlytics {
    enableNdk true
    manifestPath 'AndroidManifest.xml'
    // are these needed?
    // STACKOVERFLOW NOTE: I tried put the values that are given in the docs, but it doesn't seems to change anything
    //androidNdkOut 'build/intermediates/cmake/release/obj'
    //androidNdkLibsOut 'build/intermediates/bundles/default/jni'
}

// STACKOVERFLOW NOTE: here are some task definition to automatically update sources, I don't think they are relevant to the matter at hand
...

dependencies {
    compile fileTree(dir:'someJars')

    compile('com.crashlytics.sdk.android:crashlytics:2.7.0@aar') {
        transitive = true;
    }
    compile('com.crashlytics.sdk.android:crashlytics-ndk:1.1.6@aar') {
        transitive = true;
    }

    debugCompile project(path: ':lib1', configuration: 'debug')
    debugCompile project(path: ':lib2', configuration: 'debug')
    debugCompile project(path: ':lib3', configuration: 'debug')
    debugCompile project(path: ':lib4', configuration: 'debug')

    releaseCompile project(path: ':lib1', configuration: 'release')
    releaseCompile project(path: ':lib2', configuration: 'release')
    releaseCompile project(path: ':lib3', configuration: 'release')
    releaseCompile project(path: ':lib4', configuration: 'release')
}

我还在清单中添加了 api 键

...
<application android:label="@string/app_name"
    android:icon="@drawable/icon">

    <!-- name of our .so -->
    <meta-data android:name="android.app.lib_name"
        android:value="name" />

    <meta-data android:name="io.fabric.ApiKey"
        android:value="API Key"
        />
...

最后我在我的活动的 onCreate 方法中设置了 Fabric,如下所示:

// TODO uncomment this when testing's over
//Crashlytics crashlyticsKit = new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build();
//Fabric.with(this, crashlyticsKit);

Fabric fabric = new Fabric.Builder(this).kits(new Crashlytics(), new CrashlyticsNdk())
        .debuggable(true)
        .build();
Fabric.with(fabric);

非常感谢您的快速回答,希望补充信息对您有所帮助!

编辑 3

我在几台设备上测试过(galaxy tab s3 @7.0 & google pixel C @7.1.1),没有任何区别,问题依旧。

【问题讨论】:

  • 对于crashlytics 使用FIREBASE
  • 来自 Fabric 的 Mike。嗯,我在本地测试,没有看到同样的问题。你能分享你的 Fabric 初始化代码和 build.gradle 吗?
  • 您好!非常感谢您的快速答复。我已经更新了我的问题(编辑 2),以提供我的 build.gradle 和其他相关文件的详细信息。
  • 感谢您的其他编辑帮助,因为它们看起来都不错,但是无论是通过模拟器还是设备进行测试,我都无法生成 3 分钟的初始化时间。您在哪些设备和操作系统上进行测试?
  • 再次感谢您花时间回答。我通过重新启动我的 laptotp 解决了这个问题,但我不明白为什么它解决了它,也许它与 adb 在某个时候被卡住有关,或者其他一些事情,不能真正说出来,但现在一切都很好。 ..

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


【解决方案1】:

我现在不知道该怎么做,但是一旦我重新启动笔记本电脑,问题就消失了。我想这与 adb 调试器以某种方式卡住有关?

【讨论】:

  • 是的..!这是亚行的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多