本机代码调试在 Android Studio 3 中不起作用

Native code debug is not working in Android Studio 3

我已经尝试了在 Whosebug 上找到的所有方法,但仍然面临这个问题。

我创建了一个具有本机支持的演示 Android 项目,向其添加了一个库并将所有本机代码移至库中。

现在我无法在本机代码的断点处停止,本机调试器仅在 SEGFAULT 崩溃后才激活。

我已将 defaultPublishConfig "debug" 添加到我的图书馆 build.gradle 并将 debuggable true 添加到应用程序 build.fradle。早期的本机调试已经足够了。但自从 Android Studio 升级后它就不能用了。

这里是完整的 build.gradle 个文件

应用程序

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28

    defaultConfig {
        applicationId "com.raistlin.myapplication"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            debuggable true
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation project(path: ':mylibrary')

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

我的图书馆

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28



    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        defaultPublishConfig "debug"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_TOOLCHAIN=clang"
                cppFlags "-fexceptions", "-std=c++11", "-DJSONCPP_NO_LOCALE_SUPPORT"
                version "3.10.2"
            }
        }
    }

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

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

首先,检查调试变体 select 为库编辑。

由于您的 build.gradle 有一个设置 path "src/main/cpp/CMakeLists.txt",我认为它不会构建。所以设置targets,重建并再次检查。

如果构建后断点不起作用,旧的垃圾可能会留在构建缓存中并导致问题。在资源管理器中打开项目目录并手动删除构建缓存(.externalNativeBuild 文件夹)并再次构建项目。我还删除了 build 文件夹,因为它在中间目录中包含 .so 文件,但它是可选的。

Android Studio 不清理测试设备中的库。它们基本上被覆盖,但根据需要手动清除它们。文件位于 /data/app/(包名)/lib/(cpu arch.)/.
注意:设备文件资源管理器的同步菜单在 lib 或 (cpu arch.) 目录下无法正确同步。要同步,select /data 或 /data/app 并选择同步。

NB.1 如果省略 targets,Android Studio 似乎不会构建任何目标。构建的输出在 (project)/app/build/intermediates/cmake/(flavor)/obj/(cpu architecture) 中。如果它似乎在没有任何目标的情况下工作,请检查设备上的文件。他们混淆了测试结果。

NB.2 debuggable true 用于发布版本以启用调试。无需为调试构建设置它,因为可调试标志设置为默认设置。

NB.3 似乎依赖于版本,但 Android Studio 中的 Gradle 即使调用了 clean 或 rebuild 也无法正确清理 .externalNativeBuild 树,并且混淆了本机代码构建配置。我记得是在 AS3.0 左右。

NB.4 我的环境是

  • Android Stuidio 3.2.1
  • 类路径'com.android.tools.build:gradle:3.2.1'
  • gradle-4.7-全部
  • CMake:默认(3.6.4111459)

我知道 Android Studio、Gradle 和 CMake 有更新的版本,但它们有问题,所以我选择了当前环境。据我所知,Android Studio 3.3、gradle:3.3.0、gradle-4.10.1-都在 VCS (git) 中存在严重错误。错误的文件内容显示在编辑器中,有时构建失败。将 CMake 版本设置为 3.10.x(对我来说是 3.10.2)似乎也有问题。

这是我项目的一个副本作为示例,对原始项目进行了部分修改,但可能会起作用。 我已经在 Android Studio 3.2.1.

的库工作中检查了断点
apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "0.0.1"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'proguard-rules.pro'
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
                arguments "-DANDROID_STL=c++_static"
                targets "sample"
            }
        }
    }

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

dependencies {
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

更新
targets is mentioned here Guide - Link Gradle to your native library - Specify optional configurations.