一個智能,可靠且高度可自定義的調試菜單庫,用於支持屏幕錄製,網絡活動記錄,生成錯誤報告以及許多其他有用功能。
克隆此存儲庫,選擇一個構建變體並運行應用程序配置。它應該看起來像這樣:
該演示應用程序還包含有關如何設置Beagle以及如何實現正在展示的各種功能的說明。如果您有興趣在項目中使用庫,則絕對應該考慮嘗試一下。如果您不想自己構建它,也可以從Play商店下載它:
應用程序中的教程涵蓋了此讀數中的所有內容,但更詳細地說明了。本文的另一種了解可以通過庫可以實現的方法,該文章提出了可以用Beagle解決的各種問題。
如果下面的文本牆對於您的口味來說太長,請查看包含您需要使用的所有代碼的要點。否則,讓我們逐步進行:
確保以下是項目級構建的一部分。gradle文件:
allprojects {
repositories {
…
mavenCentral()
}
}
調試菜單的實際UI可以通過多種方式顯示,這是由依賴項的後綴指定的。存在以下版本:
DebugMenuView
是您的責任(不建議:搖動打開, Beagle.show()
, Beagle.hide()
,相關的VisibilityListener
,以及插圖處理邏輯將無法奏效)。因此,例如,如果您喜歡抽屜UI,則需要將以下內容添加到您的app-level build.gradle文件中(查看最新版本的代碼段下方的小部件):
dependencies {
…
def beagleVersion = " 2.9.8 "
debugImplementation " io.github.pandulapeter.beagle:ui-drawer: $b eagleVersion "
releaseImplementation " io.github.pandulapeter.beagle:noop: $b eagleVersion "
}
最新版本是:
注意:對於抽屜UI,如果您已經覆蓋了Activity
的onBackPressed()
方法,則可能會注意到默認的後背導航處理並不總是按預期工作。為了解決此問題,在每個Activity
的onBackPressed()
中,您應該檢查Beagle.hide()
在執行其他檢查或調用超級實現之前返回false。
只有一行代碼,最好是在Application
的onCreate()
方法中:
Beagle .initialize( this )
您可以選擇地將以下參數添加到此功能:
themeResourceId
屬性為“調試菜單”指定一個自定義主題,以防Application
/ Activity
使用的屬性不合適。注意:建議擴展.NoActionBar
材料主題。默認情況下,您可以通過搖動設備來獲取Beagle。
在此之後,應該提供許多模塊,但是可以隨時更改此配置(來自任何線程),並且UI將自動更新。這樣做的最簡單方法是致電:
Beagle .set(module1, module2, …)
在這一點上,您應該知道兩個選擇:
查看Showcase應用程序,以獲取一些有關內置模塊或可以用於預覽任何模塊配置並為其生成代碼的交互式工具的想法。本文是一些可能性的視覺指南。
這是一個最小的例子,應該適用於大多數項目:
Beagle .set(
HeaderModule (
title = getString( R .string.app_name),
subtitle = BuildConfig . APPLICATION_ID ,
text = " ${ BuildConfig . BUILD_TYPE } v ${ BuildConfig . VERSION_NAME } ( ${ BuildConfig . VERSION_CODE } ) "
),
AppInfoButtonModule (),
DeveloperOptionsButtonModule (),
PaddingModule (),
TextModule ( " General " , TextModule . Type . SECTION_HEADER ),
KeylineOverlaySwitchModule (),
AnimationDurationSwitchModule (),
ScreenCaptureToolboxModule (),
DividerModule (),
TextModule ( " Logs " , TextModule . Type . SECTION_HEADER ),
NetworkLogListModule (), // Might require additional setup, see below
LogListModule (), // Might require additional setup, see below
LifecycleLogListModule (),
DividerModule (),
TextModule ( " Other " , TextModule . Type . SECTION_HEADER ),
DeviceInfoModule (),
BugReportButtonModule ()
)
如果您需要添加臨時模塊, Beagle.add()
具有可選的lifecycleOwner
參數,該參數一旦提供的生命週期結束後自動刪除指定的模塊。使用模塊ID-S手動調用Beagle.remove()
也是一個選項。
雖然調用Beagle.log()
是將項目添加到LogListModule的最簡單方法,但需要特殊的解決方法才能從純Kotlin模塊訪問此功能。另一個頻繁的用例是與木材集成。
要訪問Beagle.log()
從純Kotlin / Java模塊提供的相同功能,首先,您需要將以下內容添加到所討論的模塊:
dependencies {
…
api " io.github.pandulapeter.beagle:log: $b eagleVersion "
// Alternative for Android modules:
// debugApi "io.github.pandulapeter.beagle:log:$beagleVersion"
// releaseApi "io.github.pandulapeter.beagle:log-noop:$beagleVersion"
}
這些庫提供了BeagleLogger
對象,該對像在Application
類中初始化時需要連接到主庫:
Beagle .initialize(
…
behavior = Behavior (
…
logBehavior = Behavior . LogBehavior (
loggers = listOf ( BeagleLogger ),
…
)
)
)
要添加日誌消息,現在您可以調用以下內容:
BeagleLogger .log(…)
消息列表將與使用常規Beagle.log()
函數記錄的消息列表合併(除非它們被標籤過濾),並且可以使用loglistModule顯示。如果您無法訪問BeagleLogger.clearLogEntries()
也可以使用Beagle.clearLogEntries()
。
要自動將帶有木材記錄的事件添加到調試菜單中,種植一棵特殊樹是最簡單的解決方案:
Timber .plant(
object : Timber . Tree () {
override fun log ( priority : Int , tag : String? , message : String , t : Throwable ? ) =
Beagle .log( " [ $tag ] $message " , " Timber " , t?.stackTraceToString())
}
)
要創建僅顯示這些日誌的特殊LogListModule,只需將模塊的標籤構造函數參數設置為“木材”。
不將網絡攔截器與主庫捆綁在一起主要是為了提供不使用Android SDK的純kotlin依賴性,類似於上述記錄解決方案。目前,Beagle只能將其連接到OKHTTP網絡庫中以提供網絡loglistModule的內容,但是手動調用Beagle.logNetworkEvent()
始終是一個選項。
將以下內容添加到實現網絡邏輯的模塊中:
dependencies {
…
api " io.github.pandulapeter.beagle:log-okhttp: $b eagleVersion "
// Alternative for Android modules:
// debugApi "io.github.pandulapeter.beagle:log-okhttp:$beagleVersion"
// releaseApi "io.github.pandulapeter.beagle:log-okhttp-noop:$beagleVersion"
}
這將介紹首先需要連接到主庫的BeagleOkHttpLogger
對象,該對像是初始化的那一刻:
Beagle .initialize(
…
behavior = Behavior (
…
networkLogBehavior = Behavior . NetworkLogBehavior (
networkLoggers = listOf ( BeagleOkHttpLogger ),
…
)
)
)
最後一步是設置Interceptor
(尷尬的鑄造是為了確保NOOP實現在仍然擁有相同的公共API的同時什麼都不做):
val client = OkHttpClient . Builder ()
…
. apply { ( BeagleOkHttpLogger .logger as ? Interceptor ? )?. let { addInterceptor(it) } }
.build()
圖書館可以攔截未取消的例外,並在對話框中顯示其堆棧跟踪。用戶將能夠使用自動打開的錯誤報告屏幕共享崩潰報告。通過單獨的依賴項來實現此功能,該功能應添加到主模塊(初始化Beagle):
dependencies {
…
debugImplementation " io.github.pandulapeter.beagle:log-crash: $b eagleVersion "
releaseImplementation " io.github.pandulapeter.beagle:log-crash-noop: $b eagleVersion "
}
添加依賴關係後,新引入的BeagleCrashLogger
對象應連接到主庫:
Beagle .initialize(
…
behavior = Behavior (
…
bugReportingBehavior = Behavior . BugReportingBehavior (
crashLoggers = listOf ( BeagleCrashLogger ),
…
)
)
)
與其他崩潰報告解決方案同時使用此功能可能是不可靠的。
另外,請注意,通過引入log-crash
依賴關係,Beagle的錯誤報告活動現在將在單獨的過程中運行(例如,Firebase需要對多進程應用程序進行特殊的初始化調用)。
每個公共工件的noop
實現是不包括與Beagle相關的邏輯中的默認方法。儘管對於大多數項目來說,這應該足夠好,但是可以通過為調試菜單創建單獨的包裝器模塊來改進它。這意味著將每個呼叫的呼叫隱藏在一個接口後面,該接口在發行版中具有空的實現。這種方法有其自身的好處和缺點:
noop
偽像Application
類中調用initialize()
函數,並在清單中正確註冊該類FragmentActivity
(例如, AppCompatActivity
是一個不錯的選擇)。提防,如果您使用的是Android Studio的Empty Compose Activity
模板,則必須更改默認的父類!默認情況下,Beagle使用當前Activity
的主題。但是,它需要一個材料主題才能起作用,因此,如果您發現未找到各種主題屬性引起的崩潰,請用themeResourceId
屬性覆蓋調試菜單的主題。
Beagle通過在每個Activity
的佈局上添加Fragment
來起作用。有時這是不必要的,也不可能。儘管庫帶有排除Activity
包名稱的列表,但您可以在需要時使用shouldAddDebugMenu
lambda屬性,在初始化期間提供的行為實例的屬性。
為初始化過程中提供的外觀實例的themeResourceId
屬性設置一個.NoActionBar
材料主題。
所有公共功能均記錄在KDOC中。 BeagleContract文件是學習所有內置功能的良好開始。有關各個模塊的信息,請參見相關的類標題。
如果您對引擎蓋下的內容感興趣,則在導航源代碼時,本文檔可能會有所幫助。
查看每個版本的更改版本頁面。
該庫使用語義版本操作: Major.minor.patch ,其中補丁更改僅包含錯誤修復,次要更改添加了新功能和主要更改將為API引入破壞修改。
查看“問題”頁面,以獲取已知問題列表以及庫的計劃增強。
如果您發現一個錯誤或有任何疑問 /功能請求,請隨時打開新問題!
如果您發現我的作品有用並正在考慮進行少量捐款,那麼Showcase應用程序的大約部分可以選擇您這樣做。提前致謝!
Copyright 2022 Pandula Péter
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.