アプリのデバッグなどをしている際に、一度アプリを初期化して、真っさらな状態から動作確認をしてみたい、というのが結構あるかと思います。
開発者であれば、adbのコマンドで
$ adb shell pm clear パッケージ名
とすればアプリの初期化をすぐに行なえます。
しかし、非開発者の人の場合だと
・アプリをアンインストールし、再度インストールする。
・端末の設定からアプリ一覧から該当するアプリの設定に行き、「データを消去」などでデータを消去する。
という、ちょっと面倒な手順を踏まなければなりません。
アプリを初期化する処理を実装する
というわけで、アプリを初期化する処理を実装してみたいと思います。
といってもコード自体は結構簡単で、下記のような感じです。
Runtime.getRuntime().exec("pm clear パッケージ名")
Runtime
に関しては、普段アプリ開発をしているなかでは、ほぼ使うことはないクラスかと思います。https://developer.android.com/reference/java/lang/Runtime.html
(正直詳しいところはわからないのですが) Runtime.getRuntime()
でアプリ自身のランタイムを取得し、exec
で任意のコマンドを実行することが出来る、みたいな感じのようです。
実際にアプリに組み込む場合は、デバッグ時だけに使えるデバッグメニューみたいなのを作って、そこに アプリを初期化する
みたいなボタンを設置してあげるといいのではないかと思います。
...
clearButton.setOnClickListener {
Runtime.getRuntime().exec("pm clear パッケージ名")
}
...
ちなみにこの処理を実行すると、アプリが強制的に終了するような挙動になります。
このボタンがあれば、デバッグ時に便利ではないでしょうか!
他のアプリの情報も消せるのか?
ここでふと、**「他のアプリでも初期化出来ちゃうのでは?」**という疑問が。
出来ないだろうなと思いつつも、もし出来たら相当良くないよな、ということで試してみました。
試してみる
↓おもむろにモンストのデータの初期化を試みる。
Runtime.getRuntime().exec("pm clear jp.co.mixi.monsterstrike")
これを実行してみると、消すことは出来ませんでした。
少し書き加えて、実行結果を確認してみると...
val result = Runtime.getRuntime().exec("pm clear jp.co.mixi.monsterstrike")
result.errorStream.bufferedReader().use {
Log.d("DEBUG", it.readText())
}
Error: java.lang.SecurityException: PID 467 does not have permission android.permission.CLEAR_APP_USER_DATA to clear data of package jp.co.mixi.monsterstrike
権限が無い旨のエラーが出ておりました。
当然といえば当然の結果ですが、別アプリを削除することは出来ないようでした。
終わりに
Runtime
を使ってのアプリの初期化方法を記載しました。
デバッグメニューなどに追加して、デバッグを簡単に行えるようにしていきたいですね