簡體   English   中英

在 Android Studio 中調試動態加載的本機庫?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM