apkからAndroidManifest.xmlを作成する方法 | ヘビィ・SMD!

ヘビィ・SMD!

そんな・・・バナナ!!
1. 甘え度+10 恐れ度+10 寿命-1週間
2. 甘え度+10 恐れ度-10
3. 甘え度-10 恐れ度-10 寿命+1週間

androidを扱った某案件で、
1. アプリのapkファイルはもらえる
2. アプリのAndroidManifest.xmlはもらえない
3. しかしAndroidManifest.xmlが必要だ

という状況に陥った。
パートナーさんから、「こういうのあるんで使ってみては?」と言われたので
あるツールを利用したところ、なるほどどうして使えるではないか。

備忘録としてここに記載しておきます。
が、リバースエンジニアリングの一種なので取り扱いは慎重に。
じゃないと最悪変な髪型の人と関係を持つ可能性も。
$ヘビィ・SMD!
冗談です。

さて、apkはjarで解凍することが出来ます。
解凍するとAndroidManifest.xmlもきちんとそこに存在します。
が、しかしこれ、バイナリデータとなっておりテキストエディタでは内容を読み取れません。
上で書いた通り、パートナーさんに紹介してもらったツールの登場です。

AXMLPrinter2.jar
というツール。
「Prints XML document from binary XML file」
infoseek先生に意味を尋ねた
「XMLが2進のXMLファイルから記録する印刷」
日本語でおk

茶番はさて置き、以下に手順をば。
※ jdkは6系を使っており、pathも設定済みとします、あたりまえだけど。

■手順1. AXMLPrinter2.jarをダウンロードする

AXMLPrinter2.jarはGoogle Codeで公開されています。
http://code.google.com/p/android4me/downloads/detail?name=AXMLPrinter2.jar
ここからダウンロード可能です。
ダウンロードしたら、適宜ファイルを配置しておきます。
ここではC:\tmp にjarを配置しておきます。

■手順2. バイナリになったxmlを取得する

apkからAndroidManifest.xmlを取得します。
jarコマンドを使ってapkを解凍します。(私はLhaplusで解凍しましたが。)
解凍したAndroidManifest.xmlはバイナリ形式のはずです。
これをC:\tmpに配置します。

■手順3. AXMLPrinter2.jarの実行

バイナリのxmlをテキストデータに変換します。
C:\tmp に移動し、以下のコマンドを実行します。

C:\tmp>java -jar AXMLPrinter2.jar AndroidManifest.xml > hoge.txt

これで C:\tmp\hoge.txt にAndroidManifest.xmlのテキスト形式の内容が出力されているはずです。


元データとバイナリから変換後のデータとで比較もしてみた。
非常にシンプルな自作アプリのAndroidManifest.xmlを使っています。

元データ↓


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.gr.java_conf.smd877.CP500103"
android:versionCode="4"
android:versionName="4" >


<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.CAMERA"/>

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >

<activity
android:label="@string/app_name"
android:name=".CP500103Activity" >

<intent-filter >
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

バイナリから変換後のデータ↓


<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="4"
android:versionName="4"
package="jp.gr.java_conf.smd877.CP500103"
>

<uses-sdk
android:minSdkVersion="8"
>

</uses-sdk>
<uses-permission
android:name="android.permission.CAMERA"
>

</uses-permission>
<application
android:label="@7F040001"
android:icon="@7F020000"
>

<activity
android:label="@7F040001"
android:name=".CP500103Activity"
>

<intent-filter
>

<action
android:name="android.intent.action.MAIN"
>

</action>
<category
android:name="android.intent.category.LAUNCHER"
>

</category>
</intent-filter>
</activity>
</application>
</manifest>


一部ラベル系のパラメータは変換されたものになっているけど、読み解く分には問題ない感じす。