调试Android Studio中动态加载的本机库

Debug a dynamically loaded native library in Android Studio?

本文关键字:本机 加载 动态 Android Studio 调试      更新时间:2023-10-16

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

- 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:UsersME.lldbmodule_cacheremote-android.cache8D1C60AA-E947-56CA-CBA5-0AA7A46B955E-73E37532libname.so

(即。

虽然我可以调试的那个,但显示在:

C:...projectappbuildintermediatescmakedebugobjx86libname.so

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

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

任何想法会导致什么?

这是由于AS中的一个旧错误造成的。显然,在过去,IML文件中的"本机android-Gradle"部分中的" Selected_build_variant"可能会随着实际选择的风味而逐步发展。这导致未能加载.so文件。

一旦纠正,此值似乎现在保持最新状态,以下是(现在固定(错误的讨论的链接:

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

从我可以看出的是,一个项目同步 May 也可以解决该问题(对我来说不是(。

我也有一个类似的问题,我无法调试动态加载的本机库。事实证明,在将Android构建系统的条纹调试信息从我的库中放入APK之前。当我意识到我的300MB库一旦在APK中打包到30MB时,我就变得很清楚。

您可以使用Android Gradle包装选项来禁用该行为。将类似的内容添加到您的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。

上相关的

无效的缓存和重新启动。为我工作。