FeeeeeLog

互換性を維持して Android 9 Pie にアプリを移行する

   

2017年末にGoogleのAndroidの対象API レベルの対応方針がアナウンスされました。これにより、よりいっそう新しいバージョンへの対応が短期間で迫られるようになります。詳細はこちらの記事を参照してください。

このため、新しいバージョンのAndroidがリリースされたら、そのバージョンに対応することと、対象API レベルを上げることを早めに行う必要があります。

本記事は次のような読者を対象とします。

  • Androidのアプリ開発者
  • 新しいバージョンのAndroidがリリースされたのでそのバージョンに対応したい
  • 対象API レベル (targetSdkVersion)を上げたい

スポンサーリンク

新しいプラットフォームに対応する基本的な考え方

新しいプラットフォームのAndroidに対応するときには(厳密には何かをテストするには)、次のことに注意する必要があります。

  • 変更点を最小限にして動作確認する
  • 新しいプラットフォームの変更点を知る

変更点を最小限にして動作確認する

例えば、あなたのアプリのtargetSdkVersionが27であるとします。Android 9(API レベル28)がリリースされたため、動作確認を行います。

  1. 変更点を1つとするには、targetSdkVersionは27のままでAndroid 9でアプリの動作確認を行います。
  2. 変更点を2つとするには、targetSdkVersionを28にあげてAndroid 9でアプリの動作確認を行います。

このとき(A)と(B)でそれぞれ動作がおかしい場合、(A)はtargetSdkVersion27のままであるためAndroid 9の動作がおかしいと判断できます。しかし、(B)はAndroid 9の動作がおかしいまたはtargetSdkVersionを28に上げたことにより動作がおかしい可能性の2つを考慮する必要があります。

ここで、ソースコードの量が多い場合、シンプルに考えにくいため難易度が上がります。ただし、(B)で動作がおかしければ(A)に変えるなどのいくつかの選択肢を持ったり、いきなり(B)でやるほうがメリットがあるなどを判断できる場合はその限りではありません。

これは、変数としてtargetSdkVersionとAndroidプラットフォームのバージョンを使用しました。他にもアプリ開発ではたくさんの変数になりえる条件がありますので、知識力・経験などを考慮して選んでください。

新しいプラットフォームの変更点を知る

変更点など知らなくても、動作がおかしければ対応するという方法でも対応は可能です。しかし、それは情報がまったくない中で作業をするのでなければ時間がもったいないです。また、Androidのリリース直後では情報が少ないため、余計に時間をロスする原因になるのではないでしょうか
ある程度は変更点をつかんでおくことで、どのような影響が出る可能性があるかを意識しながら作業や計画ができるため心理的に安心できます。

Android Developerのサイトには「Make your apps compatible」として次のような情報が掲載されています。

Android 9 Pieの場合は次のような情報があります。(2018-08-13 現在)

Android 9 端末で動作するすべてのアプリに影響を与える主な変更点

変更点 概要
非SDKインターフェースの制限 直接、JNIを介してまたはリフレクションを介してに関わらず、特定の非SDKインターフェースへのアクセスがブロックされます。
制限されたインターフェースにアクセスを試みると、NoSuchFieldExceptionNoSuchMethodExceptionのエラーが発生します。
詳細は、非SDKインターフェースの制限を参照してください。
暗号化プロバイダーの削除 暗号化JCAプロバイダーが削除されました。
SecureRandom.getInstance("SHA1PRNG", "Crypto")を実行するとNoSuchProviderExceptionを投げます。
UTF-8デコーダーの厳格化 Java言語のUTF-8デコーダーはより厳しくなり、Unicode標準に準拠しています。
アイドル状態のアプリのアクセスブロック アプリがアイドル状態のとき、それらはカメラ、マイク、センサーへアクセスできなくなりました。

より詳細な変更点は、動作変更:すべてのアプリを参照してください。

Android 9端末で対象API レベル28のアプリに影響を与える主な変更点

変更点 概要
フォアグラウンドサービスのアクセス権限 アプリがフォアグラウンドサービスを使用するアプリは、まずFOREGROUND_SERVICE権限を要求する必要があります。これは普通のアクセス権限のため、システムは要求しているアプリに自動的に付与します。
必要な権限を持たないフォアグラウンドサービスを起動するとSecurityExceptionを投げます。
Bouncy Castle 暗号の廃止 Bouncy Castle プロバイダーのいくつかの暗号を廃止し、Conscrypt プロバイダーによって提供された暗号を選択しました。Bouncy CastleプロバイダーにgetInstance()をリクエストするとNoSuchAlgorithmExceptionを投げます。このエラーを解決するためには、getInstance()でプロバイダーを指定せずにデフォルトの実装をリクエストしてください。
Build.serialへの直接アクセスの削除 Build.serial識別子を必要とするアプリはREAD_PHONE_STATE権限のリクエストを必要とし、Build.getSerial()関数でアクセスする必要があります。
WebViewデータディレクトリの共有を許可しない アプリは、プロセス間で単一のWebViewデータディレクトリを共有することができません。アプリがandroid.webkitパッケージのWebView、CookeManagerまたはその他のAPIを使用する1つ以上のプロセスがあるならば、2つ目のプロセスがWebViewメソッドを呼び出すとアプリはクラッシュします。
SELinuxによってアプリのデータディレクトリへのアクセスをブロック システムは、各アプリのプライベートデータディレクトリのSELinux制限付きのSELinuxサンドボックスを適用します。パスで直接別のアプリのデータディレクトリにアクセスすることはできません。アプリはIPCメカニズムを使用してデータを共有することができます。
他のアプリにファイルを供するためには、コンテンツ プロバイダを使用してください。

より詳細な変更点は、動作変更:対象API レベル28以上のアプリを参照してください。

また、新機能の概要については次の記事を参照してください。