日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置

發布時間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

綜述

Flutter從架構上來說有3部分:

  • 用Dart寫的Framework層,面向開發者
  • 用Java/Kotlin寫的Embdder層(For Android,iOS是OC/Swift),純Flutter App不需要關心
  • 用C++寫的Engine層,提供Dart運行環境和底層繪制能力

針對每個部分,對應的源碼閱讀環境不同,調試方法也不同。

對于閱讀環境,最重要的是能夠正確地完成調用/定義的跳轉

對于調試環境,最重要的是能夠設置斷點,單步執行

Framework環境配置

Framework的環境設置比較簡單。

源碼閱讀

Framework的代碼在 https://github.com/flutter/flutter 下面,直接Clone下來。

親測安裝了Flutter插件的Android Studio是最好的閱讀工具,直接打開./packages/flutter 目錄,然后flutter pub get即可。

這一步可能報錯,主要是一些的版本沖突,按照信息解決即可。

源碼調試

通過Flutter Acttach按鈕即可開始調試,但是如果要調試啟動部分的Dart代碼,用Debug而不是Run來啟動程序:

Embedder環境配置

Embedder的環境稍微復雜一點。

源碼閱讀

Embedder的代碼在engine的./shell/platform下面:

tree?-L?1
.
├──?BUILD.gn
├──?android
├──?common
├──?config.gni
├──?darwin
├──?embedder
├──?fuchsia
├──?glfw
├──?linux
└──?windows

用AS直接打開android目錄即可,打開后會發現代碼都無法解析對,這樣就沒法跳轉了!!!

首先把根目錄設置為Source類型:

這時候只剩androidx無法解析了:

發現旁邊一個目錄已經聲明了依賴,于是按照提示,建立一個local.properties文件,指出本地sdk路徑即可,然后執行Gradle命令,拉取更新:

后來查看文檔,發現其實另外一個目錄已經有這些依賴了,直接在工程設置頁面添加一個classpath即可:

../third_party/android_embedding_dependencies/

這個目錄是在engine外,buildroot下的,應該是之前gclient sync的時候就解析build.gradle拉下來的。

源碼調試

如果在打開Flutter的工程,打開Andorid的Activity是解析錯誤的:

需要以android作為根目錄單獨打開,然后通過Run/Debug按鈕再次啟動即可:

這里單獨打開工程無需擔心如何集成Flutter,gradle腳本已經搞定了。

Engine環境配置

Engine的配置是最復雜的。

源碼閱讀

把gn工具在src/out 目錄生成的compile_commands.json文件移到src/flutter目錄下,然后用CLion打開這個文件就可以正確索引Engine的C++代碼了。

該文件是預編譯生成的索引,其他編輯器也可以支持,當然用CLion是最方便的。

源碼調試

官方提供了gdb的調試方法,但是沒有文檔,按照代碼注釋的文檔,也無法運行成功,一直報下面的錯誤:

Could?not?find?platform?independent?libraries?
Could?not?find?platform?dependent?libraries?
Consider?setting?$PYTHONHOME?to?[:]
ImportError:?No?module?named?site

看到網上有人已經在用lldb調試了,于是也按照這個思路成功了,

首先是把Android SDK的lldb-server push到設備,建立一個信道,通過run-as繞過權限問題:

#?注意換成自己的包名
adb?push?lldb-server?/data/local/tmp/lldb-server

adb?shell?run-as?com.example.flutter_demo?\
cp?-F?/data/local/tmp/lldb-server?/data/data/com.example.flutter_demo/lldb-server

adb?shell?run-as?com.example.flutter_demo?\
chmod?a+x?/data/data/com.example.flutter_demo/lldb-server

adb?shell?"run-as?com.example.flutter_demo?sh?-c?'/data/data/com.example.flutter_demo/lldb-server?platform?--server?--listen?unix-abstract:///data/data/com.example.flutter_demo/debug.socket'"

通過以上幾步已經建立可以調試的通道了,然后啟動lldb,attach到指定進程(通過進程id),然后添加符號表:

adb?shell?pidof?com.example.flutter_demo
lldb
(下面是lldb環境)
(lldb)?platform?select?remote-android
(lldb)?process?attach?-p?25382
(lldb)?add-dsym?~/WorkProject/flutter_source_code/src/out/android_debug_unopt_arm64/libflutter.so

之前就注意到構建目錄下的這個so非常大,打包的so不過10M,這個接近300M,應該是存在大量調試信息。

這里有兩個坑:

  • lldb進去之后,進程會掛起,必須用c/continue來恢復,不然無法觸發邏輯,也就無法觸發斷點
  • 必須在System.loadLibrary之后才能添加符號表,否則失敗,如果還是失敗,就把以上流程重試一遍~
  • 如此,便可以開始調試了,下面演示在幀刷新位置設置斷點,然后觸發:

    總結

    以上便是Flutter源碼閱讀/調試環境的搭建,欲善其事,先利其器,后面就要開始真刀真槍擼源碼了。

    參考

    • engine/flutter_gdb at master · flutter/engine
    • Debugging the engine · flutter/flutter Wiki
    • Debugging Flutter apps - Flutter
    • Debugging Flutter apps programmatically - Flutter
    • Using an OEM debugger - Flutter
    • 如何調試Android Native Framework
    • Flutter Engine C++ 源碼調試初探
    • Android 調試橋 (adb) ?|? Android 開發者 ?|? Android Developers

    總結

    以上是生活随笔為你收集整理的flutter 真机无法调试 sdk报错_Flutter源码剖析(二):源码的阅读与调试环境配置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。