Restart of Unity – No.06(Android向けAPI levelについて)

対象バージョン:Unity 2019.4.1f1(LTS)、Unity Hub 2.4.1、Windows10

Android向けAPI levelについて

今回の内容は、僕がAndroid Play Consoleでリリースする際にTarget APIレベルの設定でハマった内容がメインです。

様々な呼び方

Androidの場合、「ターゲットSDKバージョン」もしくは「ターゲットAPIレベル」、「OSバージョン」、「OSコード名」と呼び方が色々あってややこしいです。

Unity上では、Minimum API LevelやTarget API levelは、下記の様にOSバージョン、コード名、APIレベルが全部まとめて表示されます。(本家より親切です…^^;)

Android 9.0 ‘Pie’ (API level 29)

AndroidバージョンとAPIレベルの対応、Androidバージョンとコード名の対応は、下記のページが参考になるかと思います。

『SDK Platform リリースノート』
https://developer.android.com/studio/releases/platforms?hl=ja

『Build.VERSION_CODES』https://developer.android.com/reference/android/os/Build.VERSION_CODES?hl=en

設定が必要な項目

Android Studioでアプリを開発をする場合もそうですが、Androidアプリを開発する際には、下記の2つを設定する必要があります。

設定項目Gradleの項目Unity PlayerSettingsの項目
最小APIレベルminSdkVersionMinimum API Level
ターゲットAPIレベルtargetSdkVersionTarget API Level

※最大APIレベルも存在しますがUnityのPlayerSettingでは設定できませんし、本家のページでも設定は非推奨と記載されているので、ここでは、省略します。

『<uses-sdk>』
https://developer.android.com/guide/topics/manifest/uses-sdk-element?hl=ja

設定方法

UnityのFileメニューから[Build Settings]を選択し、表示されたBuild Settingsダイアログから[Player Settings]ボタンを押して、Playser Settingsビューを表示します。(タブはAndroidタブ(ドロイド君アイコンあるタブ)に切り替えます)

Other Settingsの項目にAPIレベルを選択する項目があるので、ここで、それぞれのAPIレベルを選択します。

※以前のバージョン(v5.4.xなど)ではTarget API Levelの指定項目がないモノもあります。

APIレベルの選択

Minimum API Levelの選択

最小APIレベル(Minimum API Level)は、「これより小さいAPIレベル(OSバージョン)搭載の端末にはインストールできない」「これより大きいAPIレベル(OSバージョン)搭載の端末ならばインストールできる」という事を表します。

古い端末を含めて幅広く動作するアプリとして作成したい場合は、選択できる範囲内で最も小さいレベルを選択するのが良いかと思いますが、一点注意点があります。

Minimum API level選択時の注意点

注意点としては、Unityのバージョンによっては、最小APIレベル(Minimum API Level)が限定されるという点です。

これは、例えば古いUnityのバージョンで作成したアプリを、新しいUnityのバージョンで作成しなおした場合、強制的に最小APIレベル(Minimum API Level)が変更されるという事になります。

Google Play Consoleでアプリのバージョンアップ版をリリースする際に警告がでる場合があります。

下記はUnityの各バージョンで選択可能なminimum API levelの一覧です。

Unity Version選択可能な Min API level
2019.3.x以降4.4 (Kit Kat, API level 19)以上
5.6.x ~2019.2.x4.1 (Jelly Bean, API level 16)以上
5.4.x2.3.1(Gingerbread, API level9)以上

※詳細は、Unityの各バージョンのリリースノートの中の「System Requirement」項目を参照してください。(といっても、すべてのリリースノートにその項目が存在する訳ではないですが…)

『Unity ダウンロード アーカイブ』
https://unity3d.com/jp/get-unity/download/archive

minimum API levelを変更したくないという場合は、使用するUnityのバージョンに制限が発生するという点に注意が必要になります。

※自分はminimum API level以上の端末でしか動かないアプリを作成したつもりはなくても、Unity(のそれぞれのバージョン)がその制限を明示している以上、Unity(のそれぞれのバージョンの)プラットフォームの制限と考えていいでしょう。

ちなみに、Unityバージョンのアップグレードはそんなに問題はないですが、バージョンのダウングレードはサポート外で上手くプロジェクトが変換されない場合があります。(自分の場合は、Canvas関連がぐちゃぐちゃになっていました)

特にアプリのバージョンアップ時に、「とりあえず最新バージョンにしておけばいいや」とバージョンを選択してしまうと、後々苦しむことになるかも知れません。

Target API levelの選択

Target API level(ターゲットAPIレベル)は、基本的には「Automtic(highest installed)」(インストールされている中で最高の物を自動選択)で良いと思います。

Target API levelを変更したい場合

上げなきゃならない時もある

たまにGoogle社より、下記の様な通知が来て、特にアプリに不具合が無くても、Target API levelを変更(新しいものに更新)しなくてはいけなくなる場合があります。

「まぁ、Target API levelの変更ぐらいなら、リストから選択すれば…」と思って、PlayerSttingsのTarget API levelのリストをクリックすると…

「選択したいのは「29」なのに「28」までしかない!」ていう場合があります。

さて、最近のUnity(ここでは、バージョン2019.4.1f1)では、Android SDKをそれぞれのUnity内で持っています。

Unity Hubで該当バージョンのUnityの右上のメニューから「モジュールを加える」を選択して表示したさいに「Android SDK & NDK Tools」にチェックがついていれば、独自のSDKが含まれている事になります。

さて、これを最新版にしたいのですが、チェックを外すことが出来ません。

「まさか、Unityの該当バージョンごとアンインストールしてからインストールしなおし?」と思いましたが、さすがにそんな馬鹿な事はないだろうと、いろいろ調べてみました。

参考:https://docs.unity3d.com/ja/2018.4/Manual/android-sdksetup.html

Android SDKの場所の確認

UnityのEditメニューから[Preferences…]を選択し、Preferencesビューを表示し、[External Tool]を選択し、Android SDKのパスを取得するために「Copy Path」ボタンを押します。

※チェックが入っていれば、UnityでインストールしたSDKを、チェックが入っていなければ、他(Android Studio等)でインストールしたSDKを利用している事になります。今回は、チェックが入っている事を前提に記載します。

Android SDKの追加インストール

管理者としてコマンドプロンプト(もしくはPower Shell)を起動し、先ほどCopyしたパスを貼り付けて、CDコマンドを実行します。
(管理者として実行しないと、後述のSDKのインストール時に「Failed to read or create install properties file.」が発生し、インストールできません)

後は下記手順で追加したいSDKを追加します。

① tools/bin/フォルダへ移動

> cd tools\bin

②「sdkmanager.bat –list」コマンドを実行

> sdkmanager.bat --list

大量のモジュールリストが表示されますが、とりあえず最後の「Available Updates」のみ注目します。

Available Updates:
ID | Installed | Available
------- | ------- | -------

platform-tools | 28.0.1 | 30.0.4

「現在インストールされているSDKはAPl level=28で、利用可能なAPI level=30があるよ」と表示されています。
※「30.0.4」と出ていますが、小数点以下はあまり信用できません…。

今回欲しいのはAPI level = 29ですが、最新の30をインストールする事とします。

③インスト―ルするパッケージを確認

コマンドプロンプトをスクロールして、「build-tools;30.x.x」と「platforms;android-30」の項目を探します。

Available Packages:
…(略)…
  build-tools;30.0.2                                                                       | 30.0.2       | Android SDK Build-Tools 30.0.2
…(略)…
  platforms;android-30                                                                     | 3            | Android SDK Platform 30
…(略)…

④ SDKを追加インストール

見つかったバージョンを元に、下記コマンドを実行して、API level=30のAndroid SDKをインストールします。

> sdkmanager.bat "platform-tools" "platforms;android-30" "build-tools;30.0.2"

途中でandroid-sdk-license:の内容が表示され、「Accept? (y/N):」と表示されるので、問題なければ「y」を押します。

ダウンロードと解凍が進み、問題が無ければエラー・警告なく終了します。

Accept? (y/N): y
[=======================================] 100% Unzipping… android-11/framework
>

エクスプローラでSDKの場所を確認すると、platformに「android-30」とbuild-toolsに「30.0.2」が追加されました。

PlayerSettingsビューを表示し直して確認

Android SDKを追加インストールしても、PlayerSettingsビューの内容(リスト)は更新されないので、PlayerSettingsビューを一旦クローズし、再度、[Build Settings]ダイアログの[Payer Settings]ボタンを押し、表示しなおします。

[Target API level]のリストを確認すると、

無事API Level 29, 30が追加されました\(^^)/

補足.1

さて、設定上ではターゲットAPIレベルは最新の物にできましたが、実際のアプリで確認したい場合は、「aapt.exe」を利用します。

aapt.exeはAndroid SDKのツールなので、大抵は下記の様なパスに入っていると思います。

C:\Program Files\Unity\Hub\Editor\(Unityのバージョン)\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\build-tools\(Android build toolのバージョン)\aapt.exe

下記のコマンドを実行して、テキストファイル(app_info.txt)に保存します。

> aapt.exe l -a (作成したapkファイル) > app_info.txt

app_info.txtをテキストエディタで開いて、use-sdkの項目を確認すると、下記の様になっています。(色は付いていませんが…)

E: uses-sdk (line=9)
 A: android:minSdkVersion(0x0101020c)=(type 0x10)0x13
 A: android:targetSdkVersion(0x01010270)=(type 0x10)0x1e

「targetSDKVersion」(=Target API Level)が「0x1e」(10進数で「30」)となっている事が確認出来ました。

補足.2

まぁ、かなり特殊なケースかも知れませんが、自分の場合に、Player Settingsビューを開く際に、Unityのコンソールに毎回下記のエラーが表示され、うまくAPI levelの更新が出来ませんでした。

CommandInvokationFailure: Failed to update Android SDK package list.
C:/Program_Files/Unity/Hub/Editor/2019.4.1f1/Editor/Data/PlaybackEngines/AndroidPlayer\SDK\tools\bin\sdkmanager.bat --list

stderr[
?w?????p?X?????????????B
]
stdout[
Loading package information…

「sdkmanager.bat –list」の実行時に、標準エラー(stderr)にエラーが出ていて失敗と判定されているようでした。

コンソールの標準エラーは文字化けしていて読めませんが、PowerShellで「sdkmanager.bat –list」実行すると、先頭に「指定されたファイルが見つかりません」と表示されるので多分これでしょう。

しかし、batファイルの先頭にecho文を入れても、その前に「指定されたファイルが見つかりません」が表示されます。

「???」

色々調べてみると、レジストリの

HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun

にAnacondaのバッチが指定してありました。

最近Anacondaはアンインストールしたため、そのバッチは存在しなくなったのですが、この設定が残っていたため、毎回バッチファイルを起動する際、anacondaのバッチファイルを探しに行って「指定されたファイルは見つかりません」と表示されていたようです。

AutoRunのキーの値を空にした所、コンソールにエラーが表示されることがなくなり、更新したAPIレベルも正常に表示される様になりました。

※他にも、起動時に「”Microsoft (R) Visual C# Compiler version 2.9.1.65535 (9d34608e) Copyright (C) Microsoft Corporation. All rights reserved.” Error Unity」がエラーとして表示されていましたが、それも表示されなくなりました。


前の記事次の記事
No.05(AdMobの導入でハマった件)編集中