新規アプリケーションをPlay Consoleにアップロードする場合はAndroid App Bundle (AAB) 形式が義務付けられているが、既存アプリケーションでリリース手順を変更したくないとか、デバッグ用途でadbコマンドで端末にアプリケーションをインストールする場合はAndroid Application Package (APK) 形式でアプリケーションを生成することになる。
Play ConsoleにアップロードされたAABは、ストアによってインストールする端末に対応しAPKを生成し、ストアによって署名して端末にダウンロードされインストールされる。
アプリケーションのサイズを縮小するという目的で、デフォルト値がサイズ縮小の方向になるようになった。
Gradleで署名されたAPKを生成される場合は、サイズ縮小のための変更点について気にしなくても問題がないが、手動で署名する場合、変更点を気にするポイントがある。
アプリのサイズを削減する
APK内のネイティブ・ライブラリが圧縮されていると、インストール時にPackageManagerがAPKからネイティブ・ライブラリをコピーするが、圧縮されていないとコピーされない。圧縮されていないとAPKのファイルサイズは増加するが、ネイティブ・ライブラリのコピーが発生しないので、結果的に端末のストレージを消費するサイズが小さくなる。
APKのダウンロードサイズ
ネイティブ・ライブラリが非圧縮の方が、ストアの圧縮効率が高いと説明されており、結果、ダウンロードサイズが小さくなるそうだ。ただし、こちらの欠点は、Play Consoleにアプリをアップロードしないと、ダウンロードサイズが制限内か分からないことだ。
Android StudioにはAPK Analyzerが用意され、これを使うとダウンロードサイズを得ることができるが、サポートに確認したところ、これの計算式はストアでダウンロードサイズを得る計算式と異なるという説明だったので、目安程度と考えるのが良さそうだ。
ネイティブ・ライブラリの圧縮の指定
AndroidManifest.xmlのandroid:extractNativeLibsが"false"だと非圧縮となる。Android Gradle プラグイン (AGP) 4.2.0 以降は、build.gradleのuseLegacyPackagingに置き換わっている。また、extractNativeLibsのデフォルト値はminSdkVersionとAGPのバージョンによって異なる。
zipalignの-pオプション
APKに共有ライブラリ.soが含まれている場合は、-pオプションを指定して、mmapに適して4KBページ境界にライブラリをアライメントする必要がある。この対応はネイティブ・ライブラリが非圧縮となった場合に必須となったようだ。
本件は関係する項目がバラバラに説明されており、把握するのに苦労した。Googleが推奨する手順、Android StudioでアプリケーションをAAB形式で生成する場合、変更点を把握していなくても、気づかず、うまく行っていたと思うが、非推奨の手順を選択していると罠に引っかかることがある。今回、APK内の共有ライブラリ.soは圧縮から非圧縮に変わり、Gradleで署名していない場合、zipalignコマンドの-pオプションの指定が必須になっていたとは…
【関連情報】
アプリへの署名
APK Analyzer でのビルドの分析
android:extractNativeLibs
ネイティブ コードと Java コードを削減する
非圧縮ネイティブ ライブラリのパッケージ化(デフォルト)
zipalign
There are explanations of similar concepts, and the content is difficult to understand.
Cocoa.swift
Cocoa勉強会 関東
Cocoa練習帳