首页 > 数据库 > 数据库开发技术 > [精彩总结] ???Rust 移动端开发体验
android ndk rs的例子,可以查看examples/android_previewcargo apk run -p ezlog_android_preview
Compiling ezlog v0.1.2 (ezlog/ezlog-core)
Compiling ezlog_android_preview v0.1.0 (ezlog/examples/android_preview)
Finished dev [unoptimized + debuginfo] target(s) in 2.39s
'lib/arm64-v8a/libezlog_android_preview.so'...
Verifying alignment of ezlog/target/debug/apk/ezlog_android_preview.apk (4)...
49 AndroidManifest.xml (OK - compressed)
1020 lib/arm64-v8a/libezlog_android_preview.so (OK)
Verification succesful
Performing Incremental InstallServing...
All files should be loaded. Notifying the device.SuccessInstall command complete in 949 msStarting: Intent { act=android.intent.action.MAIN cmp=rust.ezlog_android_preview/android.app.NativeActivity }
├── android
│ ├── app # android 示例工程│ └── lib-ezlog # EZLog android 库├── examples # rust 示例├── ezlog-cli # 命令行工具├── ezlog-core # 核心库├── ios
│ ├── EZLog # EZLog iOS 库│ ├── demo # iOS 示例工程│ └── framework # EZLog XCFramework
ios/b_ios.sh脚本。Unmanaged, @escaping,@convention,UnsafePointer,UnsafeBufferPointer, UnsafeMutableRawPointer 折磨许久之后,终于可以在 Swift 中拿到 Rust 的回调了。impl<'a: 'b, 'b> Drop for JavaStr<'a, 'b> { fn drop(&mut self) { match self.env.release_string_utf_chars(self.obj, self.internal) { Ok(()) => {} Err(e) => warn!("error dropping java str: {}", e),
}
}
}

| EZLog(0.1.2) | EZLog(with backtrace) | XLog(1.2.5) | XLog(with libc++) | Logan(1.2.4) | |
|---|---|---|---|---|---|
| so 大小 | 370.6KB | 451.6KB | 277.1KB | 537KB | 27.5KB |
#[cfg(not(feature = "backtrace"))]fn hook_panic() {
std::panic::set_hook(Box::new(|p| {
event!(panic & format!("ezlog: \n {p:?}"));
}));
}
PanicInfo { payload: Any { .. }, message: Some(asdf), location: Location { file: "ezlog-core/src/lib.rs", line: 119, col: 5 },
#[cfg(feature = "backtrace")]fn hook_panic() {
std::panic::set_hook(Box::new(|p| { let bt = Backtrace::new();
event!(panic & format!("ezlog: \n {p:?} \n{bt:?} \n"));
}));
}
PanicInfo { payload: Any { .. }, message: Some(asdf), location: Location { file: "ezlog-core/src/lib.rs", line: 119, col: 5 }, can_unwind: true } 0: backtrace::backtrace::trace_unsynchronized 1: backtrace::backtrace::trace 2: backtrace::capture::Backtrace::create 3: backtrace::capture::Backtrace::new 4: ezlog::init::{{closure}} 5: std::panicking::rust_panic_with_hook 6: std::panicking::begin_panic_handler::{{closure}} 7: std::sys_common::backtrace::__rust_end_short_backtrace 8: _rust_begin_unwind 9: core::panicking::panic_fmt 10: ezlog::init 11: _ezlog_init 12: _$s5EZLog18ezlogInitWithTraceyyF 13: _$s4demo7DemoAppVACycfC 14: _$s4demo7DemoAppV7SwiftUI0C0AadEPxycfCTW 15: <unknown> 16: _$s4demo7DemoAppV5$mainyyFZ 17: _main
PanicInfo { payload: Any { .. }, message: Some(asdf), location: Location { file: "ezlog-core/src/lib.rs", line: 119, col: 5 }, can_unwind: true }
0: <unknown>
1: <unknown>
2: <unknown>
3: <unknown>
4: <unknown>
5: <unknown>
6: <unknown>
7: Java_wtf_s1_ezlog_EZLog_init
8: art_quick_generic_jni_trampoline
9: art_quick_invoke_static_stub10: _ZN3art11interpreter34ArtInterpreterToCompiledCodeBridgeEPNS_6ThreadEPNS_9ArtMethodEPNS_11ShadowFrameEtPNS_6JValueE11: _ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE12: MterpInvokeStatic13: mterp_op_invoke_static14: _ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEbb.llvm.335106805463763666415: _ZN3art11interpreter33ArtInterpreterToInterpreterBridgeEPNS_6ThreadERKNS_20CodeItemDataAccessorEPNS_11ShadowFrameEPNS_6JValueE16: _ZN3art11interpreter6DoCallILb0ELb0EEEbPNS_9ArtMethodEPNS_6ThreadERNS_11ShadowFrameEPKNS_11InstructionEtPNS_6JValueE17: MterpInvokeStatic18: mterp_op_invoke_static19: _ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEbb.llvm.335106805463763666420: _ZN3art11interpreter33ArtInterpreterToInterpreterBridgeEPNS_6ThreadERKNS_20CodeItemDataAccessorEPNS_11ShadowFrameEPNS_6JValueE
2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: Build fingerprint: 'google/flame/flame:12/SP2A.220305.012/8177914:user/release-keys'2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: Revision: 'MP1.0'2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: ABI: 'arm64'2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: Timestamp: 2022-07-07 15:25:50.559643355+08002022-07-07 15:25:50.712 14141-14141/? A/DEBUG: Process uptime: 0s2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: Cmdline: wtf.s1.ezlog.demo2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: pid: 14112, tid: 14112, name: f.s1.ezlog.demo >>> wtf.s1.ezlog.demo <<<2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: uid: 102872022-07-07 15:25:50.712 14141-14141/? A/DEBUG: signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x0 0000000000000000 x1 0000000000003720 x2 0000000000000006 x3 0000007fc9d511202022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x4 00000000ebad808a x5 00000000ebad808a x6 00000000ebad808a x7 00000000ebad808b2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x8 00000000000000f0 x9 f7d7529acf61ddf5 x10 0000000000000000 x11 ffffff80fffffbdf2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x12 0000000000000001 x13 0000007fc9d50fe8 x14 0000000000000000 x15 00000000000000082022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x16 0000007b425b6050 x17 0000007b42592db0 x18 0000007b523fa000 x19 00000000000037202022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x20 0000000000003720 x21 00000000ffffffff x22 0000000000000001 x23 00000000000000012022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x24 000000782576bad8 x25 00000078256bb708 x26 000000000000000b x27 0000007b515530002022-07-07 15:25:50.712 14141-14141/? A/DEBUG: x28 0000007fc9d514a0 x29 0000007fc9d511a02022-07-07 15:25:50.712 14141-14141/? A/DEBUG: lr 0000007b42545aa0 sp 0000007fc9d51100 pc 0000007b42545acc pst 00000000000000002022-07-07 15:25:50.712 14141-14141/? A/DEBUG: backtrace:2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #00 pc 000000000004facc /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: cd7952cb40d1a2deca6420c2da7910be)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #01 pc 00000000000b3f1c /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #02 pc 00000000000b22a8 /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #03 pc 00000000000b2164 /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #04 pc 00000000000b203c /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #05 pc 00000000000b142c /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #06 pc 00000000000b1e6c /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #07 pc 00000000000c5ad0 /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #08 pc 000000000007550c /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #09 pc 00000000000741ec /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/lib/arm64/libezlog.so (Java_wtf_s1_ezlog_EZLog_init+28)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #10 pc 00000000002d4044 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #11 pc 00000000002ca9e8 /apex/com.android.art/lib64/libart.so (art_quick_invoke_static_stub+568) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #12 pc 00000000002ee6b8 /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+320) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #13 pc 000000000040ade4 /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+820) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #14 pc 000000000076d4b8 /apex/com.android.art/lib64/libart.so (MterpInvokeStatic+3812) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #15 pc 00000000002c5014 /apex/com.android.art/lib64/libart.so (mterp_op_invoke_static+20) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #16 pc 00000000000790a2 [anon:dalvik-classes.dex extracted in memory from /data/app/~~eRgxj9PHRfJEC-cex2WWJw==/wtf.s1.ezlog.demo-ngUhJZd2NWtJpUNIWy5f_g==/base.apk] (wtf.s1.ezlog.EZLog.initWith+10)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #17 pc 000000000027d840 /apex/com.android.art/lib64/libart.so (art::interpreter::Execute(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame&, art::JValue, bool, bool) (.llvm.3351068054637636664)+644) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #18 pc 000000000035a9e4 /apex/com.android.art/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+148) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #19 pc 000000000040b05c /apex/com.android.art/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+1452) (BuildId: 46df93bc978921840e5b428398c66a57)2022-07-07 15:25:50.712 14141-14141/? A/DEBUG: #20 pc 000000000076d4b8 /apex/com.android.art/lib64/libart.so (MterpInvokeStatic+3812) (BuildId: 46df93bc978921840e5b428398c66a57)
Unsafe, PhantomData,Send and Sync, Pin...crossbeam_channel, tokio, once_cell, thiserror等等,在 crates.io 上看开源项目文档也是学习的一部分。#[test]就可以写一个测试用例。对比在 android 项目写一个测试用例,我还要先去搜索,有哪些依赖是需要添加的。用 Rust 做开发,和系统 API 无关的业务逻辑,在桌面环境完成并测试,最后到对应的客户端验证。效率比起所有逻辑都在手机上验证高多了。cargo clean && cargo build -p ezlogFinished dev [unoptimized + debuginfo] target(s) in 14.19s
cargo build -p ezlogFinished dev [unoptimized + debuginfo] target(s) in 1.46s
target `aarch64-apple-ios`
Finished release [optimized] target(s) in 45.43s
target `aarch64-apple-ios-sim`Finished release [optimized] target(s) in 40.83s
target `x86_64-apple-ios`Finished release [optimized] target(s) in 39.26s
Building armeabi-v7a (armv7-linux-androideabi)
Finished release [optimized] target(s) in 47.64s
Building arm64-v8a (aarch64-linux-android)
Finished release [optimized] target(s) in 50.71s
[build]
target = "aarch64-linux-android"...
原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。