MAUI模板項目閃退問題
在MAUI
最初發布的時候就曾創建過幾個模板項目進行體驗過,沒遇到什么坑。由于最近需要開發針對餐飲行業的收銀機(安卓系統)開發一款應用,這種收銀機一般配置不咋滴,系統版本和性能也肯定比不上我們自己使用的手機。在做技術選型時首先想到了MAUI
,備選Flutter
,React Native
。都是大廠維護的跨平臺應用框架,在使用MAUI
框架時遇到新建的模板應用居然啟動時直接閃退,最終也是解決了這個閃退問題,遂分享下這一經歷。
創建項目
演示創建項目過程,所有流程都是IDE默認,不做任何修改。
新建MAUI模板項目
用VS新建MAUI
模板項目,如下
項目名也默認為
MauiApp1
連接設備
通過USB連接目標安卓設備
目標設備開啟開發者模式,然后開啟usb調試(自行百度必應/谷歌)
手機上切換usb調試的模式,一般會出現 僅充電,文件傳輸。。。,簡單粗暴地切換各種選項,當VS列出了你的設備就可以了。

調試項目
完成上一步的設備連接,直接在debug模式下啟動項目

等待一會,可以在設備上看到應用已經安裝了,按說應該會被自動打開,等了好久也沒動靜,VS的輸出窗口也不再有新的內容輸出了

手動點擊設備上的安裝好的MauiApp1
應用,然后剛看到啟動頁面一個大大的.NET標志,隨后來了個 Maui1已停止運行

解決閃退問題
以前也做過使用android studio
開發過原生安卓應用,一般這種問題都能在IDE有錯誤輸出,可以通過錯誤信息找到閃退原因。
回顧剛才這個問題,不知道去哪里查看日志,這該怎么去看閃退的原因呢,要是VS
能像android studio
那樣可以查看詳細的日志就好了,目前我還不知道是否有地方能看詳細的debug日志。我選擇了一種比較通用的排查錯誤的方式:adb
工具。
有關adb
不做介紹,讀者如有疑問自行百度必應/谷歌,你只需要知道他是用來調試安卓應用的一個強大工具即可。
下面的流程需要你將adb
目錄添加到環境變量PATH中,方可全局使用adb
命令。
常用命令
adb命令查看列出手機裝的所有 app 的包名:
adb?shell?pm?list?packages
列出系統應用的所有包名:
adb?shell?pm?list?packages?-s
列出除了系統應用的第三方應用包名:
adb?shell?pm?list?packages?-3
推測一個包中可能帶有的關鍵字:
adb?shell?dumpsys?activity?|?findstr?mFocusedActivity
清除應用數據與緩存
adb?shell?pm?clear?應用包名
查看日志
adb?logcat
V:詳細(最低優先級) D:調試 I:信息 W:警告 E:錯誤 F:嚴重 S:靜默(最高優先級,未曾輸出過任何內容)
找到我們要看的日志
確認adb能識別到你的設備
$?adb?devices
List?of?devices?attached
1234567890ABCDEF????????device
找出我們的包名
$?adb?shell?pm?list?packages?-3
....
package:com.landi.print.service
package:com.companyname.mauiapp1
....
包名為:com.companyname.mauiapp1
使用
logcat
直接運行adb logcat
能看到設備的所有日志,會對我們的排查造成干擾,我們只需要查看package:com.companyname.mauiapp1
的日志 可以使用grep
進行過濾,這個在在windows
的命令行工具都不支持,我使用的是GitBash
的shell
命令行工具,可以使用這一功能。
adb?logcat?|?grep?com.companyname.mauiapp1
這樣就只會輸出mauiapp1
的日志了。執行上面的命令后,點擊mauiapp1
應用圖標啟動應用,得到我們應用啟動到崩潰的所有日志如下:
06-16?10:21:11.953??1424??1424?D?Launcher2.2.10:?flow?not?clicked?com.companyname.mauiapp1crc64e632a077a20c694c.MainActivity
06-16?10:21:11.953??1424??1424?D?Launcher2.2.10:?flow?click?desktop?com.companyname.mauiapp1crc64e632a077a20c694c.MainActivity
06-16?10:21:11.953???424???466?I?ActivityManager:?START?u0?{act=android.intent.action.MAIN?flg=0x10200000?cmp=com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity}?from?uid?10072
06-16?10:21:11.958???424???466?E?ActivityManager:?getPackageFerformanceMode--ComponentInfo{com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity}----com.companyname.mauiapp1
06-16?10:21:11.967???424??1456?E?ActivityManager:?getPackageFerformanceMode--ComponentInfo{com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity}----com.companyname.mauiapp1
06-16?10:21:11.987???424??1456?I?ActivityManager:?Start?proc?19415:com.companyname.mauiapp1/u0a97?for?activity?com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity
06-16?10:21:12.173?19415?19415?D?debug-app-helper:?Checking?if?libmonodroid?was?unpacked?to?/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so
06-16?10:21:12.173?19415?19415?D?debug-app-helper:?Native?libs?extracted?to?/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm,?assuming?application/android:extractNativeLibs?==?true
06-16?10:21:12.173?19415?19415?D?debug-app-helper:?Added?filesystem?DSO?lookup?location:?/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm
06-16?10:21:12.173?19415?19415?W?debug-app-helper:?Using?runtime?path:?/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm
06-16?10:21:12.173?19415?19415?W?debug-app-helper:?checking?directory:?`/data/user/0/com.companyname.mauiapp1/files/.__override__/lib`
06-16?10:21:12.173?19415?19415?W?debug-app-helper:?directory?does?not?exist:?`/data/user/0/com.companyname.mauiapp1/files/.__override__/lib`
06-16?10:21:12.173?19415?19415?W?debug-app-helper:?Checking?whether?Mono?runtime?exists?at:?/data/user/0/com.companyname.mauiapp1/files/.__override__/libmonosgen-2.0.so
06-16?10:21:12.173?19415?19415?W?debug-app-helper:?Checking?whether?Mono?runtime?exists?at:?/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonosgen-2.0.so
06-16?10:21:12.173?19415?19415?I?debug-app-helper:?Mono?runtime?found?at:?/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonosgen-2.0.so
06-16?10:21:12.192?19415?19415?W?monodroid:?Creating?public?update?directory:?`/data/user/0/com.companyname.mauiapp1/files/.__override__`
06-16?10:21:12.198?19415?19415?F?monodroid:?No?assemblies?found?in?'/data/user/0/com.companyname.mauiapp1/files/.__override__'?or?'<unavailable>'.?Assuming?this?is?part?of?Fast?Deployment.?Exiting...
06-16?10:21:12.275?19433?19433?F?DEBUG???:?pid:?19415,?tid:?19415,?name:?nyname.mauiapp1??>>>?com.companyname.mauiapp1?<<<
06-16?10:21:12.284?19433?19433?F?DEBUG???:?Abort?message:?'No?assemblies?found?in?'/data/user/0/com.companyname.mauiapp1/files/.__override__'?or?'<unavailable>'.?Assuming?this?is?part?of?Fast?Deployment.?Exiting...'
06-16?10:21:12.288?19433?19433?F?DEBUG???:?????#01?pc?0001b08b??/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so?(xamarin::android::internal::MonodroidRuntime::create_domain(_JNIEnv*,?xamarin::android::jstring_array_wrapper&,?bool,?bool)+282)
06-16?10:21:12.288?19433?19433?F?DEBUG???:?????#02?pc?0001c08f??/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so?(xamarin::android::internal::MonodroidRuntime::create_and_initialize_domain(_JNIEnv*,?_jclass*,?xamarin::android::jstring_array_wrapper&,?xamarin::android::jstring_array_wrapper&,?_jobjectArray*,?xamarin::android::jstring_array_wrapper&,?_jobject*,?bool,?bool,?bool)+26)
06-16?10:21:12.288?19433?19433?F?DEBUG???:?????#03?pc?0001d2c5??/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so?(xamarin::android::internal::MonodroidRuntime::Java_mono_android_Runtime_initInternal(_JNIEnv*,?_jclass*,?_jstring*,?_jobjectArray*,?_jstring*,?_jobjectArray*,?_jobject*,?_jobjectArray*,?int,?unsigned?char,?unsigned?char)+4020)
06-16?10:21:12.288?19433?19433?F?DEBUG???:?????#04?pc?0001d55f??/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/lib/arm/libmonodroid.so?(Java_mono_android_Runtime_initInternal+50)
06-16?10:21:12.288?19433?19433?F?DEBUG???:?????#05?pc?0005282f??/data/app/com.companyname.mauiapp1-Wpq5srmqUiNM5498jRmH8Q==/oat/arm/base.odex?(offset?0x2e000)
06-16?10:21:12.905???424?19434?W?ActivityManager:???Force?finishing?activity?com.companyname.mauiapp1/crc64e632a077a20c694c.MainActivity
06-16?10:21:12.916???424???451?I?ActivityManager:?Showing?crash?dialog?for?package?com.companyname.mauiapp1?u0
06-16?10:21:12.976???424???877?I?ActivityManager:?Process?com.companyname.mauiapp1?(pid?19415)?has?died:?fore?TOP
我們只關注日志級別為F
,E
的即可:下面錯誤信息說明了程序掛掉的原因
06-16?10:21:12.198?19415?19415?F?monodroid:?No?assemblies?found?in?'/data/user/0/com.companyname.mauiapp1/files/.__override__'?or?'<unavailable>'.?Assuming?this?is?part?of?Fast?Deployment.?Exiting...
06-16?10:21:12.275?19433?19433?F?DEBUG???:?pid:?19415,?tid:?19415,?name:?nyname.mauiapp1??>>>?com.companyname.mauiapp1?<<<
06-16?10:21:12.284?19433?19433?F?DEBUG???:?Abort?message:?'No?assemblies?found?in?'/data/user/0/com.companyname.mauiapp1/files/.__override__'?or?'<unavailable>'.?Assuming?this?is?part?of?Fast?Deployment.?Exiting...'
接下來就可以發揮我們程序員的重要技能之一:百度谷歌,能不能搜索正確的答案就看造化了。
看來筆者有點東西,谷歌到了一個類似的案例:https://stackoverflow.com/questions/42336546/xamarin-android-application-crashed-after-clear-data-in-settings
有興趣的去深究下,這里xamarin
的解決辦法是關閉 Use Fast Deployment
修改項目配置
經過仔細查看屬性配置文件,找到這個配置與
stackoverflow
的上說的關閉 Use Fast Deployment
極其相似,應該就是它了,關閉它再次使用VS
以debug模式啟動項目。
這次經過稍微漫長的過程,也執行到Found device: 1234567890ABCDEF
不動了

手動打開App,沒任何效果。
卸載Mauiapp1
重試
雖然上一步改了沒效果,但我堅信應該就是這樣,所以卸載app再試試,排除干擾因素。

Found device: 1234567890ABCDEF
之后不再卡住不動了 隨后我的設備上也安裝并自動打開了Mauiapp1
,并且沒有閃退!