Android

android からapkを取得して、AndroidManifest.xmlを見る方法

More than 1 year has passed since last update.

はじめに

Androidの暗黙的インテントを使用して、他のアプリを起動しようと思いました。
起動するためには、他アプリの以下の情報が必要だとわかりました。

data android:scheme
data android:host
data android:pathPrefix

これらの情報を知るには、そのアプリのAndroidManifest.xmlを見ればよいです。
AndroidManifest.xmlを見るには、そのアプリのapkが必要です。

本ページは、android からapkを取得して、AndroidManifest.xmlを見る方法のメモです。

参考サイト

以下のサイトを参考にしました。サイト作成者の皆様、ありがとうございました。
http://nlogic.jp/?p=284
http://blog.clock-up.jp/entry/2015/02/28/android-pull-apk
https://qiita.com/T_2/items/0236162c294ffdf17ca8

確認環境

・Windows7のPowerShellを使用しました。
・Android_Sdkは、Android Studioインストール時にインストールしたものを使用します。
・Javaが使用できるPCであること。

方法

※パズル&ドラゴンのAndroidManifest.xmlを見る場合です。

1.PCのブラウザでGooglePlayのパズル&ドラゴンのサイトに行きます。
https://play.google.com/store/apps/details?id=jp.gungho.pad

パッケージ名は、URLの最後のほうにあります。パズル&ドラゴンの場合、jp.gungho.padがパッケージ名です。このタイミングだと、当たりがつくくらいで大丈夫です。

2.PCのPowerShellを起動し、Android_Sdkが存在するパスに移動します。
私の場合は、C:\Users\【ユーザー名】\AppData\Local\Android\sdk\platform-tools、でした。

3.PowerShellで、.\adb shell pm list packages -f、を実行する。実行すると、パッケージ一覧が出力されます。
.\adb shell pm list packages -f > a.txt、にすると、a.txtに一覧が出力されます。

4.1.で見つけたパッケージ名で検索します。
私の場合、package:/data/app/jp.gungho.pad-1/base.apk=jp.gungho.pad、が該当しました。
私のAndroidに入っているガンボーのアプリはパズル&ドラゴンだけなので、これが、パズル&ドラゴンのapkになります。

5..\adb pull [apkパス]、を実行して、androidからapkを取得します。
今回だと、.\adb pull /data/app/jp.gungho.pad-1/base.apk、です。

6.apkの拡張子をzipに変更してエクスプローラで開き、AndroidManifest.xmlを取り出します。AndroidManifest.xmlは、Android_Sdkが存在するパスに入れます。

7.AndroidManifest.xmlはバイナリ化されているので、変換操作が必要になります。変換には、AXMLPrinter2.jarを使用するので、ダウンロードしてAndroid_Sdkが存在するパスに入れます。
※jarの場所:https://code.google.com/archive/p/android4me/downloads

8.java -jar AXMLPrinter2.jar AndroidManifest.xml、を実行して、変換します。java -jar AXMLPrinter2.jar AndroidManifest.xml > a.txt、にすると、変換結果が出力されます。

結果を確認して、以下の必要な情報が確認できました。
 android:scheme="puzzleanddragons"
 android:host="jp.gungho.pad"
 android:pathPrefix="/"

他アプリを呼び出すコード

以下のように、Intentを使用すれば起動します。
※以下の処理をButtonのandroid::onClick、で呼び出して、パズル&ドラゴンが起動できました。

 // インテントの生成
 Intent intent = new Intent(Intent.ACTION_VIEW);
 // URI設定
 String strUri = String.format("%s://%s/", "puzzleanddragons", "jp.gungho.pad");
 Uri uri = Uri.parse(strUri);
 // URIをインテントに設定
 intent.setData(uri);
 // 次のアクティビティ起動
 startActivity(intent);

対象のアプリがないときに上記処理が実行されるとActivityNotFoundExceptionの例外で落ちます。忘れずにtry~catchをつけましょう。