【Android】ADBコマンドでアプリをAPKとして保存する方法

この記事では、AndroidスマホにインストールしたアプリのAPKをADBコマンド経由で抽出(保存)する方法を書きます。
ADBコマンドを使える環境を用意して、専用のコマンドを実行することでAndroidスマホにインストールしているAPKを抽出(保存)できます。
Windows11のPCでADBを使えるように準備する必要がありますが、インストールしているアプリのAPKを抽出する方法の中でも上位に安全性が高いです。
似たようなものだと「ML Manager: APK Extractor」などの用意されている外部アプリを利用するパターンがあります。この方法だとGoogle PlayからアプリをインストールしてUIに沿って実行すれば簡単に作成できます。
ADBと違って初心者にとっては手軽で便利だと思います。一方で外部アプリに頼ることによる弊害(セキュリティリスク)などもつきまとってきます。
個人的にはADBを用意・構築できる知識と環境がある場合、ADBのほうがおすすめです。
前提
本記事は、既にAndroid側と接続するPC側(Windows)でADBを使える状態にしている前提です。
「ADB?何それ?」って方はまず以下の記事を読んでADB環境を構築してみてください。
ADBでAndroidアプリのAPKを作成する手順
WindowsとAndroidを接続する
WindowsとAndroidスマホ(筆者の場合Xiaomi 15 Ultra)を接続して、いつでもADBコマンドを実行できるようにします。
Android側はUSBデバッグオンにします。
コマンドプロンプトの起動
コマンドプロンプトを管理者権限で起動します。管理者じゃなくていい場合もありますが、少しでもトラブル発生する可能性を減らすために管理者のほうがいいかなと思います。

APKにしたいアプリのパッケージ名を調べる
以下のコマンドを実行して、APKとして保存したいアプリのパッケージ名を調べるか、「Package Name Viewer」などのアプリを利用して調べます。
adb shell pm list packages -3個人的にはコマンドプロンプト上で探すのが難しい場合、アプリに頼っていいかなと思っています。アイコンも表示されて視覚的にも操作的にも楽です。

ただし、外部アプリを導入するセキュリティリスクが怖い方はコマンドプロンプトを使いましょう。
コマンドプロンプトで上記のコマンドを実行すると、ユーザーがGoogle Playなどからインストールしたアプリが一覧表示されます。

通常、全部のアプリを一覧表示するコマンドは「adb shell pm list packages」コマンドです。ただ、それだとシステムアプリ(プリインストール)まで全部表示してしまい、お目当てのアプリを探すのに苦労します。
自分がどうしたいかによって使い分けてみましょう。システムアプリのみ表示させたい場合は「adb shell pm list packages -s」です。
以下、公式ドキュメントにあったのを書いておきます。
::すべてのパッケージを表示(基本のやつ)
adb shell pm list packages
::パッケージ名に「Google」を含むアプリを検索
adb shell pm list packages google
::関連ファイル(APKの場所を表すパス)も表示
adb shell pm list packages -f
::無効化されているパッケージのみ表示
adb shell pm list packages -d
::有効なパッケージのみ表示
adb shell pm list packages -e
::システムアプリだけ表示
adb shell pm list packages -s
::ユーザーがインストールしたアプリだけ表示
adb shell pm list packages -3
::インストーラー情報つきで表示
adb shell pm list packages -i
::アンインストール済みも含めて表示
adb shell pm list packages -u
::指定ユーザー(例:user 0)のパッケージを表示
adb shell pm list packages --user 0
list packages [options] filter
すべてのパッケージを出力します。必要に応じて、filter のテキストをパッケージ名に含むパッケージだけを出力することもできます。以下のオプションがあります。-f: 関連ファイルを表示します。
Android Debug Bridge(adb) | Android Studio | Android Developers
-d: 無効なパッケージだけを表示するようにフィルタします。
-e: 有効なパッケージだけを表示するようにフィルタします。
-s: システム パッケージだけを表示するようにフィルタします。
-3: サードパーティ パッケージだけを表示するようにフィルタします。
-i: パッケージのインストーラを表示します。
-u: アンインストールしたパッケージを含めます。
–user user_id: クエリ対象のユーザー空間。
もしアプリ名から何となくのパッケージ名を予測できるなら二番目に書いている「adb shell pm list packages 〇〇」を使うと便利です。
::パッケージ名に「Google」を含むアプリを検索
adb shell pm list packages google入力したキーワードを含むパッケージ名だけに結果を絞り込めます。
上記コマンドのままだと、大文字小文字が区別されて検索されます。パッケージ名は基本小文字なので、「Google」とかにしちゃうとヒットしなくなります。小文字で検索します。

パイプ記号(|)で区切った後、「findstr /I」を書いて検索したいパッケージ名(部分一致でOK)を書くと、大文字小文字を無視できます。大文字で検索しても小文字がヒットします。
::大文字小文字を区別せずまとめて検索したい場合
adb shell pm list packages | findstr /I Google
余談ですが、「sort」コマンドも人によっては便利かもしれません。結果をアルファベット順にソート(並び替え)してくれます。
::ユーザーがインストールしたアプリをアルファベット順に表示
adb shell pm list packages -3 | sort
::パッケージ名に「Google」を含むアプリをアルファベット順に表示
adb shell pm list packages google | sortインストールしているアプリ数が多くて並び替えないと見にくい方におすすめです。
自分がAPK抽出したいアプリを見つけたら、パッケージ名(「package:」から始まる行)を丸々コピーして、どこかメモ帳などに書き込んでおきます。
「adb shell pm path」の実行
Android端末にあるAPKファイルの場所(パス)を調べる作業です。
アプリをインストールした時点でAndroid端末の奥底にはAPKが生成されていますが、Android単体だとアクセス権限がないので開けません。そこでADB経由でパスを調べてあげます。
パッケージ名をメモした場所に以下のパスを貼り付けます。
adb shell pm path 〇〇〇
「〇〇〇」の部分を自分がAPKにしたいアプリのパッケージ名に置き換えます。「package:」という文字列は不要です。というかあったらエラーがでます。
adb shell pm path jp.go.cas.mpa
置き換えられたらコマンドプロンプトに貼り付けて実行します。
以下のように「package:」から始まり「base.apk」で終わる行がでてきたら成功です。その行をコピーします。
C:\Windows\System32>adb shell pm path jp.go.cas.mpa
package:/data/app/~~67tNHOBGfu9wHTwqusE4fQ==/jp.go.cas.mpa-vhgYYoPWVvcUhzA7VWaO4A==/base.apk
C:\Windows\System32>
「app/」の後とパッケージ名(上記だと「jp.go.cas.mpa」)の後の文字列は多分毎回ランダムなので同じである必要はないです。
Xiaomiにプリインストールされている電卓アプリ(com.miui.calculator)で試してみました。以下のようになりました。
C:\Windows\System32>adb shell pm path com.miui.calculator
package:/product/data-app/MIUICalculatorGlobal/MIUICalculatorGlobal.apk
C:\Windows\System32>
まれに一行ではなく複数行表示されるアプリがあります。この場合少々厄介です。例えば、以下は餃子の王将アプリです。

C:\Windows\System32>adb shell pm path jp.co.ohsho.app
package:/data/app/~~fkjzr-Bfv1mJ6qTxjNWs-Q==/jp.co.ohsho.app-d4B9tyojQEIopVep5_amcw==/base.apk
package:/data/app/~~fkjzr-Bfv1mJ6qTxjNWs-Q==/jp.co.ohsho.app-d4B9tyojQEIopVep5_amcw==/split_config.arm64_v8a.apk
package:/data/app/~~fkjzr-Bfv1mJ6qTxjNWs-Q==/jp.co.ohsho.app-d4B9tyojQEIopVep5_amcw==/split_config.en.apk
package:/data/app/~~fkjzr-Bfv1mJ6qTxjNWs-Q==/jp.co.ohsho.app-d4B9tyojQEIopVep5_amcw==/split_config.ja.apk
package:/data/app/~~fkjzr-Bfv1mJ6qTxjNWs-Q==/jp.co.ohsho.app-d4B9tyojQEIopVep5_amcw==/split_config.xxxhdpi.apk
C:\Windows\System32>Split APK(分割APK)と呼ばれるタイプです。
「base.apk」が必要なAPKで、状況によって「split_config.〇.apk」たちも必要になることがあります。複数行表示されたからといって全部のAPKが必要なわけではなく、「base.apk」だけで問題なく動作するアプリもあります。
コピーした行をメモ帳に貼り付けておきます。
APK抽出コマンドの作成
続いてメモ帳に以下のコマンドも貼り付けます。
adb pull 〇〇 %USERPROFILE%\myna.apk「〇〇」の部分を「package:」から始まり「base.apk」で終わる行に置き換えます。

「package:」という文字はあるとエラーがでてしまうので削除します。「package:」以降(「/data/app/」から始まるやつ)です。
例えば、試しに取得してみたマイナポータル(jp.go.cas.mpa)だと以下のようになります。
adb pull /data/app/~~67tNHOBGfu9wHTwqusE4fQ==/jp.go.cas.mpa-vhgYYoPWVvcUhzA7VWaO4A==/base.apk %USERPROFILE%\myna.apk要所要所で半角空白があるのでうっかり削除して構文を崩さないよう注意です。
「%USERPROFILE%\myna.apk」というのは、Windowsの「%USERPROFILE%」に「myna.apk」という名前でAPK抽出しますよ~って意味です。
自分で好きな場所・名前を指定してOKです。「myna.apk」は単に僕がマイナポータルのAPKを抽出する際につけた名前です。
ただし、Cドライブなどを指定すると、権限の都合でアクセスできずエラーがでる場合があります。日本語が含まれるパスだと文字化けしてエラーになる可能性もあります。
日本語環境下においてのパス指定って結構シビアです。様々な原因でうまくいかないことが多いので、なるべく問題発生しないよう端的な「%USERPROFILE%」にしています。
これならよほどカスタマイズしていない限り、パスによる問題発生はないと思います。
「adb pull 〇〇 %USERPROFILE%\〇〇.apk」の実行
いよいよAndroidの奥底に眠る指定アプリのAPKをPCにコピー(抽出)します。
作成したコマンドをコマンドプロンプト上にコピペしてEnterで実行します。うまく成功したら以下のようなメッセージ結果になります。
C:\Windows\System32>adb pull /data/app/~~67tNHOBGfu9wHTwqusE4fQ==/jp.go.cas.mpa-vhgYYoPWVvcUhzA7VWaO4A==/base.apk %USERPROFILE%\myna.apk
/data/app/~~67tNHOBGfu9wHTwqusE4fQ==/jp.go.cas.mpa-vhgYYoP...e pulled, 0 skipped. 361.3 MB/s (32784796 bytes in 0.087s)
C:\Windows\System32>
「%USERPROFILE%」フォルダー内にAPKが抽出されています。Android側に生成されるのではなく、PC側に生成されます。
<!--以下のパスをエクスプローラーに貼り付けて開くと「myna.apk」という名でマイナポータルのAPKがある-->
%USERPROFILE%
分割APKだったり、容量が大きかったり、特殊なアプリだった場合は、APKにしてもその後正常にインストールできない可能性があります。
指定場所にAPKが抽出されている時点でADB側は問題なく成功したと思われるので、疑うべきはAPKにしたアプリです。例えば、メーカー専用のプリインストールアプリを他社スマホにAPKでインストールしようとしても失敗することが多いです。
各スマホのセキュリティ設定によっても弾かれる/インストールできない設定になっていることもあるので、そこらへんも調べるといいです。(例:「機種名 APK インストールできない」とかでGoogle検索する)
感想
以上、AndroidスマホにインストールしたアプリのAPKをADBコマンド経由で抽出(保存)する方法でした。
XiaomiにプリインストールされているアプリもAPKとして保存できました。例:電卓(com.miui.calculator)

まぁAPKとして抽出できたはいいけど、それを使ってインストールする時うまくいくかどうかはまた別です。システムアプリはわりとできないことも多い印象です。
ADBコマンドを使った方法は「ML Manager: APK Extractor」などのアプリを使う方法と比べて、失敗するパターンが多く、原因特定作業が大変ですが、その分安全性は高いです。
外部アプリに頼る方法と違って、間に何も介入せず直接APK抽出するので、PC自体がウイルスに感染している場合や、APKにするアプリ自体が悪意あるものだった場合を除いて確実にそのまんまの状態でAPKにできます。
| ADBを使ってAPK抽出するメリット・デメリット | |
|---|---|
| メリット | デメリット |
| 外部アプリを使わないので改竄リスクが少ない | PCが必要(スマホ単体ではできない) |
| 「この外部アプリ安全かな?」、 「このアプリ僕のスマホで動くかな?」 「アップデートで使いづらくなった…。有料版限定になっちゃった…」 などの外部アプリを使う時の問題が一切ない | エラーがでた時、 「パス指定が原因?」、 「USBデバッグなどのAndroid側が原因?」、 「環境変数通ってなかったり、常駐ソフトが邪魔したりPC側が原因?」 「構文が間違っているのが原因?」 などの原因を特定・解決する能力が求められる |
| PCでの作業に慣れているとむしろコマンドプロンプトがありがたい | 意図せず余計な設定をいじって変になる可能性がある |
| やろうと思えば高度な自動化スクリプトなども可能(あらかじめ決められた外部アプリより自由度が高い) | ADB環境の構築が手間 |
本記事で利用したアイコン:Android の アイコン










ディスカッション
コメント一覧
まだ、コメントがありません