Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle doesn't package gdbserver into apk. ndk-gdb results in "ERROR: Non-debuggable application installed on the target device"

In Android Studio 0.6 I created an android test project with a very simple C function wrapped with the JNI. I set android:debuggable="true" in the AndroidManifest.xml.

I ran ndk-build NDK_DEBUG=1. This generated a gdbserver and a gdb.setup file in the correct location.

enter image description here

However, when I built the project in Android studio, and ran ndk-gdb --debug I got the following output:

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!

I looked inside the apk gradle generated to make sure gdbserver was there, but I couldn't find the gdbserver or gdb.setup files! Where did they go?? It looks like gradle isn't packaging them in my apk!

Here's my 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.+'
}

How can I get gradle to properly package the gdbserver in my apk? If you want to try it yourself, I put the full source on github. https://github.com/cypressf/testndk

like image 770
Cypress Frankenfeld Avatar asked Jun 11 '14 15:06

Cypress Frankenfeld


1 Answers

I've experimented the same issue. Setting this:

android{
  buildTypes {
    debug {
        jniDebuggable true
    }
  }
}

wouldn't help since you don't rely on the android-plugin NDK integration.

One (not-so-good) solution is to manually copy the gdbserver and gdb.setup files to your app's nativeLibraryPath directory on the device, after your apk has been installed.

like image 76
ph0b Avatar answered Oct 17 '22 11:10

ph0b