世の中には、いろいろなAndroidスマートフォンやタブレットがありますが、中には、大量のプリインストールアプリが入っているものもあります。日本の事業者が扱うスマートフォンなどはまだ、マシなほうで、アプリケーションを一つ、二つインストールしただけでもう空き領域がなくなってしまうものもあります。

今回は、一般的な手順ですが、こうしたプリインストールアプリを削除する方法を解説しようとおもいます。ただし、今回の解説は特定の機種を前提にしたものではないので、お手持ちの機器のすべてに当てはまるとは限りません。しかも、ある程度の準備などが必要で、とても簡単とは言いがたいものです。ですが、この準備がクリアできるようなら、あとは自力でなんとかなるでしょう。しかし、一歩間違うと、大事なマシンを「文鎮」に変えてしまいかねない「危険性」があることを理解していただきたいと思います。また、万一、何かあっても、筆者を含めだれも責任を取ってくれません。この点もお忘れ無きよう。

作業を行うのに必要なのは次の2つの条件です。

  • PCがあってアンドロイドのSDKをインストールして動作させられること
  • 対象の機種のrootを取れること

ここで、SDKって何?、rootって何と思ったら、今回の記事は見なかったことにして、次回の記事からご愛読をお願いします。

アンドロイドのSDKはGoogleの開発者向けサイトからダウンロード可能です。また、rootの取り方は、機種名とrootをキーワードにしてgoogleで検索すればわかるでしょう。ただ、必ずしもすべてのマシンでrootが取れるとは限りません。また、過去のバージョンはできたが、現在のバージョンはできないということもありえるので、こうした検索をするときには、どのバージョンを相手にしているのかを確認します。また、最近のシステムアップデート時期を確認して、それ以後の記事を捜すようにします。

SDKのインストールが終わり、rootが取れたら、以下の2つのプログラムをアンドロイドマシンにインストールします。

  • SuperUser
  • BusyBox

どちらもGoogle Playからダウンロード可能です。最初にSuperUserをインストールし、次にBusyBoxをインストールします。rootを取る方法の中には、自動でBusyBoxをインストールするものもありますが、できれば最新のBusyBoxを入れたほうがいいでしょう。

これが終わったらPCとアンドロイドマシンをUSBケーブルで接続し、シェルを立ち上げます。もちろん、アンドロイド側は「USBデバッグ」がオンでなければなりません。シェルは、ガソリンスタンドとは関係なく、アンドロイド内部のリナックス環境のコマンドラインユーザーインタフェースです。普通は、コマンドプロンプトから「adb shell」で起動しますが、複数のデバイスを同時につないでいるとどちらにつなぐのかわからないので、接続するアンドロイドは一台だけにします。選択してシェルに入るは、「adb devices」で、接続中のデバイスのシリアル番号を表示させ、-sでシリアル番号を指定してshellを起動します。この文章が何を言ってるのかわからない場合には、残念ですが、この先の作業も困難とおもわれます。

シェルに入ったら、「su」コマンドを実行します。このとき、SuperUserがshellについて確認してくるでしょう(初めてsuを実行したとき)。これは許可しておきます。

suコマンドが成功すると、プロンプトが「$」から「#」に変わります。これで準備はOKです。

読み書き可能に再マウント

これからやる作業は、/system/appにあるインストールファイルのうち、不要なものをほかの場所に移すという作業です。簡単そうですが、問題がいくつかあります。1つは、/systemディレクトリは、リードオンリーでマウントされているので、読み書き可能にして再マウントしなければなりません。また、/systemに相当するブロックデバイスの名前は、機種ごとに違うので、自分で確認する必要があります。LinuxやUnixに慣れた方なら、これだけ聞けば十分なのですが、少し細かく解説しましょう。

まず、/systemフォルダとしてマウントされているデバイスを捜します。これには、「mount」コマンドを引数無しで実行します。現在マウントされているデバイスとマウントポイントが表示されるので、2つめに表示されるマウントポイントが「/system」になっているものを捜します(写真01)。

写真01: シェルでmountコマンドを実行したところ

まず、mountコマンドの出力は右端で折り返しになっていることに注意します。先頭のデバイス名は原則「/dev/」で始まりますが、そうでない場合もあります。その後スペース1つを置いてマウントポイントになります。ここが「/system」になっているものを捜します。筆者の環境(リスト01)では、

/dev/stl9 /system rfs ro,relatime,vfat,log_off,check=no,gid/uid/rwx,iocharset=cp437 0 0

という行がありました。デバイス名は「/dev/stl9」になります。

デバイス名がわかったら、/systemディレクトリを再マウントします。それには以下のコマンドを使います。

mount -o rw,remount デバイス名 /system

このコマンドは、「デバイス名」がマウントされている/systemを読み書き可能(rw)で再マウントするという意味です。これで、/systemディレクトリ以下が読み書き可能になりました。

ファイルを移動させる

プリインストールのアプリケーションは、原則/system/appディレクトリにあります。ここにプリインストールアプリケーションのapk(インストールパッケージ)があり、通常は電源オンが行われ、システムが起動するときにインストールが行われます。このため、ここにあるファイルを削除すれば、そのプログラムはインストールされなくなり、メモリを記憶領域も使わなくなります。ただし、ここには、アンドロイドの標準的なシステム側のモジュールやアプリケーション(たとえばマップやGメール)などもあるので、間違えると、システムが起動しなくなったり、うまく動かなくなったりします。回復する方法は、内蔵フラッシュイメージを完全に元に戻すしかないので、十分注意します。まず、単純に消すのはやめて、SDカードに作ったフォルダなどに待避させておきます。

このため、基本的な作業は、動かしたくないアプリケーションxyz.apkがあったとき、

cp xyz.apk /mnt/sdcard/backup
rm xyz.apk

となります。cpはコピーのコマンド、rmはファイル削除のコマンドです。なお「/mnt/sdcard/backup」は、この作業のために作成したフォルダになるので、自分のマシンや状態に合わせて正しく指定してください。また、場合によっては、apk以外の拡張子の同名のファイルが存在する可能性もあります。

こうやって、不要なアプリを削除したら、rebootコマンドなどでアンドロイドを再起動します。マウントは起動時に再度行われるので、特に戻す必要はありませんが、必ず再起動してください。

元に戻したい場合には、再度シェルで/systemをrwで再マウントしてファイルをコピーします。

また、apkファイルを調べてから削除したいというのであれば、/system/app以下のapkファイルをSDカードなどにコピーするなどしてPC側へ移してから、アンドロイドSDK付属のaaptコマンドで調べる方法があります。

aaptコマンドでアプリ名を調べるには、以下のように起動します。

aapt d badging APKファイル名

その出力にある「application-label」がアプリ名になります。ハイフンの後にアルファベット2文字が続くのは、各国語のアプリ名表記です。ユニコードであるため、コマンドプロンプトでは化けてしまいますが、ファイルにしてWindowsのメモ帳を使えば化けずに見ることができます(写真02)。

写真02: aaptコマンドを使えばapkファイルからアプリ名などの情報を取り出せる。ただし各国語表記なので、コマンドプロンプトでは文字が化けてしまう。そのため一旦ファイルにしてからメモ帳で開く

リスト01


mountコマンドの実行結果
# mount
mount
rootfs / rootfs rw,relatime 0 0
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
/dev/stl9 /system rfs ro,relatime,vfat,log_off,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl10 /cache rfs rw,nosuid,nodev,relatime,vfat,llw,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl6 /mnt/.lfs j4fs rw,relatime 0 0
/dev/stl12 /efs rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl11 /data rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/179:1 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
/dev/block/dm-0 /mnt/asec/com.google.android.apps.plus-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-1 /mnt/asec/com.hootsuite.droid.full-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

関連リンク

連載バックナンバー