Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

Android 14 (Preview 2) API を試してみた

こんにちは、Android エンジニアのてつ(哲)です。

Android 14 は、2023 年下半期に正式にリリース予定とされています。最近(03月08日)、Android 14 Preview 2 が公開されたため、今回は自分が注目している部分について、内容と試した感想を紹介したいと思います。

新機能

アプリインストールの事前承認

Starting with Android 14, the requestUserPreapproval() method lets installers request user approval before committing the install session. This improvement lets an app store defer downloading any APKs until after the installation has been approved by the user. Furthermore, once a user has approved installation, the app store can download and install the app in the background without interrupting the user. (via link)

まず、新しい API の一つは、アプリケーションのインストールに関するものです。従来は、アプリのダウンロード後に承認リクエストを表示させていましたが、Android 14 では、ダウンロードが完了する前にも承認を求めることができるようになりました。

これにより、ユーザーがよりスムーズにインストールできるようになり、利用者体験が向上することが期待されます。以下に、具体的なサンプルを示します。

ざっくりと改善点をまとめると:

  • ダウンロードからインストール確認までの間隔が短くなります。
  • アプリのサイズが大きいほど、メリットも大きくなります。
  • 複数アプリをダウンロードしでも、承認ダイアログは必ずダウンロード順になります。

個人的には、UX 改善に対する効果が大きいと思うので、社内向けアプリ(Yappli Hang Out)でもこの新 API を活用できるかを考えています。例えば、通知機能と組み合わせて、新しいアプリの公開情報にインストールリンクを含めば、インストール数の増加が期待できるでしょう。

スクリーンショットの検知

To create a more-standardized experience for detecting screenshots, Android 14 introduces a privacy-preserving screenshot detection API. This API lets apps register callbacks on a per-activity basis. These callbacks are invoked, and the user is notified, when the user takes a screenshot while that activity is visible. (via link)

もう一つの新機能は、アプリ内コンテンツのプライバシー保護に関するものです。FLAG_SECUREを利用して、画面の録画とキャプチャーを無効化する方法に加え、ユーザーがスクリーンショットを取ることが検知できるようになりました。もちろん、このAPIを通してスクリーンショットした内容を取得することはできません。

同様に、実装したサンプルを見てみましょう:

このようにスクリーンショットを撮ると、アプリ内の検知だけでなく、システム側でも通知が表示されます。このAPIをどのように活用するかについて、二つの方向性があると考えています:

  • 他人の同意なしに個人情報を取得することを防げます。

例えば、チャット機能でスクリーンショットを撮った場合は、相手にスクリーンショットされたことを通知します。

  • もしくは、アプリ共有機能への案内です。

スクリーンショットを使うのは、大抵何かしらの内容をアプリ外に共有したい場合です。検知した際に、画面内容を合わせてアプリの共有機能を紹介するのは良い手法かもしれません。うまく使えば、より優れたユーザー体験が提供できると思います。

エミュレータでスクリーンショットを撮る方法

スクリーンショットの検知はキーイベントに反応するため、エミュレーターを使う場合は、内蔵のスクリーンショット機能はトリガーされません。そのため、動作させたい場合には adb を通して同様のキーイベントを送信する必要があります。

設置方法:

  • Android API UpsideDownCake (Google APIs) でエミュレーターを作成して起動します。
    • 注意:Google Play を含むイメージファイルは Root 権限がないため使えません。
  • スクリーンショット用キーイベントを取得します。
## Rootユーザーに切り替える
% adb root

## Shellモードに入る
% adb shell

## キーイベント内容を取得する
emu64a:/ # getevent

## 音量下げるキーを押す (デバイスよって定義値が異なる場合はある)
## [device] [type] [code] [value]
/dev/input/event12: 0001 0072 00000001 
/dev/input/event12: 0000 0000 00000000 
/dev/input/event12: 0001 0072 00000000
/dev/input/event12: 0000 0000 00000000

## 電源キーを押す
## [device] [type] [code] [value]
/dev/input/event12: 0001 0074 00000001
/dev/input/event12: 0000 0000 00000000
/dev/input/event12: 0001 0074 00000000
/dev/input/event12: 0000 0000 00000000
  • スクリーンショットのイベントを生成します
## 取得した値が異なる場合は、対応値の変更と16進数→10進数の変換が必要

## キーイベントを送信し、スクリーンショッを撮る
emu64a:/ # cat > /data/local/tmp/screenshot.sh <<EOF
#!/bin/sh
echo 'volume key: down'
sendevent /dev/input/event12 1 114 1 ## 0001 0072 00000001 
echo 'power key: down'
sendevent /dev/input/event12 1 116 1 ## 0001 0074 00000001
sendevent /dev/input/event12 0 0 0   ## 0000 0000 00000000
sleep 1
echo 'volume key: up'
sendevent /dev/input/event12 1 114 0 ## 0001 0072 00000000
echo 'power key: up'
sendevent /dev/input/event12 1 116 0 ## 0001 0074 00000000
sendevent /dev/input/event12 0 0 0   ## 0000 0000 00000000
EOF
sh /data/local/tmp/screenshot.sh

正しく設置すれば、実機と同様な動作します。

変更点

もちろん新機能以外にも、他の変更点がいくつも注目されます:

  • Android 6.0 (targetSDK 23) 以下のアプリがインストールできなくなります。今後は新しいOSがリリースされるたびに、iOSと同様に要件があがる可能性が高いです。

(インストールが必要な場合は開発者向けのコマンドが使えます。)

adb install --bypass-low-target-sdk-block FILENAME.apk
  • アプリ自身に属さないバックグラウンドプロセスを停止することができなくなります。公式サイトにもこのような内容が記載されています:

Note: It isn't possible for a 3rd-party application to improve the memory, power, or thermal behavior of an Android device.

これにより、パフォーマンスを向上させるためのアプリと更新されていないアプリは段々と消えていくと考えられます。

まとめ

細かいところに触れましたが、今回紹介したい部分は以上です、こちらに作ったサンプルコードを掲載しています(アプリインストールスクリーンショット検知)。

皆さんは Android 14 どのあたりが気になっていますか?ぜひ試してみてください。良かったらカジュアル面談でお話ししましょう〜ご覧いただきありがとうございました!