在 Android Studio 中调试预构建的共享库

时间:2021-07-22 08:15:28

标签: android android-studio

我正在尝试使用单独构建的 C++ 共享库,并且仅将二进制文件复制到我的 Android 项目中。
除调试外,一切正常。
Android Studio 的 lldb 调试器只是跳过了共享库 API 调用的那一行。
二进制文件是用所有需要的符号构建的。

你能告诉我一些我可以尝试的方法吗?
谢谢。


以下是我的 Android Studio 设置、build.gradle 和 cmake。 enter image description here

build.gradle

defaultConfig {
    externalNativeBuild {
        cmake {
            cppFlags ''
            arguments "-DANDROID_STL=c++_shared"
        }
    }
    ndk {
        abiFilters "x86"
        //abiFilters "x86_64"
    }
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled false
        debuggable true
        jniDebuggable true
        renderscriptDebuggable true
    }
}

packagingOptions {
    doNotStrip "/x86/*.so"
    //doNotStrip "/x86_64/*.so"
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

externalNativeBuild {
    cmake {
        path file('CMakeLists.txt')
        version '3.10.2'
    }
}

sourceSets {
    main {
        jniLibs.srcDirs = ['/src/main/libnode/bin']
    }
}

制作

add_library(libnode SHARED IMPORTED)
set_target_properties(
    libnode
    PROPERTIES IMPORTED_LOCATION
    ${CMAKE_SOURCE_DIR}/src/main/libnode/bin/${CMAKE_ANDROID_ARCH_ABI}/libnode.so)

add_library(
    native-lib
    SHARED
    src/main/cpp/native-lib.cpp)

target_link_libraries(
    native-lib
    libnode
    ${log-lib})

1 个答案:

答案 0 :(得分:0)

  • 需要使用 Android Studio 理解的构建 ID 构建共享库,将其添加到您的链接选项中:

"-Wl,--build-id=sha1"

(抱歉,我编辑 CMake 已经有一段时间了)。 有关构建 ID 的更多信息,请参见 NDK build maintainers' guide

  • 库的源代码需要由 Android Studio 编制索引,源根目录中的源代码的符号链接就足够了。例如在/src/main/cpp/myLib

  • 需要在库中内置的源和磁盘上的源之间进行 LLDB 映射。也就是说,如果库是在其他机器上构建的,并且符号对该机器是唯一的,则您需要“映射”符号,以便 LLDB 可以在您的机器上找到源。

    • 在 NDK 中找到共享库的构建三元组的 objdump,我的在 toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-objdump 中(在本例中它是 aarch64-linux-android,对于 arm64 库),在库上运行 objdump:< /li>

aarch64-linux-android-objdump -C -l -d myLib.so | grep \\.cpp

这将打印出调试符号何时/何地构建的路径。

  • 如果库是在 /a/b/c 文件夹中的机器上构建的,那么共享库中的所有相关符号都是 /a/b/c/myLib/src/myFile.cpp 形式,并且相同的文件位于您的机器在 /Studio/x/y/z/src/main/cpp/myLib/src/myFile.cpp,您需要创建一个从 /a/b/c/Studio/x/y/z/src/main/cpp

    的 LLDB 映射
    • 进入“运行”>“编辑配置”
    • 将调试器设置为混合(或仅原生)
    • 设置以下命令: settings append target.source-map /a/b/c /Studio/x/y/z/src/main/cpp

如果您使用的是 windows,只需将路径提供为 windows 路径,即使库是在 cygwin 或 bash 中构建的,也请完全按照 objdump 提供的路径复制路径。

相关问题