我們在后臺和社區(qū)等各渠道收到了來自開發(fā)者們的反饋,也把一些開發(fā)者們常見的問題進(jìn)行了簡單的收集和梳理,整理成這一篇關(guān)于現(xiàn)代 Android 開發(fā)的常見問題和解答,如果您在構(gòu)建過程中有任何其他的問題,歡迎通過留言的方式讓我們知道。
問: 對初學(xué)者的 Jetpack 學(xué)習(xí)有哪些建議?
答: Jetpack 幫助開發(fā)者遵循現(xiàn)代 Android 的設(shè)計(jì)規(guī)范來構(gòu)建 Android 應(yīng)用。它是一個(gè)由多種庫構(gòu)成的套件,可以幫助您輕松、快速地開發(fā)現(xiàn)代 Android 應(yīng)用。其中包含的各種套件可以獨(dú)立使用,也可以結(jié)合在一起使用,您可以在實(shí)際的開發(fā)中體會(huì)到這個(gè)特點(diǎn)。Jetpack 還可以幫助您遵循一些最佳實(shí)踐、減少依賴樣板代碼,寫出在各種各樣的 Android 設(shè)備和版本都能正常運(yùn)行的應(yīng)用。
其實(shí)在設(shè)計(jì)和實(shí)現(xiàn) Jetpack 之初,我們就已經(jīng)充分考慮了如何讓初學(xué)者也能快速上手。您可以在 Android Jetpack 和 Android Jetpack 使用入門中找到學(xué)習(xí) Jetpack 所需要的資源,比如文章、視頻、Codelab、在線培訓(xùn)等。當(dāng)您掌握到一定程度,可以嘗試閱讀 AndroidX/Jetpack 的源代碼來進(jìn)一步提升自己。如果您在開發(fā)當(dāng)中遇到了問題難以解決,我們也非常歡迎您向我們反饋,尋求我們的幫助。
Android Jetpackhttps://developer.android.google.cn/jetpack/
Android Jetpack 使用入門https://developer.android.google.cn/jetpack/getting-started
在線培訓(xùn)https://developer.android.google.cn/courses/android-basics-kotlin/course
AndroidX/Jetpack 的源代碼https://github.com/androidx/androidx
問: 如何從 Android 界面中收集數(shù)據(jù)流?
答: 最安全同時(shí)也是最佳的方法是調(diào)用 repeatOnLifecycle 這個(gè)掛起函數(shù)。您可以在函數(shù)體內(nèi)部的數(shù)據(jù)流當(dāng)中進(jìn)行收集。您也可以使用 flowWithLifecycle 這個(gè)數(shù)據(jù)流操作符,它們的實(shí)際效果是相同的。
使用這些 API 有哪些好處呢?最重要的一方面就是它們具有感知生命周期的能力。比如只有當(dāng)您的應(yīng)用正在前臺被用戶使用時(shí),這些方法才會(huì)從 Flow 中收集數(shù)據(jù)流。而這種能力恰好是其他方法所不能實(shí)現(xiàn)的,因此我們向您推薦這兩種方法。
repeatOnLifecycle 和 flowWithLifecyclehttps://developer.android.google.cn/reference/kotlin/androidx/lifecycle/package-summary
問: 如何調(diào)試應(yīng)用的性能問題?
答: 我們提供了一些專門用于優(yōu)化應(yīng)用性能的 Jetpack 庫,比如您可以用 Macrobenchmark 庫監(jiān)測應(yīng)用啟動(dòng)、界面滾動(dòng)性能或是監(jiān)控掉幀時(shí)的性能表現(xiàn)。Benchmark 庫可以用來監(jiān)測特定函數(shù)的 CPU 開銷。
對于上述的這些 Jetpack 庫,您既可以用持續(xù)集成的方式遠(yuǎn)程測量應(yīng)用的性能表現(xiàn),又可以在本地執(zhí)行,然后把結(jié)果顯示在 Android Studio 當(dāng)中。另外,別忘了 Android Studio 本身就提供了許多性能分析工具供您使用。您可以用這些工具來衡量所關(guān)注的不同性能指標(biāo),從而有的放矢,找準(zhǔn)改進(jìn)的方向。
我們都有這樣的經(jīng)驗(yàn): 調(diào)試應(yīng)用的界面非常簡單,發(fā)現(xiàn)應(yīng)用的性能問題也非常容易;但是到了真正要提升性能的時(shí)候,問題卻變得極其復(fù)雜。因?yàn)榧词鼓@得了性能指標(biāo),看到了統(tǒng)計(jì)數(shù)據(jù),卻往往在如何排查和優(yōu)化的問題上碰了壁。所以我們也提供了一些在線的指導(dǎo),您可以通過這些具體的案例來了解性能調(diào)試調(diào)優(yōu)的思路和方法,在調(diào)試自己的應(yīng)用時(shí)可以較容易地找準(zhǔn)分析性能數(shù)據(jù)的著眼點(diǎn)。
使用 Macrobenchmark 庫https://developer.android.google.cn/studio/profile/macrobenchmark-overview
Benchmark 庫https://developer.android.google.cn/jetpack/androidx/releases/benchmark
MAD Skills 系列文章
問: 使用 MotionLayout 還是 Compose?
答: 您可能會(huì)顧慮在構(gòu)建新的應(yīng)用或?qū)崿F(xiàn)新功能時(shí),是不是應(yīng)該首選 MotionLayout 而不是 Compose。其實(shí)這樣對比不是很準(zhǔn)確,因?yàn)?MotionLayout 和 Compose 屬于不同的視圖系統(tǒng)。 在理想情況下,我們推薦您使用 Compose,尤其是當(dāng)您開發(fā)全新應(yīng)用時(shí)更是如此。除非您的應(yīng)用中包含了許多歷史遺留代碼,否則沒有必要嘗試使用舊版的視圖系統(tǒng)來編寫。目前 Compose 已經(jīng)支持了 ConstraintLayout,雖然未來有可能會(huì)支持 MotionLayout,但我們建議您嘗試使用 Compose Animation API。您可以使用 Compose 實(shí)現(xiàn)很多內(nèi)容,而且相比用視圖系統(tǒng)來實(shí)現(xiàn)要容易得多。 如果您不得不使用 MotionLayout,那么可以將常規(guī)的視圖嵌入到 Compose 應(yīng)用中。在這種實(shí)現(xiàn)方式下兩者完全可以互操作,不過我們?nèi)匀唤ㄗh您遷移到 Compose,這是現(xiàn)代 Android 開發(fā)的一個(gè)重要趨勢。
MotionLayout
https://developer.android.google.cn/training/constraint-layout/motionlayout
ConstraintLayout
https://developer.android.google.cn/reference/androidx/constraintlayout/widget/ConstraintLayout
問: 首選 MVVM 還是 MVI?
答: MVVM (Model-View-ViewModel) 和 MVI (Model-View-Intent) 其實(shí)沒有太大的區(qū)別,它們都是實(shí)現(xiàn)單向數(shù)據(jù)流 (UDF) 的具體方法,也是您構(gòu)建應(yīng)用的首選方式。因此,選擇哪一種方法完全取決于應(yīng)用的具體需求,取決于您是否希望使用 MVI 建立用戶意圖模型并將幾乎所有內(nèi)容都設(shè)置為響應(yīng)式 (reactive)。所以,具體選擇哪一種架構(gòu)完全取決于您的應(yīng)用和需求,但不必過分拘泥,因?yàn)樗鼈兌伎梢詫?shí)現(xiàn)您的目標(biāo)。
問: 存儲(chǔ)區(qū)數(shù)據(jù)更新與 ViewModel 通信的最佳方式是什么?
答: 我們建議您使用 Flow 或掛起函數(shù)。如果這只是一次性的調(diào)用,那么您應(yīng)該使用掛起函數(shù),如果您需要使用流式數(shù)據(jù),那么建議您使用 Flow。
在解決這個(gè)問題時(shí),如果考慮讓存儲(chǔ)區(qū)類實(shí)例通知 ViewModel 發(fā)生了數(shù)據(jù)變化,您會(huì)發(fā)現(xiàn)這樣做很麻煩。因?yàn)?ViewModel 的生命周期往往比存儲(chǔ)區(qū)類實(shí)例要短。正確的思考方式應(yīng)該是: 如果 ViewModel 需要用到存儲(chǔ)區(qū)中的某些數(shù)據(jù),就讓它觀察或收集那些信息,這個(gè)過程可以通過 RxJava 或者協(xié)程來實(shí)現(xiàn)。這兩種思路之間有細(xì)微的差異,主動(dòng)和被動(dòng)方互換之后,很多復(fù)雜的問題也迎刃而解了。值得一提的是,這種新思路對于所有短生命周期對象觀察長生命周期對象中的數(shù)據(jù)都適用。當(dāng)您處理其他單向數(shù)據(jù)流問題時(shí),也可以試著從這個(gè)角度看問題,不論是存儲(chǔ)區(qū)類實(shí)例和 ViewModel 之間還是 ViewModel 和視圖之間的問題都會(huì)迎刃而解。
可能您還會(huì)思考是否可以使用 LiveData。不過需要明確的是,LiveData 其實(shí)是專門為界面構(gòu)建的一組 API,它的設(shè)計(jì)用途非常清晰,就是用來保存界面狀態(tài)的。如果您想在存儲(chǔ)區(qū)類中使用 LiveData,會(huì)發(fā)現(xiàn)擴(kuò)展性很差,因?yàn)樵谶@種場景下有更適合的響應(yīng)式庫供選擇。所以 LiveData 被設(shè)計(jì)為解決那一類非常具體的問題,超出這些范疇后就不再適合了。特別是當(dāng)您正在使用 Kotlin 協(xié)程和 Flow 時(shí)就更不必再考慮 LiveData 了。另外,LiveData 是通過 XML 中綁定的形式使用的,以往人們使用它是因?yàn)榕c數(shù)據(jù)綁定緊密結(jié)合起來了。而現(xiàn)在,數(shù)據(jù)綁定支持使用 StateFlow,我們有了這種新的具有生命周期感知能力的協(xié)程 API,縱使 LiveData 在某些特定用途仍然表現(xiàn)出色,我們也沒有再使用的必要了。
LiveData 概覽
https://developer.android.google.cn/topic/libraries/architecture/livedata
Android 上的 Kotlin 數(shù)據(jù)流
https://developer.android.google.cn/kotlin/flow
問: 如何使用 Hilt 構(gòu)建多模塊應(yīng)用?
答: 我們建議您首先閱讀 Hilt 的文檔,這里幾乎有您需要的所有內(nèi)容。多模塊應(yīng)用的實(shí)現(xiàn)方式本質(zhì)上和您將所有東西都放到應(yīng)用 (app) 模塊中是一樣的,因?yàn)椴煌哪K可以通過相同的方式向各個(gè)組件開放綁定。如果您希望構(gòu)建動(dòng)態(tài)功能模塊 (DFM),請參閱文檔: 在多模塊應(yīng)用中使用 Hilt。
Hilt 的文檔https://developer.android.google.cn/training/dependency-injection/hilt-android
在多模塊應(yīng)用中使用 Hilthttps://developer.android.google.cn/training/dependency-injection/hilt-multi-module
問: WorkManager 是否會(huì)取代后臺服務(wù)?
答: 如果您所指的后臺服務(wù)是 Android 中的舊服務(wù)類型的話,答案是肯定的。WorkManager 是專門為需要確保任務(wù)可靠運(yùn)行而設(shè)計(jì)的,它有兩個(gè)重要特點(diǎn): 保證任務(wù)可靠運(yùn)行和可推遲運(yùn)行任務(wù)。如果某個(gè)任務(wù)不需要獨(dú)立運(yùn)行,那么使用 WorkManager 與使用后臺執(zhí)行器、協(xié)程就沒有任何區(qū)別。某些工作,比如發(fā)送電子郵件或投屏到電視非常適合使用 WorkManager。
在非常早期的 Android 中,創(chuàng)建服務(wù)來實(shí)現(xiàn)這些任務(wù)是非常重要的,因?yàn)?a href="http://m.1cnz.cn/v/tag/527/" target="_blank">操作系統(tǒng)需要提前知道您的應(yīng)用準(zhǔn)備做某件事情。也許新版本的 Android 仍可能根據(jù)是否有服務(wù)在運(yùn)行來判斷是否要繼續(xù)運(yùn)行您的應(yīng)用,但今后您都不必繼續(xù)使用了。所以,如果您不在意某些后臺工作沒有執(zhí)行,那么可以使用常規(guī)的后臺執(zhí)行器;如果您在意,那么請使用 WorkManager。WorkManager 還非常適用于持久作業(yè),也就是需要在后臺持續(xù)運(yùn)行的任務(wù)。如需了解近期 WorkManager 的新增功能,請參閱我們之前的推文: 現(xiàn)代 WorkManager API 已發(fā)布和 Android Studio 對現(xiàn)代 WorkManager 的支持。
Android 12 引入了一些新的限制,同時(shí) WorkManager 2.7 也提供了新的 API 來幫助您適配這些限制,比如 setExpedited API。在早期,我們希望開發(fā)者們使用前臺服務(wù),因?yàn)槿绻麘?yīng)用的確需要在后臺運(yùn)行,就一定要用通知欄消息告訴用戶這樣做的必要性。但是很快,我們發(fā)現(xiàn)這個(gè)功能遭到某些應(yīng)用的濫用,用戶的通知欄出現(xiàn)了大量的占用和騷擾。所以我們?yōu)?WorkManager 增加了加急作業(yè) API,在 Android 12 運(yùn)行時(shí),它可以在 JobScheduler 中委托加急作業(yè),而在低版本 Android 運(yùn)行時(shí)又通過委托給前臺服務(wù)來提供更好的向后兼容性。
WorkManagerhttps://developer.android.google.cn/topic/libraries/architecture/workmanager
WorkManager 版本 2.7.0 的新變化https://developer.android.google.cn/jetpack/androidx/releases/work#version_27_2
問: 是否有只能用 LiveData 處理的場景?
答: 您可能在對比 LiveData 和 Flow 時(shí)會(huì)產(chǎn)生一個(gè)疑問: 是否有 LiveData 不能用 Flow 替代的例子?其實(shí)不用這樣對比,我們要從 LiveData 設(shè)計(jì)的思路來考慮。LiveData 是從專門解決界面顯示問題的角度來設(shè)計(jì)的,它的目的很明確,就是要在應(yīng)用處于前臺時(shí)進(jìn)行數(shù)據(jù)交互。這也意味著 LiveData 無法解決后臺運(yùn)行時(shí)的數(shù)據(jù)獲取問題。所以這既是 LiveData 的優(yōu)勢,也是它不能很好適應(yīng)其他場景的原因。您可以查看《從 LiveData 遷移到 Kotlin 數(shù)據(jù)流》了解如何將 LiveData 轉(zhuǎn)換為 StateFlow 以及其中的差異。也可以閱讀《實(shí)戰(zhàn) | 使用 Kotlin Flow 構(gòu)建數(shù)據(jù)流 “管道”》來學(xué)習(xí)如何使用 Kotlin Flow。
所以如果您認(rèn)為 LiveData 更適合您的用例,或者在您的用例中它實(shí)現(xiàn)起來更簡單,完全可以用 LiveData 實(shí)現(xiàn)。不過您需要了解,StateFlow 可以完成您用 LiveData 實(shí)現(xiàn)的所有任務(wù),并且可以做得更多,也更符合 Android 開發(fā)的技術(shù)趨勢,同時(shí)讓您日后的維護(hù)更加輕松。
問: 如何減少 Android Studio 的構(gòu)建時(shí)間?
答:構(gòu)建是開發(fā)者們經(jīng)常會(huì)進(jìn)行的一個(gè)操作,但構(gòu)建的操作包括了很多個(gè)過程: Gradle 和 Gradle 插件的處理、構(gòu)建、編譯、打包資源等等。我們正在進(jìn)行很多工作來優(yōu)化這些方方面面,所以您需要做的就是使用最新版本的工具。每當(dāng) Android Gradle 插件、Kotlin 和其他您在構(gòu)建過程需要用到的工具有更新時(shí),請盡量更新它們。通常我們會(huì)在每次更新版本中修復(fù)近期的錯(cuò)誤、提升穩(wěn)定性或構(gòu)建速度。
其次,像 KSP (Kotlin 符號處理) 這類工具可以在某些場景加快您的構(gòu)建,建議您開始使用它們。另外我們還建議不要在構(gòu)建中添加太多自定義的內(nèi)容,設(shè)置不當(dāng)可能會(huì)適得其反。因?yàn)樽远x Gradle 插件之類操作需要您對 Gradle、Gradle Android 插件有充分的了解,不適合新人去操作。如果您有像使用自定義構(gòu)建這樣的需求,應(yīng)該盡可能只使用聲明式的 DSL 樣式配置。
如需了解更多,請參閱我們之前的推文《使用新 Android Gradle 插件加速您的應(yīng)用構(gòu)建》。
問: 如何將應(yīng)用過渡到 Jetpack?
答: 您不必過分拘泥于是不是每一處地方都使用了 Jetpack。我們無法給到您這樣一個(gè)清單來一一檢查,因?yàn)檫@是沒有意義的。開發(fā)中是否使用 Jetpack 來實(shí)現(xiàn)完全取決于您的應(yīng)用架構(gòu)。如果您的架構(gòu)是可擴(kuò)展的,比如所用到的接口都可以替換、數(shù)據(jù)庫中的依賴次序可以交換等等,那么這些都是幫助您的應(yīng)用取得成功的基石。因此,我們只想建議您盡可能選擇一個(gè)合理的架構(gòu),讓依賴項(xiàng)能夠很容易進(jìn)行替換——比如您可以很方便地用 DataStore 替換 SharedPreferences。
另外,Jetpack 已經(jīng)推出好幾年了,在這期間涌現(xiàn)出一大批優(yōu)秀的官方或第三方庫。所以我們建議您在自己實(shí)現(xiàn)某個(gè)功能前,先找找是不是已經(jīng)有非常方便的庫可以取用。重復(fù)造輪子固然能提升您的研發(fā)水平,但會(huì)浪費(fèi)大量時(shí)間,您完全可以依托強(qiáng)大的開源力量創(chuàng)造出優(yōu)秀的應(yīng)用。舉個(gè)例子,過去人們使用前臺服務(wù)來實(shí)現(xiàn)某些功能,但是 Android 12 的發(fā)布,這些方法都不再適用了,開發(fā)者們不得不重新實(shí)現(xiàn)來兼容新的系統(tǒng)。但是如果您用 WorkManager 的 setExpedited API 來實(shí)現(xiàn),那么不需要任何操作就可以同時(shí)兼容新、舊系統(tǒng)的特性,節(jié)省大量的時(shí)間并省去了反復(fù)調(diào)試的成本。
最后一個(gè)建議,請您一定養(yǎng)成充分測試的習(xí)慣。在開發(fā)的過程中,非常容易因代碼變化而產(chǎn)生不確定因素。及時(shí)而充分的測試可以為代碼質(zhì)量提供保障。我們以 Jetpack 開源代碼庫為例,其中有一個(gè)分支適配了最新的 Android 代碼,因此不論 Android 源代碼主實(shí)例中有什么變化,我們都會(huì)為它進(jìn)行所有的測試。這樣就可以最大程度保證能在數(shù)月之前就發(fā)現(xiàn)可能出現(xiàn)的問題并做好修復(fù)工作,從而在新版本 Android 發(fā)布后,您可以放心地更新 Jetpack 庫進(jìn)行適配而無需擔(dān)心出現(xiàn)兼容性問題。
如需了解更多,請參閱:
遷移至 AndroidX https://developer.android.google.cn/jetpack/androidx/migrate
問: ViewModel 和 Hilt 或者 Dagger 在 Compose 中可以使用嗎?
答: 答案是肯定的。在我們之前的推文《實(shí)踐 | Jetpack Compose 中的狀態(tài)管理》中詳細(xì)介紹了在 Compose 中處理狀態(tài)復(fù)雜性的不同方法。您會(huì)了解到 ViewModel 是一種負(fù)責(zé)提供對應(yīng)用業(yè)務(wù)邏輯的訪問的狀態(tài)容器,它提供特定界面的界面狀態(tài),所以位于整個(gè)界面的最外層。如果您使用了 Compose Navigation,那么 ViewModel 就可以看作是一個(gè)路由來使用。
如需了解更多,請參閱:
使用 Compose 進(jìn)行導(dǎo)航 https://developer.android.google.cn/jetpack/compose/navigation
問: 需要在構(gòu)建多平臺應(yīng)用上投入精力嗎?
答: 這個(gè)問題與 Kotlin Multiplatform (KMP) 相關(guān),目前我們的建議是暫時(shí)不要。KMP 仍然是我們還在研究的領(lǐng)域 (目前是 Alpha 版),相關(guān)成果應(yīng)該很快就會(huì)與您見面。我們知道很多開發(fā)者都對這項(xiàng)技術(shù)感興趣,同時(shí)大家也在使用 Jetpack,所以我們不希望 Jetpack 阻礙您遷移到 KMP,您也不需要在兩者中糾結(jié)。
我們在設(shè)計(jì) KMP 時(shí),首先需要驗(yàn)證它的可行性。比如構(gòu)建 Room Multiplatform 庫就需要確保它不會(huì)影響到只使用 Android 的用戶。因此開發(fā)和推廣 KMP 是一個(gè)平穩(wěn)過渡的過程,從文檔到 API 兼容性都必須能按照預(yù)期執(zhí)行。對我們來說,將一個(gè)庫遷移到 Kotlin Multiplatform 需要做大量的工作,比如構(gòu)建一些小型的 Jetpack 庫來進(jìn)行測試和評估。未來您會(huì)看到很多這方面的進(jìn)展,敬請期待!
Kotlin Multiplatform (KMP)https://kotlinlang.org/docs/multiplatform.html
問: 使用協(xié)程處理異常的最佳實(shí)踐是什么?
答:建議您直接使用協(xié)程提供的異常處理機(jī)制。您不需要進(jìn)行額外的處理,直接使用協(xié)程內(nèi)置的方法即可。這種機(jī)制會(huì)自動(dòng)幫您處理異常傳播過程,不過您可能需要了解 SupervisorJob、SupervisorScope 以及 CoroutineScope 的工作原理。如需了解如何使用內(nèi)置機(jī)制處理協(xié)程中的異常,請參閱文檔:
Kotlin 異常處理 https://kotlinlang.org/docs/exception-handling.html
問: 如何自動(dòng)化發(fā)布到 Google Play 商店?
答: 目前 Android Studio 或者 Android Gradle 插件還不支持這項(xiàng)功能,但是開發(fā)者社區(qū)非常期待能實(shí)現(xiàn)它。不過您可以嘗試一款非常好用的第三方工具,它可以同 Android Gradle 插件一起工作,將這個(gè)發(fā)布流程自動(dòng)化。我們會(huì)探索未來把這項(xiàng)功能集成進(jìn) Android Studio 的可能性,但在我們計(jì)劃完成之前,建議您通過開源庫實(shí)現(xiàn)這個(gè)功能:
開源庫: GitHub - fastlane/fastlane https://github.com/fastlane/fastlane
問: 能否使用 RemoteMediator 對 Pager 類單元測試?
答:未來您可以實(shí)現(xiàn)這樣的測試,不過目前還只能通過真實(shí)界面來測試操作。我們的確有這樣的計(jì)劃要實(shí)現(xiàn)一個(gè)測試輔助類來解決分頁測試相關(guān)的問題,但目前它依賴一些尚未公開的內(nèi)部 API。所以您的理想做法是對 RemoteMediator 進(jìn)行單元測試或是對實(shí)際分頁進(jìn)行集成測試。
分頁功能的一個(gè)重要特點(diǎn)是非常依賴界面展示。它會(huì)在實(shí)際顯示時(shí)優(yōu)化您看到的內(nèi)容,因此如果沒有相關(guān)的代碼上下文,就很難控制和測試它。
RemoteMediator API 參考文檔 https://developer.android.google.cn/reference/kotlin/androidx/paging/RemoteMediator
問: Macrobenchmark 庫的作用是什么?
答:您可以使用 Macrobenchmark 庫測試應(yīng)用自啟動(dòng)、冷啟動(dòng)、暖啟動(dòng)時(shí)的加載用時(shí)。它可以幫助您測試應(yīng)用的卡頓情況、分析不同幀的性能表現(xiàn)。如果您的應(yīng)用涉及到大量的滾動(dòng)操作,Macrobenchmark 可以幫助您找到掉幀的原因并進(jìn)行有目的的改善。您還可以用它來實(shí)現(xiàn)對特定場景的測試,確保相關(guān)場景、功能更符合實(shí)際用戶的需求。 目前開發(fā)者們最關(guān)心的是測量啟動(dòng)事件和分析卡頓情況兩大特性,因?yàn)檫@兩個(gè)性能指標(biāo)會(huì)真正影響到應(yīng)用的易用性和業(yè)務(wù)。而除了兩大功能,我們還在研究讓 Macrobenchmark 跟蹤應(yīng)用中的其他關(guān)鍵性能指標(biāo),從而幫助您有選擇地對應(yīng)用性能進(jìn)行追蹤分析。
使用 Macrobenchmark https://developer.android.google.cn/studio/profile/macrobenchmark-overview
問: DataStore 是否支持加密?
答: DataStore 沒有自帶加密功能,但我們有計(jì)劃將加密集成進(jìn)來。所以目前您使用 DataStore 時(shí)可以選擇先將數(shù)據(jù)序列化再寫入存儲(chǔ)中。您可以在 DataStore 的基礎(chǔ)上自行加密,只不過還沒有模塊能幫您直接完成加密工作。
一種可行的方式是將一個(gè)加密庫注入到 DataStore 中使用。我們希望能為您提供像 EncryptedSharedPreferences 那樣的 API,不過這個(gè)過程還需要時(shí)間。目前的想法是創(chuàng)建單獨(dú)的庫,然后利用 DataStore 的 API 實(shí)現(xiàn)對數(shù)據(jù)的直接加密。
對方塊的大小和顏色同時(shí)進(jìn)行
原文標(biāo)題:FAQ | 現(xiàn)代 Android 開發(fā)常見問題解答
文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
Android
+關(guān)注
關(guān)注
12文章
3941瀏覽量
127726 -
API
+關(guān)注
關(guān)注
2文章
1509瀏覽量
62264 -
代碼
+關(guān)注
關(guān)注
30文章
4821瀏覽量
68890 -
數(shù)據(jù)流
+關(guān)注
關(guān)注
0文章
121瀏覽量
14394
原文標(biāo)題:FAQ | 現(xiàn)代 Android 開發(fā)常見問題解答
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論