手元にソースコードがない任意のAndroidアプリで、そのアプリが応答できるURLスキームを調べたいときがある。
以下の方法で調べることができる。
1. 対象のアプリのpackage nameを調べる
play storeのURLをみればid=
以降がpackage nameになっている。
2. 対象アプリのAPKを取得する
実機にインストール、adbでapkのパスを調べてadb pullするのが早い
adb shell pm list packages -f | grep com.example.targetapp
すると以下のような出力が得られる。
package:/data/app/com.example.targetapp-1/base.apk=com.example.targetapp-1
これをもとにadb pullする。
adb pull /data/app/com.example.targetapp-1/base.apk
3. intent-filterの内容を調べる
aaptをつかえばパッケージの詳細を調べることができる。aaptはSDK HOMEの build-tools/{build tool version}
以下にある。
aapt l -a base.apk
出力からintent-filterの項目を探して、応答しそうなURLをつくればよい。
たとえば、以下のようなintent-filterの場合、 http://sugoiapp/some/interesting/path
に応答しそうだということがわかる。
E: intent-filter (line=xxx)
A: android:autoVerify(0x00...)=(type 0x12)0xffffffff
E: action (line=xxx)
A: android:name(0x00...)="android.intent.action.VIEW" (Raw: "android.intent.action.VIEW")
E: category (line=xxx)
A: android:name(0x00...)="android.intent.category.DEFAULT" (Raw: "android.intent.category.DEFAULT")
E: category (line=xxx)
A: android:name(0x00...)="android.intent.category.BROWSABLE" (Raw: "android.intent.category.BROWSABLE")
E: data (line=xxx)
A: android:scheme(0x00...)="http" (Raw: "http")
E: data (line=xxx)
A: android:scheme(0x00...)="https" (Raw: "https")
E: data (line=xxx)
A: android:host(0x00...)="sugoiapp" (Raw: "sugoiapp")
E: data (line=xxx)
A: android:pathPrefix(0x00...)="/some/interesting/path" (Raw: "/some/interesting/path")
4. 実際にintentを起動してみる
adbコマンドをつかえば、実際にそのURLスキームをintentとして起動することができる。
adb shell am start -a android.intent.action.VIEW -d http://sugoiapp/some/interesting/path