近年のGoogle Play運営は、審査こそないものの怪しいアプリをストアから削除する運用が進んでいます。大昔に作ったアプリがいつの間にか公開停止になっていた、なんてことも増えてきました。
さて今回は、Google Playからポリシー違反の連絡が来たけれども、心当たりがなかったので調べてみたら面倒くさい対応を回避できた、というお話です。
3行で
- プライバシーポリシーを置かないままストアにリリースしたアプリでデフォルトのままFirebaseを使っていると運営に刺されます
- プライバシーポリシーを置くか、Firebaseが広告IDを取得するのをやめさせる必要があります
- AndroidManifest.xmlにオプションを指定すると広告IDの取得をやめさせられます(この記事で本当に伝えたいこと)
事の発端
Google Playの運営から、こんなメールが届きました。
要約すると
- お前のアプリでは広告IDの収集・転送を行っている
- 広告IDを使うんだったらプライバシーポリシーをストアとアプリ内に掲載しろ
- プライバシーポリシーの内容はプライバシーに関して明記されていないとダメだぞ
- プライバシーポリシーの内容はちゃんと開発者や該当アプリに関連する内容じゃないとダメだぞ
- 下手に誤魔化したら追加措置(隠語)があるからな
ということです。
ファーストインプレッション
今回の事由は「Android 広告 ID の使用ポリシー及び Google Play デベロッパー販売 / 配布契約 4.8 への違反」だったわけですが、私の感想はこれです。
私「このアプリ、広告IDなんか使ってませんけど!?」
寝耳に水もいいところです。BtoBなアプリなのもあって、広告に類する活動は一切行っていません。
前述のメールでいえば、次の方針を取りたいところです。
また、お客様のアプリから個人情報や機密情報に関するアクセス権限リクエストを削除していただくことで、今回の警告を回避することも可能です。
心当たりはないわけですし、プライバシーポリシーを作ったり組み込んだりするのも面倒くさいので、なんとか回避します。
ざっくり調査してみる
この時点で「ライブラリが悪さをしているんだろうな」とは思いつつも、ひとまず調べてみることにしました。
まず、リリース時点でのパーミッションを見てみます。これは自分のAndroidManifest.xmlを見るよりも、Google Play Consoleがどう認識しているかを見たほうが確実です。
パーミッションには問題無さそうです。
次は、ライブラリです。
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "com.android.support:appcompat-v7:${supportLibVersion}"
implementation "com.android.support:design:${supportLibVersion}"
implementation "com.android.support:cardview-v7:${supportLibVersion}"
implementation "com.android.support:recyclerview-v7:${supportLibVersion}"
implementation 'com.annimon:stream:1.1.9'
implementation 'com.jakewharton.threetenabp:threetenabp:1.0.5'
implementation 'org.parceler:parceler-api:1.1.9'
annotationProcessor 'org.parceler:parceler:1.1.9'
implementation 'io.reactivex:rxjava:1.3.6'
implementation('com.ezhome:rxfirebase:2.2.0') {
exclude group: 'com.google.firebase', module: 'firebase-database'
exclude group: 'com.google.firebase', module: 'firebase-auth'
exclude group: 'io.reactivex', module: 'rxjava'
}
implementation 'com.google.firebase:firebase-database:11.8.0'
implementation 'com.google.firebase:firebase-auth:11.8.0'
implementation 'org.greenrobot:eventbus:3.1.1'
implementation('com.crashlytics.sdk.android:crashlytics:2.9.1@aar') {
transitive = true
}
testImplementation 'junit:junit:4.12'
testImplementation 'org.robolectric:robolectric:3.7.1'
testImplementation "org.mockito:mockito-core:2.16.0"
}
そこまで怪しいものは使っていません。強いて言えば、FirebaseとCrashlyticsがトラッキング系の機能を持っています。
Crashlyticsはそういう情報を収集していなさそうなので、怪しいのはFirebaseです。
Firebaseは広告IDを収集する
ググってみたところ、ドンピシャでした。
デフォルトでは、Android の SDK は広告 ID を収集します。
データの収集 - Firebase ヘルプ
この言いようだと、たぶんfirebase-coreに組み込まれていそうですね。何らかのFirebase SDKを利用したら、もう入りそうです。
firebase-coreにはFirebase Analyticsが組み込まれていますし、こういった挙動も納得が行きます。
まあ**こんな暗黙的な挙動を理由にストアから削除しにくるのはちょっと理不尽じゃない?**とは思わなくもないですが、ストアを間借りさせてもらっている身なので大きなことは言えません。
広告IDの収集を拒否する
というわけで、なんとかして広告IDを収集させないようにする必要があります。
パッと思いついたのは、Gradleによるdependencyのexclude記法ですが、さすがにfirebase-coreに組み込まれていそうなものとなると、excludeくらいではどうにもならなさそうです。
まあ、どうせオプトアウトの方法があるでしょ、ということでググってみたら、やっぱりありました。
広告 ID の収集を無効にする
Android アプリで広告 ID の収集を無効にするには、アプリの AndroidManifest.xml の application タグで、google_analytics_adid_collection_enabled を false に設定します。次に例を示します。
<meta-data android:name="google_analytics_adid_collection_enabled" android:value="false" />
https://firebase.google.com/support/guides/disable-analytics
マニフェストに追記すればいいだけのようですね。これで安心です。
まとめ
Firebaseはドチャクソ便利なツールなので、使っている方も多いかと思います。となると、この問題で大量虐殺が起きそうな気もします。こわいこわい。
なお、筆者はこの修正で直ったつもりになっていますが、実は他のライブラリも悪さをしていて、再度ストアから削除される可能性もあります。その場合は追記しますので、続報をお待ち下さい。
2018.09.28追記
Twitterを見ている感じだと、AdMobで引っかかってるケースもあるみたいですね。
実際に広告を表示している場合は、広告IDの正しい使い方なので、本記事の方法で広告IDの提供を拒否してしまうと、AdMobが正しく動作しない可能性がありそうです。
広告を表示しているのに「広告IDを取得しているつもりはなかった」というのも妙な話なので、真面目にプライバシーポリシーを書いたほうが筋が良い気がします。
ググってみたところ、SNKのプライバシーポリシーが割と筋が良いように思われたので、AdMobユーザーの方は真似してみてはいかがでしょうか。
11. 情報収集モジュール
当社で配信するアプリでは、広告配信を目的として以下の広告配信事業者がご利用者の情報を自動取得する場合がございます。取得する情報、利用目的、第三者への提供等につきましては、以下の広告配信事業者のアプリケーション・プライバシーポリシーのリンクよりご確認ください。AdMob(Google Inc.)
http://www.google.com/intl/ja/policies/technologies/ads/