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

时间:2019-01-17 13:59:03

标签: android android-studio android-debug

我已经尝试了在StackOverflow上找到的所有方法,但仍然会遇到问题。

我创建了一个具有原生支持的演示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'
}

1 个答案:

答案 0 :(得分:1)

首先,检查是否为库选择了调试版本。

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

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

Android Studio不会清除测试设备中的库。它们基本上被覆盖,但是根据需要手动清除它们。文件位于/ data / app /(程序包名称)/ lib /(cpu架构)/中。
注意:设备文件资源管理器的同步菜单在lib或(cpu档案)目录下无法正确同步。要进行同步,请选择/ data或/ data / app,然后选择同步。

NB.1如果省略targets,则Android Studio似乎没有建立目标。生成的输出位于(project)/ app / build / intermediates / cmake /(flavor)/ obj /(cpu体系结构)中。如果似乎没有任何目标,则检查设备上的文件。他们混淆了测试结果。

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

NB.3似乎与版本有关,但是即使调用clean或rebuild,Android Studio中的Gradle也无法正确清理.externalNativeBuild树,并混淆了本机代码生成配置。我记得当时是在AS3.0左右。

NB.4我的环境是

  • Android Stuidio 3.2.1
  • classpath'com.android.tools.build:gradle:3.2.1'
  • gradle-4.7-all
  • 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中提到了Guide - Link Gradle to your native library - Specify optional configurations