10

在 Android Studio 0.6 中,我创建了一个带有 JNI 包装的非常简单的 C 函数的 android 测试项目。我设置android:debuggable="true"AndroidManifest.xml.

我跑了ndk-build NDK_DEBUG=1。这会在正确的位置生成一个gdbserver和一个gdb.setup文件。

在此处输入图像描述

但是,当我在 Android Studio 中构建项目并运行时,ndk-gdb --debug我得到以下输出:

Android NDK installation path: /usr/local/android-ndk-r9d
Using default adb command: /Applications/Android Studio.app/sdk/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.31
Using ADB flags:
Using JDB command: /usr/bin/jdb
Using auto-detected project path: .
Found package name: com.example.testndk.app
ABIs targetted by application: armeabi-v7a
Device API Level: 19
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi-v7a
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup
Using toolchain prefix: /usr/local/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-
Using app out directory: ./obj/local/armeabi-v7a
Found debuggable flag: true
Found gdb.setup under libs/armeabi-v7a, assuming app was built with NDK_DEBUG=1
Found data directory: '/data/data/com.example.testndk.app'
ERROR: Non-debuggable application installed on the target device.
       Please re-install the debuggable version!

我查看了生成的 apk gradle 以确保 gdbserver 在那里,但我找不到gdbserverorgdb.setup文件!他们去哪儿了??看起来 gradle 没有将它们打包在我的 apk 中!

这是我的build.gradle

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "com.example.testndk.app"
        minSdkVersion 9
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }

    sourceSets.main {
        jniLibs.srcDir 'src/main/libs' // use the jni .so compiled from the manual ndk-build command
        jni.srcDirs = [] //disable automatic ndk-build call
    }

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
}

如何让 gradle 正确地将 gdbserver 打包到我的 apk 中?如果你想自己尝试一下,我把完整的源码放在了 github 上。https://github.com/cypressf/testndk

4

6 回答 6

13

我已经尝试过同样的问题。设置这个:

android{
  buildTypes {
    debug {
        jniDebuggable true
    }
  }
}

不会有帮助,因为您不依赖 android-plugin NDK 集成。

一种(不太好的)解决方案是nativeLibraryPath在安装 apk 后手动将 gdbserver 和 gdb.setup 文件复制到设备上的应用程序目录。

于 2014-06-12T08:50:04.757 回答
0

我遇到了同样的问题并通过这种方式修改“package[ProductFlavor][BuildType]JniLibs”任务解决了它(在build.gradle中的android部分之后):

Sync packageTask = project.getTasks().findByName("packageDebugJniLibs")
packageTask.include(['**/gdbserver', '**/gdb.setup'])

如果您使用产品风格例如:demo、full - 您必须修改名为 packageDemoDebugJniLibs 和 packageFullDebugJniLibs 的两个任务。

// 编辑:您还应该添加一个导入:

import org.gradle.api.tasks.Sync

但如果你写 def packageTask = ...

于 2014-11-12T19:01:25.410 回答
0

我也遇到同样的问题。

=方式1=

由于 gdbserver 被命名为 'gdbserver' 而不是 'gbdserver.so',它不会被安装到 APK 中。我们可以这样做:http://ivansotof.com/2013/12/includes-native-so-libraries-in-android/,最后我们可以确保 APK 包含 APK/lib/[ABI 中的 gdbserver ]/gdb服务器。

=方式2=

@ph0b 的答案对我的项目很有用,而且有效!我的 gradle 是 v1.2,com.android.tools.build:gradle:0.10.+' 祝我的朋友好运。

一些有用的链接: http: //ph0b.com/android-studio-gradle-and-ndk-integration/

于 2014-06-18T12:34:59.080 回答
0

我在两种不同的情况下遇到了同样的问题。

1) 如果您使用三星手机进行调试。它们与 gdb 的本机调试不兼容。检查这个:http: //developer.samsung.com/forum/thread/ndk-debugging-with-gdb/77/178834

2)如果您使用任何其他手机(在我的情况下为 Sony xperia Z),请确保您的手机允许它调试您的应用程序。这意味着去开发人员选项>选择调试应用程序:xyz.app

于 2015-04-09T15:00:10.647 回答
0

还有另一种方法,使用apktool

✓ 反编译你的.apk使用apktool d path/to/your.apk

✓ 复制到gdbserver文件夹gdb.setupyour.apk/libs

✓ 重建你.apkapktool b -o out.apk path/to/decompiled

✓ 使用以下命令退出您的 apk:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore your.apk androiddebugkey

✓ 安装您的 apkadb install -r your.apk

于 2016-02-21T10:40:28.747 回答
0

我不确定我的回答是否会回答您的问题,但我有类似的问题 - .apk 不包含/lib/armeabi-v7a/gdbserver,显然我自己的调试器(Visual Studio)需要那个。

我在 %NDK_ROOT%( C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r11c\) 中进行了搜索,发现我需要的 gdbserver 在路径下: "C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r11c\prebuilt\android-arm\gdbserver\gdbserver"

(我已经二进制比较了它与打包到 .apk 文件中的文件相同)

我已将该文件复制到 gradle 指定的文件夹中:

sourceSets {
    ...
    debug.jniLibs.srcDirs = [
        'libs/debug'

    ]
    release.jniLibs.srcDirs = [
        'libs/release'

    ]

所以进入 libs/debug,而 gdbserver 最终进入 .apk 文件。

在 Visual Studio 中,我已将启动活动重新配置为“启动器活动”,并且在该调试会话成功启动之后。

但我想我需要添加更多的 Visual Studio 项目才能启用实际的源代码调试 - 现在至少中断和线程窗口似乎已填满。

于 2018-01-26T16:55:00.550 回答