[Xamarin] Android App Bundle対応がリリースされたので試してみた

Visual Studio 2019のバージョン16.2がリリースされ、Android App Bundleが正式対応しました!

というわけで、早速試してみました!!

目次

環境

  • Windows
    • Windows 10 Pro
    • Visual Studio Community 2019: 16.2
  • macOS
    • macOS Mojave 10.14.5
    • Visutal Studio Community 2019 for Mac: 8.2
    • Xcode: 10.3
  • Android
    • Pixel 3a: Android 9
  • Xamarin
    • Xamarin: 16.2.0.90
    • Xamarin.Android SDK: 9.4.0.51
    • Xamarin.iOS and Xamarin.Mac SDK: 12.14.0.110

Google Play アプリ署名を有効にする

Google Play アプリ署名の使用 | Play Consoleヘルプを参考に実施します。

「Java Keystore から鍵をエクスポートしてアップロードする」を選択して、アプリ署名の秘密鍵アップロード鍵の証明書をアップロードします。

「Java Keystore から鍵をエクスポートしてアップロードする」を選択する

アプリ署名の秘密鍵

keystorealiasの値は、既存のモノを用います。

java -jar pepk.jar --keystore=xxxx.keystore --alias=hoge --output=encrypted_private_key_path --encryptionkey=abcdefg...

生成されたencrypted_private_key_pathをアップロードします。

アプリ署名の秘密鍵をアップロード

アップロード鍵の証明書

既存のkeystoreに新しい鍵を追加します。別のkeystoreでもOKだと思います。

keytool -genkey -v -keystore xxxx.keystore -alias upload -validity 10000 -keyalg RSA

続いて、鍵をPEM形式でエクスポートします。

keytool -export -rfc -keystore xxxx.keystore -alias upload -file upload_certificate.pem

生成されたupload_certificate.pemをアップロードします。

アップロード鍵の証明書をアップロード

登録する

最後に「完了」を押しましょう!!

「このアプリでは Google Play アプリ署名が有効です」と表示があればOKです!

アプリ証明が有効になる

Android App Bundleに対応する

Android Manifestファイルの修正

Androidのバージョンが「6.0 Marshmallow (API level 23) から 8.1 Oreo (API level 28)」の端末にインストールされる場合、android:installLocationinternalOnlyにしないと機能しないとの事なので、対応します。

Limitation: For apps deployed to devices running Android versions between 6.0 Marshmallow (API level 23) and 8.1 Oreo (API level 28), this feature currently only works if the app has the android:installLocation attribute set to "internalOnly" in the Android manifest.

manifestタグに追加(ある場合は設定値を変更)します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="jp.xxx.yyy.zzz"
          android:installLocation="internalOnly"
          android:versionCode="123"
          android:versionName="1.2.3">

csprojファイルの修正

Visual Studioのプロジェクト設定には項目がないため、Androidプロジェクトの***.Android.csprojを直接修正します。

This new build option is not yet surfaced in the Visual Studio project property pages.

Releaseビルド用のPropertyGroupが既にあると思うので、適当に<AndroidPackageFormat>aab</AndroidPackageFormat>を追加します。

ビルド時間が増えるため、Debugビルドには追加していません。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <AndroidPackageFormat>aab</AndroidPackageFormat>
</PropertyGroup>

ビルドする

「アーカイブ」コマンドは未サポート

お世話になってる「アーカイブ」コマンドでは、本機能は未サポートです。

Additionally, the Build > Archive command does not yet support this feature.

アーカイブコマンドは未サポート

そのため、コマンドでビルドを行います。

msbuildのPATHを通す(Windows)

WindowsでmsbuildのPathが通ってなかったので、環境変数のPathに下記を追加しました。

  • C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin

インストールした環境で微妙に異なるかもしれません。必要に応じて確認してください。

ビルド実行

Windows

コマンドプロンプトまたはPowerShellを起動し、Androidプロジェクトのフォルダ(***.Android.csprojがあるフォルダ)に移動します。

その後、下記コマンドを実行すればビルドが走ります。(万全を期すには、Visual Studioを起動して事前にReleaseビルドしておくと良いかもですね)

各パラメータの値は、署名プロパティを参考に、各自で修正してください。

なお、アップロード用のkeystoreとAliasを指定してください。

msbuild hoge.Android.csproj `
  -t:SignAndroidPackage `
  -p:Configuration=Release `
  -p:AndroidKeyStore=True `
  -p:AndroidSigningKeyStore=D:\OneDrive\App\keystore\xxxx.keystore `
  -p:AndroidSigningStorePass=password `
  -p:AndroidSigningKeyAlias=upload `
  -p:AndroidSigningKeyPass=password

できました!

aabファイルができた様子(Windows)

Mac

Windowsと同様です。ターミナルを起動し、Androidプロジェクトのフォルダで下記コマンドを実行します。

msbuild hoge.Android.csproj \
  -t:SignAndroidPackage \
  -p:Configuration=Release \
  -p:AndroidKeyStore=True \
  -p:AndroidSigningKeyStore=/Users/name/OneDrive/App/keystore/xxxx.keystore \
  -p:AndroidSigningStorePass=password \
  -p:AndroidSigningKeyAlias=upload \
  -p:AndroidSigningKeyPass=password

できました!

aabファイルができた様子(Mac)

apksファイルを作成して端末にインストールする

下記を参考に実施します。

Windows

apksファイルの作成

ここでは、アプリ署名用のkeystoreとaliasを指定します。

java -jar D:\OneDrive\App\bundletool.jar build-apks `
  --bundle=anyname.aab `
  --output=anyname.apks `
  --ks=D:\OneDrive\App\keystore\xxxx.keystore `
  --ks-pass=pass:password `
  --ks-key-alias=hoge `
  --key-pass=pass:password

インストール

java -jar D:\OneDrive\App\bundletool.jar install-apks --apks=anyname.apks

Mac

apksファイルの作成

bundletool build-apks \
  --bundle=anyname.aab \
  --output=anyname.apks \
  --ks=/Users/name/OneDrive/App/keystore/xxxx.keystore \
  --ks-pass=pass:password \
  --ks-key-alias=hoge \
  --key-pass=pass:password

インストール

bundletool install-apks --apks=anyname.apks

Google Play Consoleにaabファイルをアップロード

APKと同じように、任意のリリース管理にaabファイルをアップロードすればOKです。

aabファイルをアップロードする

適当なアプリで試しましたが、ダウンロードサイズが約20%減少しました!!!

ダウンロードサイズが減った様子

さいごに

「アーカイブ」の対応が待ち遠しいです!!

インストールで一手間かかりますが、Xamarinアプリはapkサイズが大きくなりがちなので、活用していきたいです。

参考