【问题标题】:Debug a dynamically loaded native library in Android Studio?在 Android Studio 中调试动态加载的本机库?
【发布时间】:2017-09-20 02:46:55
【问题描述】:

我有一个看起来像这样的项目:

- project
    - app
       - src.../cpp/
       - src.../java/
    - other modules...

cpp代码是在build.gradle中使用cmake构建的:

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

buildTypes {
   ...
    debug {
        debuggable true
        jniDebuggable true
        externalNativeBuild {
            cmake {
                arguments "-DCMAKE_BUILD_TYPE=Debug"
                abiFilters "armeabi-v7a", "armeabi", "x86"
            }
        }
    }
}

productFlavors {
    ...
    experimental {
        externalNativeBuild {
            cmake {
                targets "sqlite_gcd_func"
            }
        }
    }
}

CMakeLists.txt 在哪里:

cmake_minimum_required(VERSION 3.6)

add_library( # Specifies the name of the library.
         sqlite_gcd_func
         # Sets the library as a shared library.
         MODULE
         # Provides a relative path to your source file(s).
         src/Experimental/cpp/GreatCircleDistance.cpp )
# Specifies a path to native header files.
include_directories(src/Experimental/cpp/include/)

生成的 .so 库作为扩展通过 SQL 加载到 SQLite 中:

Select load_extension('libsqlite_gcd_func', null)

之后库中定义的函数可用于 SQL 查询。

这一切都有效。

调试什么不起作用; CPP 代码中设置的断点不会触发。

我认为这是因为代码是在运行时动态加载的;我也尝试过使用java直接加载模块:

java.lang.System.loadLibrary("sqlite_gcd_func");

但是断点仍然不起作用。

我对 lldb 的了解很少;我假设我需要告诉它加载的模块(通过 lldb 中的“图像列表”可见)是一个已知模块,但不知道如何这样做(如果这甚至是问题)。

任何帮助告诉 gradle/lldb/Android Studio 如何调试此代码将不胜感激!

编辑:

我用类似的设置创建了一个更简单的项目,它是可调试的。在不可调试的情况下,当我进入 lldb 并运行“图像列表”时,有问题的 .so 显示如下:

C:\Users\ME\.lldb\module_cache\remote-android\.cache\8D1C60AA-E947-56CA-CBA5-0AA7A46B955E-73E37532\libname.so

(即看起来像是从 AVD 复制的版本)。

而在我可以调试的那个中,它显示在:

C:\...\project\app\build\intermediates\cmake\debug\obj\x86\libname.so

即。构建区域中的实际库。

lldb 似乎出于某种原因不使用本地应用程序版本。

知道是什么原因造成的吗?

【问题讨论】:

    标签: android c++ gradle cmake lldb


    【解决方案1】:

    事实证明,这是由于 AS 中的一个旧错误造成的。显然,在过去,IML 文件中“native-android-gradle”部分中的“SELECTED_BUILD_VARIANT”可能与实际选择的风格不一致。这导致无法加载 .so 文件。

    一旦更正,这个值现在似乎仍然是最新的,以下是讨论(现已修复)错误的链接:

    https://issuetracker.google.com/issues/37114841

    据我所知,项目同步可能也可以解决问题(它不适合我)。

    【讨论】:

    • 谢谢!为我工作!这个问题也存在于 Android Studio Preview 3.0 beta6 中,在 AS 中更改构建变体后,在 yourapp.iml 我正在运行 devDebug,但 value = testDebug,保持不变。将构建变体更改为 testDebug 并运行它后,本机中的调试器开始工作
    【解决方案2】:

    我遇到了一个类似的问题,我无法调试动态加载的本机库。事实证明,Android 构建系统在将我的库中的调试信息放入 APK 之前对其进行了条带化​​。当我意识到我的 300MB 库在打包到 APK 后缩小到 30MB 时,我就明白了。

    您可以使用Android Gradle Packaging Options 禁用该行为。 将类似的内容添加到您的 build.gradle 文件中:

    android {
        packagingOptions {
        // By default .so libraries are striped from debug information when creating APK
        // To prevent this make sure your .so files are matching that doNotStrip pattern
        // See Gradle pattern document for details:
        // https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/util/PatternFilterable.html
        doNotStrip "**"
        }
    }
    

    这与 Android Studio 2.3.3 相关。

    【讨论】:

      【解决方案3】:

      缓存无效并重新启动。对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        相关资源
        最近更新 更多