Отладка собственного кода не работает в Android Studio 3 - PullRequest
0 голосов
/ 17 января 2019

Я перепробовал все способы, найденные в 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'
}

MyLibrary

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 голосов
/ 25 января 2019

Сначала проверьте, выбран ли вариант отладки для библиотеки.

Поскольку у вашего build.gradle есть настройка, path "src/main/cpp/CMakeLists.txt", я думаю, он не будет собираться. Так что установите targets, пересоберите и проверьте снова.

Если точки останова не работают после сборки, старый мусор может остаться в кэше сборки и вызвать проблемы. Откройте каталог проекта в проводнике и удалите кэш сборки (папка .externalNativeBuild) вручную и снова соберите проект. Я также удаляю папку сборки, так как она содержит .so файлы в промежуточном каталоге, но это необязательно.

Android Studio не очищает библиотеки в тестовом устройстве. Они в основном перезаписываются, но очищают их вручную в зависимости от потребностей. Файлы находятся в / data / app / (имя пакета) / lib / (cpu arch.) /.
Примечание: меню синхронизации в проводнике файлов устройства не синхронизируется должным образом в каталоге lib или (cpu arch.). Для синхронизации выберите / data или / data / app и выберите Synchronize.

NB.1 Если targets опущено, Android Studio, похоже, не создает целей. Встроенный вывод находится в (проект) / приложение / сборка / промежуточные / cmake / (вкус) / obj / (архитектура процессора). Если кажется, что он работает без каких-либо целей, проверьте файлы на устройстве. Они путают результаты теста.

NB.2 debuggable true предназначен для сборки выпуска, чтобы включить отладку. Нет необходимости устанавливать его для отладочной сборки, так как флаг отладки установлен по умолчанию.

NB.3 Кажется, что зависит от версии, но Gradle в Android Studio не очищает дерево .externalNativeBuild должным образом, даже если вызывается clean или rebuild, и сбивает с толку конфигурации сборки собственного кода. Это было около AS3.0, насколько я помню.

NB.4 Моя среда

  • Android Stuidio 3.2.1
  • classpath '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-all имеют серьезные ошибки в 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'
}

Обновление
target упоминается здесь Guide - Link Gradle к вашей собственной библиотеке - укажите дополнительные конфигурации .

...