Slide 1

Slide 1 text

Proto Datastoreを使う前の心構え キクチコウダイ

Slide 2

Slide 2 text

自己紹介 菊池 広大(キクチコウダイ) 2023年6月 株式会社マネーフォワードに入社 埼玉出身、Iターンで東京から福岡に引越し Androidエンジニア、たまにバックエンド。最近諸事 情でReact勉強中。 Github: https://github.com/BigBackBoom

Slide 3

Slide 3 text

WE ARE HIRING!!!!

Slide 4

Slide 4 text

Overview

Slide 5

Slide 5 text

Overview Androidの Proto Datastoreを使った際に 思ったよりも手順が多かったので その共有の知見となります

Slide 6

Slide 6 text

Jetpack Datastore

Slide 7

Slide 7 text

Jetpack Datastore SharedPreferenceの代替となる アプリにローカルデータを保存する ソリューションとなります

Slide 8

Slide 8 text

Jetpack Datastore ● Preference Datastore ○ Key-Value型 ○ プリミティブ型と一部データ配列のみ対応 ● Proto Datastore ○ カスタムデータ型

Slide 9

Slide 9 text

Jetpack Datastore ● 共通の利点 ○ DBと比べて導入が簡単 ○ 両者裏でProtocol Bufferを利用しているので高速 ● 共通の弱点 ○ データは部分更新できないため複雑なデータは効率が悪い ○ Protocol Buffer自体がマイナー

Slide 10

Slide 10 text

なぜ Proto Datastore?

Slide 11

Slide 11 text

なぜProto Datastore? ● Shared Datastoreはシンプルなデータしか保存でき ない ● 昔はSharePreferenceにJSON形式でテキスト変換し て、String型として入れたりとかしてたが・・・・

Slide 12

Slide 12 text

なぜProto Datastore? 冷静に考えて、 Proto Datastoreが カスタムデータ扱えるんだから、 そちら使うよね

Slide 13

Slide 13 text

導入が意外に面倒

Slide 14

Slide 14 text

導入が意外に面倒

Slide 15

Slide 15 text

導入が意外に面倒

Slide 16

Slide 16 text

導入が意外に面倒

Slide 17

Slide 17 text

導入が意外に面倒 はい! ここまで全部指示に従っても ビルドが通りません 😈

Slide 18

Slide 18 text

導入が意外に面倒 別にProtocol Bufferの 導入とビルド設定が必要 詳しくはCodelab参照

Slide 19

Slide 19 text

暗号化ないやん

Slide 20

Slide 20 text

暗号化ないやん EncryptedSharedPreferenceの 代替は用意されていない

Slide 21

Slide 21 text

暗号化ないやん ● センシティブなデータはやはり暗号化しておきたい ● 自分で暗号化機構を作る必要がある。 ● tink-javaを利用して、暗号化ヘルパーを作ることが 可能

Slide 22

Slide 22 text

結論 class AeadEncryptionHelper(context: Context) { private val aead by lazy { AeadConfig.register() AndroidKeysetManager.Builder() .withSharedPref( context, KEY_SET_NAME, KEY_SET_FILE_NAME ) .withKeyTemplate(KeyTemplates.get( "AES256_GCM")) .withMasterKeyUri( KEY_SET_MASTER_URI ) .build() .keysetHandle .getPrimitive(Aead:: class.java) } fun encrypt(plaintext: String): ByteArray { return aead.encrypt(plaintext. toByteArray(), null) } fun decrypt(encryptedText: ByteArray): String { return String(aead.decrypt(encryptedText, null)) } private companion object { const val KEY_SET_NAME = "{key_set_name}" const val KEY_SET_FILE_NAME = "{key_set_file_name}" const val KEY_SET_MASTER_URI = " 適当な://名前" } } ● 作成した暗号化クラス ● ポイントは AndroidKeySetManag erの作成部分

Slide 23

Slide 23 text

結論 class AeadEncryptionHelper(context: Context) { private val aead by lazy { AeadConfig.register() AndroidKeysetManager.Builder() .withSharedPref( context, KEY_SET_NAME, KEY_SET_FILE_NAME ) .withKeyTemplate(KeyTemplates.get( "AES256_GCM")) .withMasterKeyUri( KEY_SET_MASTER_URI ) .build() .keysetHandle .getPrimitive(Aead:: class.java) } fun encrypt(plaintext: String): ByteArray { return aead.encrypt(plaintext. toByteArray(), null) } fun decrypt(encryptedText: ByteArray): String { return String(aead.decrypt(encryptedText, null)) } private companion object { const val KEY_SET_NAME = "{key_set_name}" const val KEY_SET_FILE_NAME = "{key_set_file_name}" const val KEY_SET_MASTER_URI = " 適当な://名前" } } ● ポイントは AndroidKeySetManag erの作成部分 ● KEY_SETの名前系の設 定を端折ると、アプリを 立ち上げ直すたびに複合 が不可能になる。

Slide 24

Slide 24 text

結論

Slide 25

Slide 25 text

結論 Proto Datastoreは便利だけど 完全に代替にはならない

Slide 26

Slide 26 text

結論 ● 事前に導入のための時間をちゃんと取らないと、必要 以上に開発に時間がかかる。 ● 暗号化の機構がない

Slide 27

Slide 27 text

Reference

Slide 28

Slide 28 text

Reference ● https://developer.android.com/topic/libraries/ architecture/datastore?hl=ja#proto-datastore

Slide 29

Slide 29 text

以上、ありがとうございました!