[英]Debug a dynamically loaded native library in Android Studio?
我有一個看起來像這樣的項目:
- 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
IE。 構建區域中的實際庫。
lldb 似乎出於某種原因不使用本地應用程序版本。
知道什么會導致這種情況嗎?
事實證明這是由於AS中的舊錯誤。 顯然在過去,IML文件中“native-android-gradle”部分中的“SELECTED_BUILD_VARIANT”可能與實際選擇的風格不一致。 這導致無法加載.so文件。
一旦糾正,這個值現在似乎仍然是最新的,以下是對(現在修復的)bug的討論的鏈接:
https://issuetracker.google.com/issues/37114841
從我所知,項目同步也可以解決問題(它不適合我)。
我有一個類似的問題,我無法調試動態加載的本機庫。 事實證明,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相關。
緩存無效並重新啟動。 為我工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.