本机代码调试在 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.
我已经尝试了在 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.