本部落格所有文章除特別宣告外,均採用CC BY-NC-SA 4.0許可協議。轉載請註明來自 唯你
背景
在 Rust 中,使用 println!列印日誌時,輸出實際上是傳送到標準輸出(stdout),而 Android Logcat 專門用於處理和顯示應用程式的日誌資訊,此環境下標準輸出實現被重新定義。這意味著 Rust 日誌輸出不會出現在 Logcat 中。
android_logger直接與 Android 的日誌系統整合,確保日誌資訊可以按預期出現在 Logcat 中。
配置
android_logger 使用如下
注意這裡使用的是 android_logger0.11.0 版本,若使用最新版本可能需要做相關 api 調整。
cargo.toml 中增加如下依賴
[dependencies]
log = "0.4"
[target.'cfg(target_os = "android")'.dependencies]
android_logger = "0.11.0"
同時引入 log 的原因:
- log 是一個日誌記錄的抽象庫,提供了一套統一的介面,用於記錄日誌訊息(如 info!、warn!、error! 等)。而 android_logger 是 log 針對 android 平臺的一種具體實現。
- 雖然 android_logger 本身依賴 log,你或許以為不必再額外引用 log,但實際上 android_logger 中類似 log::LevelFilter 和 log::Level::Debug 依然依賴 log 庫。
初始化
#[cfg(target_os = "android")]
fn init_logging() {
android_logger::init_once(
android_logger::Config::default()
.with_min_level(log::Level::Debug)
.with_tag("flutter"),
);
}
注意此處 with_min_level 級別,若為 debug 則列印時最使用必須是 debug 及以上,用 info 基本是無法列印顯示在 logcat 中的
使用
rust 檔案使用如下
extern crate android_logger;
新增列印
impl PlatformTextureWithProvider for BoxedPixelData {
fn create_texture(
engine_handle: i64,
payload_provider: Arc<dyn PayloadProvider<Self>>,
) -> Result<PlatformTexture<BoxedPixelData>> {
//使用示例
log::debug!("2222222223 create_texture");
log::debug!("this is a debug {}", "raynor");
PlatformTexture::new(engine_handle, Some(payload_provider))
}
}
連線 android 裝置執行 flutter run 後,logcat 日誌輸出如下:
√ Built build\app\outputs\flutter-apk\app-debug.apk
Installing build\app\outputs\flutter-apk\app-debug.apk... 6.3s
W/FlutterAnimationAdvance( 3237): FlutterAnimationAdvance getInstance()
D/flutter ( 3237): irondash_texture::platform::platform_impl: 2222222223 create_texture
D/flutter ( 3237): irondash_texture::platform::platform_impl: this is a debug raynor
注意
因為每次執行都會重新編譯庫檔案,沒必要在 rust 中每次修改日誌後執行 cargo clean。 直接執行對於平臺支援命令(如 flutter 的話 flutter run)即可看到修改後日誌生效輸出,。