7.

APK(.apk)とは — Android アプリのパッケージ形式

編集
この記事の要点
  • APK (.apk) は Android アプリの配布形式、実体は ZIP
  • 主要内容: AndroidManifest.xml(バイナリ XML)、classes.dex(Dalvik バイトコード)、resources.arscres/assets/lib/
  • 署名は apksigner(v1=JAR / v2=APK Signature Scheme / v3=Key Rotation / v4=ストリーミング)
  • Play Store には AAB (.aab) 形式で提出するのが必須、APK は内部配布・サイドロード向け
  • aapt / apkanalyzer で中身解析、adb install pkg.apk で端末投入

要点

  • APK(Android Package、.apk)は、Android アプリの配布・インストール用ファイル形式。
  • 実体は ZIP であり、AndroidManifest.xml(バイナリ XML)、classes.dexres/resources.arsc、ネイティブライブラリ(lib/<abi>/)、署名情報を内包する。
  • Play ストア配布は現在 AAB(Android App Bundle)が必須だが、デバイスへ最終的にインストールされるのは依然として APK(端末ごとに最適化されたもの)。
  • 署名は APK Signature Scheme v1〜v4apksigner で付与し、未署名 APK はインストールできない。

概要

APK は 2008 年の Android 1.0 から続くアプリ配布形式で、JAR(Java Archive)の構造を Android 向けに拡張したものとして始まった。基底は ZIP なので アーカイブ・圧縮形式の一種だが、内部に Android ランタイムが期待する固有のレイアウトを持つ点でアプリパッケージとして独立した存在になっている。

Google Play は 2021 年から新規アプリに AAB(.aab)を必須化したが、AAB は配布前段階のフォーマットであり、Play 側で端末ごとの APK(Split APK)に再パッケージされてからユーザー端末に届く。つまり「端末上の実体は今も APK」という構造は変わっていない。

内部構造

APK を unzip -l app.apk で覗くと、典型的に次のメンバが含まれる。

  • AndroidManifest.xml — アプリのパーミッション、エントリポイント、最小 SDK、Activity / Service / Receiver の宣言。テキスト XML ではなくバイナリ XML(AXML)として格納されている。
  • classes.dex / classes2.dex … — Java/Kotlin バイトコードを Android 用にコンパイルしたDalvik Executable。Multidex で複数になる。
  • resources.arsc — リソース ID と値(文字列、寸法、カラーなど)のテーブル
  • res/ — レイアウト XML、drawable、mipmap などのリソース
  • assets/ — フォントや任意データなど、生のファイル
  • lib/<abi>/arm64-v8ax86_64 等のネイティブ .so
  • META-INF/MANIFEST.MFCERT.SFCERT.RSA 等の署名情報(v1 署名の場合)

AndroidManifest.xml は AAPT2 でコンパイル後、AXML としてバイナリ化される。apktool でデコードするとテキスト XML が復元され、たとえば次のような内容を確認できる。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld">
  <application android:label="Hello">
    <activity android:name=".MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

主な用途

  • Google Play 経由のアプリ配布(端末側に届く最終形は APK)
  • サードパーティストア配布 — Amazon Appstore、Galaxy Store、F-Droid、Huawei AppGallery など
  • サイドローディング — Web から直接 .apk をダウンロードしてインストール。「提供元不明のアプリ」設定が必要
  • 社内配布(MDM/EMM) — Intune、Workspace ONE、Google Endpoint Management 経由の業務アプリ配布
  • 動作確認・QAadb install app.apk で開発端末に直接導入

関連形式との比較

  • vs AAB(.aab) — AAB は Google Play への提出形式で、Play が端末ごとに最適化された Split APK を生成して配信する。AAB 単体ではインストールできない。
  • vs IPA — IPA は iOS 用、APK は Android 用。どちらも ZIP ベースだが、配布制限や署名スキーム、リサインポリシーが大きく異なる。
  • vs EXE / MSI — APK はモバイル OS のサンドボックスを前提とした宣言的パーミッションモデル。EXE/MSI はデスクトップ OS 上で広い権限を持ち得る。
  • vs ZIP — APK は ZIP として展開できるが、最終的に署名検証されることを前提に作られている点が異なる。

コマンド・ツール

  • adb install app.apk — 接続中の端末/エミュレータへインストール
  • adb install -r app.apk — 既存を上書き再インストール(署名一致が必要)
  • adb shell pm list packages — インストール済みパッケージ一覧
  • aapt2 dump badging app.apk — パッケージ名・バージョン・パーミッション等の確認
  • apksigner sign --ks key.jks app.apk — APK Signature Scheme v2/v3/v4 で署名
  • apksigner verify -v app.apk — 署名検証
  • zipalign -v 4 unsigned.apk aligned.apk — 4 バイト整列(v2 署名前に必要)
  • apktool d app.apk / apktool b dir — 逆コンパイル / 再パック(解析・ローカライズなど)
  • bundletool build-apks --bundle=app.aab --output=app.apks — AAB から Split APK セットを生成

注意点

  • 署名の鍵を絶対に失わない。Play Console での更新は同じ鍵での署名が必須。Play App Signing に登録していれば Google 側が保持してくれるが、登録していない場合は鍵紛失 = アプリ更新不能になる。
  • v1 のみの署名は脆弱。Android 7.0 以降の v2 以上を併用すること。apksigner--v1-signing-enabled / --v2-signing-enabled などで個別に制御できる。
  • サイドロード APK の出所には十分注意。野良 APK は不正アプリの主要な経路で、EXE 同様にマルウェアになり得る。
  • パーミッションは AndroidManifest で宣言済みのものしか使えない。実行時パーミッション(位置情報、カメラなど)はランタイムで再度ユーザー承認が必要。
  • 64bit ABI 必須(Google Play では 64bit ライブラリ同梱が必須)。arm64-v8a を欠かすと配布拒否される。
  • クロスサイトナビ禁止のため、本記事から外部サイトの解析記事には直接リンクしない。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. EXE(.exe)
  2. DLL(.dll)
  3. MSI(.msi)
  4. DMG(.dmg)
  5. DEB(.deb)
  6. RPM(.rpm)
  7. APK(.apk)
  8. IPA(.ipa)
  9. AppImage(.appimage)
  10. app(.app)

最近更新/作成されたページ