APK (ファイル形式)

**APK**（、アンドロイドアプリケーションパッケージ、エーピーケー）とは、Googleによって開発されたAndroid専用ソフトウェアパッケージのファイルフォーマットである。とも。

JARファイルをベースとしたZIP形式で、アーカイブファイルの一種である。

## 概要
APKファイルは、UbuntuやDebianなどのオペレーティングシステムで使われるDEBファイルや、Windowsのインストーラーで使われるMSIファイルと特徴が似ている。
APKファイルを作成するには、Android用に作成したプログラムをコンパイルして、その全てを一つのパッケージに統合させる。内部には仮想マシン用の実行可能ファイル、デジタル証明書、マニフェストファイルなどが格納されている。C言語などによるネイティブコードを利用するアプリケーション（NDKを用いて開発されたアプリケーション）の場合、プロセッサ (CPU) アーキテクチャごとの共有ライブラリ (.so) も含まれる。その他のファイル形式と同様に、拡張子を「.apk」にしなければいけない点を除き、名前を自由に付けることができる。

### インストール
APKファイルは、PCにソフトウェアをインストールする操作と同じように、決まった手順でAndroid端末にインストールできる。Google Playやキャリア（携帯電話会社）のアプリストアといった正式な頒布元からインストールすることを始めとして、他にも非公式のウェブサイトからダウンロードするか、PCからadb（Android Debug Bridge）コマンドラインツールを用いてUSB経由で転送するなどして、端末に直接インストールする方法もある。ただし、非公式のAPKはアプリストアの審査を受けていないことから、アプリストアで配布されているものと比較して、マルウェアなどの危険なアプリである可能性が高く、利用はユーザーの自己責任となる。

セキュリティ上の理由から、Android既定の設定では、非公式のAPKを直接インストールすることはできない。非公式のAPKを直接インストールするには、Android 4.x - 7.xまでの場合、事前に「設定」→「セキュリティ」→「提供元不明のアプリ」（提供元不明のアプリのインストールを許可する）のトグルスイッチをONにして、インストールを許可するように設定すればよいが、システム全体のセキュリティレベルが低下した状態になるので注意が必要である。Android 8.0以降は、APKのダウンロードおよびインストールに使用するアプリごとにインストールの許可を設定するようになり、また表示される項目名が「不明なアプリのインストール」（この提供元のアプリを許可）に変更された。ホーム画面からアプリアイコン長押し→「アプリ情報」→「不明なアプリのインストール」または「設定」→「アプリ」→「アプリ情報」→「不明なアプリのインストール」において、「この提供元のアプリを許可」のトグルスイッチをONにする。

## 構成
APKファイル内部の基本設計は以下の通りである。

* `META-INF`: ディレクトリ
** `MANIFEST.MF`: マニフェストファイル
** `CERT.RSA`: アプリケーションのアクセス権限リスト
** `CERT.SF`: MANIFEST.MF対応のSHA-1

```
Signature-Version: 1.0
 Created-By: 1.0 (Android)
 SHA1-Digest-Manifest: wxqnEAI0UA5nO5QJ8CGMwjkGGWE=
 ...
 Name: res/layout/exchange_component_back_bottom.xml
 SHA1-Digest: eACjMjESj7Zkf0cBFTZ0nqWrt7w=
 ...
 Name: res/drawable-hdpi/icon.png
 SHA1-Digest: DGEqylP8W0n0iV/ZzBx3MW0WGCA=
```

*`lib`: コンパイルされたコードが入ったディレクトリ、または他のディレクトリを複数のディレクトリに分割。
**`armeabi`: ARMアーキテクチャ用にコンパイルしたコード。
**`armeabi-v7a`: ARMv7用にコンパイルしたコード。
**`arm64-v8a`: ARMv8 64ビット用にコンパイルしたコード。
**`x86`: x86用にコンパイルしたコード。
**`x86_64`: x86-64 (x64) 用にコンパイルしたコード。
**`mips`: MIPS用にコンパイルしたコード。
* `res`: resources.arscにコンパイルしたコードを含むディレクトリ。
* `assets`: `res`フォルダに入れられないファイルが入るディレクトリ。(ZIPファイルやテキストファイル、バイナリファイルなど)
* `AndroidManifest.xml`: 別のマニフェストファイル、アプリケーションのタイトル、バージョン情報、アクセス権限、ライブラリファイルなどをバイナリXMLに変換したファイル。
* `classes.dex`: Javaクラスファイルからコマンドラインツール *dx* によりコンパイルされたファイル。Dalvik仮想マシンあるいはAndroid Runtimeで実行される。
* `resources.arsc`: バイナリXMLなど、プリコンパイルされたファイル。

## APK拡張ファイル
Google Playではユーザーによってダウンロードされる各APKファイルのサイズ上限が100MBまでと定められている。100MBを超えるデータを配布する場合、**APK拡張ファイル**を利用する方法がある。APK拡張ファイルは任意のフォーマットを利用できるが、暗号化に対応したopaque binary blob (obb) と呼ばれる独自フォーマットに変換するツール *jobb* も用意されている。拡張ファイルの分類は main と patch に分かれており、ファイル名は特定の命名規則に従う必要がある。各拡張ファイルのサイズ上限は2GBである。

## Multiple APK
通例、APKには複数の画面解像度と密度、複数のCPUアーキテクチャといった、デバイス構成に合わせた複数のファイルをすべて含めて1パッケージとするが、これはアプリパッケージが肥大化し、ユーザーがダウンロードしなければならないファイルサイズが増大する要因となる。Google Playでは個々のデバイス構成に合わせて別々のAPKファイルを用意し、ユーザーのダウンロードサイズを削減しつつ、1つの製品として管理するための仕組みとして、**Multiple APK**がサポートされている。ただしMultiple APKでは個別にパッケージ作成と署名が必要となり手間がかかるため、代替として後述するAndroid App Bundleの利用が推奨されている。

## Android App Bundle
ユーザーがダウンロードする必要のあるAPKファイルのサイズを削減するために、新しいアップロードフォーマットとして**[[Android App Bundle]]** (aab) が考案された。Playコンソールでaabをアップロードすると、Google Playがユーザーの実行環境に合わせて最適なAPKファイルを生成する (Dynamic Delivery)。aabを使用して公開されているアプリの場合、APKファイルのダウンロードサイズ上限は150MBとなる。なお、Android App BundleはAPK拡張ファイル (obb) をサポートしない。

2021年の下半期には、App Bundleの使用が必須となり、APK拡張ファイルのサポートが終了する予定となっている。大容量アセットの配信には、代替として**Play Asset Delivery** (PAD) を使用することが推奨されている。

## 脚注

## 関連項目
* Google
* Google Play
* Android (オペレーティングシステム)
* Android Studio
* Android Runtime
* Dalvik仮想マシン
* IPA - iOSアプリケーション用のアーカイブファイル。
* Microsoft Windows Installer