ようへい

2012年10月31日水曜日

ruby_apk v0.4.1 を試す

Androidのパッケージファイル(apk)をAndroid SDK無しで解析できるRuby Gemが公開されたようなので試してみました。

準備

Ruby 1.9 系のインストーラをダウンロードしインストールする。
rubyinstaller-1.9.3-p286.exe をダウンロードしました。
RubyForge: Ruby Installer for Windows: ファイルリスト
http://rubyforge.org/frs/?group_id=167 コマンドプロンプトを起動する。
プロクシ環境配下の場合は、プロクシ設定を行う。
>set http_proxy=proxy.example.com:8080
色々入れる前にアップデート
>gem update --system --platform=mswin32
Latest version currently installed. Aborting.
rubyzipのインストール
>gem install rubyzip --platform=mswin32 --verbose
GET http://rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET http://production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
GET http://rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
200 OK
Installing gem rubyzip-0.9.9
Downloading gem rubyzip-0.9.9.gem
GET http://rubygems.org/gems/rubyzip-0.9.9.gem
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/gems/rubyzip-0.9.9.gem
200 OK
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/example.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/example_filesystem.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/example_recursive.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/gtkRubyzip.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/qtzip.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/write_simple.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/zipfind.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/compressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/constants.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/decompressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/deflater.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/dos_time.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/inflater.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/ioextras.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/null_compressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/null_decompressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/null_input_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/pass_thru_compressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/pass_thru_decompressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/settings.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/tempfile_bugfixed.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_central_directory.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_entry.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_entry_set.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_extra_field.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_file.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_input_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_streamable_directory.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_streamable_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zipfilesystem.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/README.md
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/NEWS
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/TODO
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/Rakefile
Successfully installed rubyzip-0.9.9
1 gem installed
Installing ri documentation for rubyzip-0.9.9...
rdoc --ri --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/rubyzip-0.9.9/ri lib --title rubyzip-0.9.9 Documentation --quiet
Installing RDoc documentation for rubyzip-0.9.9...
rdoc --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/rubyzip-0.9.9/rdoc lib --title rubyzip-0.9.9 Documentation --quiet
インストールを確認
>gem list --local

*** LOCAL GEMS ***

bigdecimal (1.1.0)
io-console (0.3)
json (1.5.4)
minitest (2.5.1)
rake (0.9.2.2)
rdoc (3.9.4)
rubyzip (0.9.9)
ruby_apkインストール
>gem install ruby_apk --platform=mswin32 --verbose
GET http://rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET http://production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
GET http://rubygems.org/quick/Marshal.4.8/ruby_apk-0.4.1.gemspec.rz
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/quick/Marshal.4.8/ruby_apk-0.4.1.gemspec.rz
200 OK
GET http://rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
200 OK
Installing gem ruby_apk-0.4.1
Downloading gem ruby_apk-0.4.1.gem
GET http://rubygems.org/gems/ruby_apk-0.4.1.gem
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/gems/ruby_apk-0.4.1.gem
200 OK
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/.rspec
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/Gemfile
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/Gemfile.lock
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/LICENSE.txt
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/README.md
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/Rakefile
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/VERSION
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/apk.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/axml_parser.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/access_flag.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/dex_object.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/info.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/utils.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/manifest.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/resource.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/utils.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/ruby_apk.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/ruby_apk.gemspec
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/apk_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/axml_parser_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample.apk
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_AndroidManifest.xml
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_classes.dex
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_resources.arsc
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_resources_utf16.arsc
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/access_flag_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/dex_object_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/info_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/utils_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/manifest_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/resource_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/ruby_apk_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/spec_helper.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/utils_spec.rb
Successfully installed ruby_apk-0.4.1
1 gem installed
Installing ri documentation for ruby_apk-0.4.1...
rdoc --ri --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/ruby_apk-0.4.1/ri lib LICENSE.txt README.md --title ruby_apk-0.4.1 Documentation --quiet
Installing RDoc documentation for ruby_apk-0.4.1...
rdoc --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/ruby_apk-0.4.1/rdoc lib LICENSE.txt README.md --title ruby_apk-0.4.1 Documentation --quiet
インストールを確認
>gem list --local

*** LOCAL GEMS ***

bigdecimal (1.1.0)
io-console (0.3)
json (1.5.4)
minitest (2.5.1)
rake (0.9.2.2)
rdoc (3.9.4)
ruby_apk (0.4.1)
rubyzip (0.9.9)
よし、準備が整った。

実行

こんなコードを書いて、適当なapkをくわせる。
require 'ruby_apk'

apk = Android::Apk.new(ARGV.first)
m = apk.manifest
puts "package_name: #{m.package_name}"
puts "version_name: #{m.version_name}"
出力結果
package_name: com.blogspot.logroid
version_name: 2.2
SDK無しで情報取れるのは良いんだけど、まだまだ解析がイマイチ。
apktoolでデコードするとこんな感じのAndroidManifest.xmlが取り出される。
※先頭から一部を抜粋
<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="220000" android:versionName="2.2" android:installLocation="internalOnly" package="com.blogspot.logroid"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16" />
    <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:resizeable="true" android:xlargeScreens="true" />
    <application android:label="@string/app_name" android:icon="@drawable/icon" android:name="TestApplication" android:hardwareAccelerated="true">
        <provider android:name=".provider.TestProvider" android:exported="false" android:authorities="com.blogspot.logroid.Test">
            <grant-uri-permission android:pathPrefix="/" />
        </provider>
apk_rubyではこんなxmlが取り出される。(manifest.to_xmlの結果)
<manifest xmlns:android='http://schemas.android.com/apk/res/android' android:versionCode='220000' android:versionName='2.2' android:installLocation='1' package='com.blogspot.logroid'>
    <uses-sdk android:minSdkVersion='7' android:targetSdkVersion='16'/>
    <supports-screens android:anyDensity='true' android:smallScreens='true' android:normalScreens='true' android:largeScreens='true' android:resizeable='true' android:xlargeScreens='true'/>
    <application android:label='@0x7f0b0016' android:icon='@0x7f0200dc' android:name='TestApplication' android:hardwareAccelerated='true'>
        <provider android:name='.provider.TestProvider' android:exported='true' android:authorities='com.blogspot.logroid.Test'>
            <grant-uri-permission android:pathPrefix='/'/>
        </provider>
android:labelが@0x7f0b0016となってしまっている。
これでは、リソースから、実態を参照することが出来ない。
ちなみにリソースも、name属性と値をペアで取る事ができず、取ることが出来るのは値のみでした。
name属性分からないから、実態と照らし合わせることが出来ない。
残念。
今のところ、比較的まともに取得できるのは、AndroidManifest.xmlのみのようです。
今後に期待です。
関連記事

0 件のコメント:

コメントを投稿