突然消失するかもしれないブログ

”とつきえブログ”

Android2.2/FroyoのAppsOnSDの仕組みについて

本エントリーは随時更新中です。

Android2.2/Froyoから標準でサポートされることになったAppsOnSD機能(従来Apps2SDと呼ばれていた機能)の概要をざっくりまとめてみました。

・Google公式のAppsOnSDに関する情報はこちら。
App Install Location | Android Developers

・AppsOnSD機能は、アプリのパッケージを暗号化してmicroSDにインストール(保存)し、microSDからアプリを実行することができる。

AndroidManifest.xmlで「android:installLocation=”preferExternal”」を指定するだけ。

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
android:installLocation=”preferExternal”
… >

・アプリによっては、Android端末内部のNAND(/data)にインストール(保存)したアプリを、microSDに移動して、microSDから実行することができる。

Android端末内部のpmコマンドを使用する。

adb shell pm setInstallLocation 2

・microSDを外部のPCなどからUSBマスストレージとしてマウントした場合は、AppsOnSD機能でmicoSDにインストール(保存)されているアプリは強制終了されるため、常駐するアプリには使用できない。

・アプリは端末毎にランダムに生成した暗号鍵でSDカードに暗号化されて保存されるので、インストールに使用した端末でしか使用できない。

・具体的には、以下のように保存される。

暗号鍵:/data/misc/systemkeys/AppsOnSD.sks

(Android端末内に保存されており、root権限がないと読み出せない)

復号化されたアプリパッケージ:/mnt/asec/アプリパッケージ名-1/pkg.apk

暗号化されたアプリパッケージ:/mnt/secure/asec/アプリパッケージ名-1.asec

以下で詳しく見ていきます。

SDKのエミュレータでAndroid2.2/Froyoを実行して、ddmsでエミュレータ内を覗くと以下のようになっています。

dfa2c80b-87c2-44c4-988f-3fef3f35d442

microSDはvfat形式で、microSDのルートディレクトリ(/.)が/mnt/sdcardにRead/Write可能なデバイスとしてマウントされます。このフォルダ配下は従来通り主にデータ保存用として使用されます。

/dev/block/vold/179:0 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

AppsOnSDを有効にしたアプリをインストールすると、/system/bin/voldが、dm-crypt?の暗号化ファイルシステムによってmicroSD上に暗号化してアプリパッケージファイルを保存します。

暗号鍵は、/data/misc/systemkeys/AppsOnSD.sksで、rootユーザしか読めないようになっています。

/mnt/asecにtmpfsというramdiskのような揮発的なファイルシステムがあり、

tmpfs /mnt/asec tmpfs rw,mode=755,gid=1000 0 0

/mnt/asecの下にReadonlyのディレクトリとして復号化されたアプリパッケージ毎のディレクトリが作成されてマウントされます。

※com.AndroidTestApp03-1は、AppsOnSDをAndroidManifest.xmlでAppsOnSDを指定したアプリのパッケージ名です。

/dev/block/dm-0 /mnt/asec/com.AndroidTestApp03-1 vfat ro,dirsync,nosuid,nodev,noexec,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

暗号化されたアプリパッケージファイルは、microSD上の/.android_secureにアプリパッケージ毎のコンテナファイル(.asecファイル)が作成されて保存されます。

/dev/block/vold/179:0 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

イマイチ用途がわからないフォルダが/mnt/sdcard/.android_secureと/mnt/secure/stagingです。

tmpfs /mnt/sdcard/.android_secure tmpfs ro,size=0k,mode=000 0 0

ところで、/system/bin/voldをstringsコマンドでテキスト文字列を抽出してみると面白いことがわかります。

キーワード的には、ASEC, device mapper, dm-crypt, loop device, LVM、といった感じでしょうか。

ソースがないというのもありますがとにかく謎が多いです。

$ strings vold

/mnt/secure/staging/android_secure
/mnt/asec_secure
Device %s, target %s mounted @ /mnt/secure/staging
/mnt/secure
/mnt/secure/staging/.android_secure
/mnt/secure/asec
/mnt/asec
/mnt/secure/asec/xwarp.img

create
Usage: asec create <container-id> <size_mb> <fstype> <key> <ownerUid>
finalize
Usage: asec finalize <container-id>
Usage: asec destroy <container-id> [force]
force
Usage: asec mount <namespace-id> <key> <ownerUid>
unmount
Usage: asec unmount <container-id> [force]
rename
Usage: asec rename <old_id> <new_id>
path
Usage: asec path <container-id>

/dev/block/vold
/sys/devices/virtual/switch/usb_mass_storage/state
/dev/block/vold/%d:%d
/sys/devices/platform/usb_mass_storage/lun0/file
ASEC loop device creation failed (%s)
New loop device created at %s
Failed to open loopdevice (%s)
ASEC device mapping failed (%s)
New devmapper instance created at %s
Found active devmapper for %s at %s
Failed to destroy devmapper instance (%s)
Failed to find loop device for {%s} (%s)
Failed to open new DM device for superblock write (%s)
Failed to get device nodes (%s)
/dev/block/loop%d
Error creating loop device node (%s)
Exhausted all loop devices
/dev/device-mapper
Error opening devmapper (%s)
Error destroying device mapping (%s)
Error creating device mapping (%s)
Error setting device geometry (%s)
Error retrieving devmapper status (%s)
/dev/block/dm-%u
Problem with /dev/ptmx
/dev/cpuctl/bg_non_interactive/tasks

広告

Android2.2/FroyoのAppsOnSDの仕組みについて」への1件のフィードバック

  1. りゃふ 10月 27, 2011 10:57 am

    暗号化されたアプリパッケージ:/mnt/secure/asec/アプリパッケージ名-1.asec
    を取り出したのですが、ファイルの中身を開いて取り出すことは可能でしょうか?
    可能な場合、方法を教えてください。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。