Privacy sandboxのメモ

概要

https://developer.android.com/design-for-safety/privacy-sandbox/introduction

ユーザープライバシー保護を目的としていて、主に以下二つの解決策が盛り込まれているものです。 (あくまでプロポーザルの段階)

  • SDK Runtime
  • プライバシー保護API

SDK Runtime

https://developer.android.com/design-for-safety/privacy-sandbox/sdk-runtime SDK Runtimeは、サードパーティSDKを専用のランタイム環境で実行できるようにするもの (アプリのサンドボックス環境と似たもの) アプリはSDKのインタフェースを介して、SDKランタイム内のSDKにアクセスするらしいです。 このSDKとの分離はSDKの配布方法とも関連していて、以下のようなメカニズムが紹介されていました。

  1. SDK提供者は直接プレイストアにSDKをアップロードする
  2. アプリ開発者はアプリとSDKのバージョン指定情報をプレイストアにアップロードする
  3. プレイストア上で両者を組み合わせる

プライバシー保護API

プライバシー保護APIは、アプリ間の識別子に依存せずに広告のパーソナライズと測定をサポートするもの

  • Topic
  • Protected Audience
  • Attribution Report

Topic

ユーザーの過去のアプリ使用内容に基づいて大まかな広告のトピックを推測するもの これによって、個々のユーザーをアプリ間で追跡することなく、興味・関心に基づく広告(IBA)のユースケースをサポートできるらしいです。

Protected Audience

(よくわからない)

Attribution Report

広告IDのようなクロスパーティなユーザー ID への依存を排除することでユーザーのプライバシーを向上しつつ、アプリとウェブ全体でのアトリビューションとコンバージョン測定の主要なユースケースをサポートできるらしいです。

影響ありそうなサードパーティ

インストールと遷移元の広告の紐付け

例)Adjust、AppFlyer

紐づける際の根拠として広告IDを使用しているため、影響を受ける可能性大です。 https://help.adjust.com/ja/article/attribution-methods Adjustは既にブログを出しており、該当部分の内容は以下のようになっていました。

  • 従来のアトリビューション(紐付け)において、インストールリファラーに基づく方法は使用できるはず(今のところ廃止の発表がないため)
  • Privacy sandboxが標準となった後の話はリダイレクトなしのアトリビューションという項目を確認してほしい

https://www.adjust.com/ja/blog/what-google-privacy-sandbox-for-android-s-beta-launch-means-for-app-marketers/ https://www.adjust.com/ja/blog/privacy-sandbox-on-android-mobile-attribution/ https://developer.android.com/design-for-safety/privacy-sandbox/attribution?hl=ja#cross-network-attrib-without-redirects

Firebase

デフォルトだと広告IDを取得しているようですが、どう影響するかは追えていないです。 https://firebase.google.com/docs/analytics/configure-data-collection?hl=ja&platform=android#disable_advertising_id_collection

iOSのAnalyticsWithoutAdIdSupportの質問↓ https://stackoverflow.com/questions/70166513/what-are-the-downsides-of-using-firebase-analytics-without-ad-id-analyticswitho

マーケ運用ツール

例)KARTE

KARTEでは広告IDを渡すメソッドが用意されているため、広告IDに基づいた分類や連携を行なっているか確認していただくと良さそうです。 https://support.karte.io/post/13v6pgNyNKtrxyIvYZcnAs

広告

例)AdMob、Facebook広告SDK

Topicやattributionについて、案内が出始めています。 https://developers.google.com/admob/android/privacy/sandbox https://developer.android.com/design-for-safety/privacy-sandbox/attribution#extended-debugging-reports

スコープ関数の個人的なまとめ

はじめに

こちらの記事を読んで理解が深まったので、自分用のメモを残します。 engawapg.net

レシーバーとは

https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/kotlin/util/Standard.kt

Scope functions | Kotlin Documentation

Higher-order functions and lambdas | Kotlin Documentation

Contractとは

smart cast の限界

Kotlinのsmart castの限界 - kmizuの日記

Smart Casts via Assertions + Kotlin Contracts | by Andre Perkins | ProAndroidDev

contractの動き compiler

Crash Course on the Kotlin Compiler - KotlinConf 2023 - Speaker Deck

KotlinのContract機能について #Kotlin - Qiita

Kotlin: Contracts + 拡張関数でより便利に - stsnブログ

K2 compiler

The K2 Compiler Is Going Stable in Kotlin 2.0 | The Kotlin Blog smart castのissueが解決する? https://youtrack.jetbrains.com/issues?q=%23KT-4113%20%23KT-1982%20%23KT-7186%20%23KT-28806&_gl=1*41u5zw*_ga*MTIxODIxOTQxOC4xNjkyNDUxNjUw*_ga_9J976DJZ68*MTY5MjQ1MTY1MC4xLjEuMTY5MjQ1MTY2My4wLjAuMA..&_ga=2.176328037.1725137540.1692451650-1218219418.1692451650

Androidのテストケース名を日本語で書いていたら、error while writing ...$1.class (Permission denied...)と怒られた話

初見では分かりづらいエラーだったため、備忘録として残しています。

error while writing ...$1.class (Permission denied...)と怒られた

Androidのテストケース名を日本語で書いていた時、ローカルでは問題なく通るものの、GitHub ActionsのCI上でerror while writing ...$1.class (Permission denied...)と怒られてしまいました。

他の日本語で書かれているテストは問題なく成功しているのに、これだけ落ちるのはどういうことなんだ、、、と途方に暮れていましたが、メンバーの方から「文字数が多いとそのエラーが出るよ」と教えてもらいました。

android-guidelines/unit_test_guideline/unit_test_guideline.md at master · Trendyol/android-guidelines · GitHub

実際にテストケース名を短くしてみたところ、上記エラーは出なくなりました(初見で絶対分からん)。

ただ、これで終わりにするのも気持ち悪いのでもう少し調べておきます。

エラーの発生原因

stackoverflow.com

このページのコメント欄を見ると、Linuxのファイル名が最大255bytesまでであり、ファイル名またはファイル名 + パスがその上限に引っかかっているのではないかというやりとりがされています。

実際に自分が最初に書いたケース名を確認してみると、

HogeTest$<test name>$1.class

で260bytesとなっており、上記の話に当てはまりそうでした。

Ktorでkotlinx.serializationを使う時のメモ

てっきり、ktorドキュメント上の設定だけで動くと思っていましたが、、、 ktor.io 実際にビルドしてみると、”Serializer class is not found”と怒られてしまいました。

ただ、kotlinx.serializationの以下のドキュメントを読み、 依存関係を追加したところ動くようになりました。

Interfaceを使用してRepositoryをDIする時のメモ

ライブラリが提供しているモジュールをインジェクトする時と同様に、 provideメソッドを書いてあげれば大丈夫。

@Module
@InstallIn(SingletonComponent::class)
class RepositoryModule {

    @Provides
    @Singleton
    fun provideHogeRepository(
        httpClient: HttpClient,
        @IODispatcher
        dispatcher: CoroutineDispatcher
    ): HogeRepository {
        return HogeRepositoryImpl(
            httpClient,
            dispatcher
        )
    }
}

interface HogeRepository //

class HogeRepositoryImpl //

Androidでアカウントとデータ削除機能が必要になりそう?

概要

以下の記事で、
アプリ内でアカウントを作成できるアプリは、アカウントとデータ削除機能が必要になる旨が書かれています。
今のところは、アプリ内&Webサイト上の両方から必要そうな書きぶりです。 android-developers.googleblog.com

他の要点としては、

  • 何らかの理由でデータを保持する必要がある場合は、保持方法を明示する
  • 2023/12/07までにコンソール上のデータセーフティ欄から質問に回答する
  • 2024年初頭にPlay Storeにデータセーフティ欄が反映される予定

あたりがありそうです。

Propagate Remote Config updates in real timeを試す

はじめに

Remote Configをリアルタイムで更新できるらしいと聞いて、試してみました。

firebase.google.com

試す

ちょうどFlutterアプリを作成していたため、Flutterで試してみます。

関数作成

ドキュメントの通り、Functionsに関数を作成します(有料プランへのアップグレード必須)。

const functions = require("firebase-functions");
 const admin = require("firebase-admin");
 
// ドキュメントでは省略されているが、adminを初期化してあげないとエラーを吐きます。
 admin.initializeApp();
 
 exports.pushConfig = functions.remoteConfig.onUpdate(() => {
   const payload = {
     topic: "REFRESH",
     data: {
       "key1": "value1",
     },
   };
   return admin.messaging().send(payload).then((resp) => {
     console.log(resp);
     return null;
   });
 });

上記作業により、 remote configの変更時、"REFRESH"トピックを購読しているユーザーに対して、自動的にメッセージが送信されるようになります。

Firebase関連の依存関係を追加済みのFlutterアプリで、以下のコードを追加します。

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
     FirebaseRemoteConfig.instance.fetchAndActivate();
   });

最低限これを書いてあげれば、通知受信時にconfigの値をFirebaseのサーバーから取得してくれます。

あとがき

Flutterは未対応ですが、AndroidiOSはリアルタイム通知の新しい仕組みが提供されているらしく、 addOnConfigUpdateListenerを呼ぶだけで完結するようです、、。(これは嬉しい)

firebase.google.com