MAUI模板專案閃退問題
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...'
接下來就可以發揮我們程式設計師的重要技能之一:
谷歌,能不能搜尋正確的答案就看造化了。
看來筆者有點東西,谷歌到了一個類似的案例:
http://stackoverflow.com/que... 有興趣的去深究下,這裡 xamarin
的解決辦法是關閉 Use Fast Deployment
修改專案配置
經過仔細檢視屬性配置檔案,找到這個配置與 stackoverflow
的上說的關閉 Use Fast Deployment
極其相似,應該就是它了,關閉它再次使用 VS
以debug模式啟動專案。
這次經過稍微漫長的過程,也執行到 Found device: 1234567890ABCDEF
不動了
手動開啟App,沒任何效果。
解除安裝 Mauiapp1
重試
雖然上一步改了沒效果,但我堅信應該就是這樣,所以解除安裝app再試試,排除干擾因素。
Found device: 1234567890ABCDEF
之後不在卡住不動了
隨後我的裝置上也安裝並自動打開了 Mauiapp1
, 並且沒有閃退!
本文由mdnice多平臺釋出
- 不要在 Python 中使用迴圈,這些方法其實更棒!
- 分享 6 個 Vue3 開發必備的 VSCode 外掛
- 微服務架構的外部 API 整合模式
- 前端該如何優雅地 Mock 資料
- 微服務架構的通訊設計模式
- 我做了一個線上白板(二)
- 3 款非常實用的 Node.js 版本管理工具
- 636. 函式的獨佔時間 : 簡單棧運用模擬題
- TCP 學習筆記(三) 可靠傳輸
- 一文讀懂微服務架構的分解設計
- Python中常用最神祕的函式! lambda 函式深度總結!
- 技術分享| 小程式實現音影片通話
- Birdseye 極其強大的Python除錯工具
- Android技術分享| 影片通話開發流程(一)
- 細胞影象資料的主動學習
- React報錯之Cannot find name
- 智慧合約安全——私有資料訪問
- 30 個數據工程必備的Python 包
- 萬字長文Python面試題,建議先收藏
- 6個可解釋AI (XAI)的Python框架推薦