やりたいこと
Androidで、UID(LinuxのUser ID)がどのpackageに割り当てられているかを調べたい。
Androidではpackageをインストールするごとに、Linuxユーザが割り当てられUIDが付与される。
結果、/proc/uid_io
や/proc/uid_cputime/show_uid_stat
など、
UID単位での情報を見る機会が多いので、お手軽に対応付ける方法がほしい。
方法1. cmd
コマンド
$ adb shell cmd package list packages -U
package:com.android.cts.priv.ctsshim uid:10008
package:com.google.android.youtube uid:10078
package:com.google.android.ext.services uid:10014
package:com.android.providers.telephony uid:1001
package:com.google.android.googlequicksearchbox uid:10032
確認したAndroid 8.1では、pm list packages -U
でも同じ結果が得られた。
ただし、pm help
によれば、pm list
はもう使わない方が良いらしい。
NOTE: 'pm list' commands have moved!
Run 'adb shell cmd package' to display the new commands.
方法2. dumpsys
コマンド
$ adb shell dumpsys package --checkin packages |
awk 'BEGIN {FS=",";OFS=","} $1=="pkg" {print $2, $3}'
com.android.cts.priv.ctsshim,10008
com.google.android.youtube,10078
com.google.android.ext.services,10014
com.android.providers.telephony,1001
com.google.android.googlequicksearchbox,10032
...
dumpsys package packages
コマンドですべてのpackageの情報が取得できるので、
そこからpackage名とUIDを切り出している。
パースしやすいよう--checkin
オプションをつけているが、その位置に注意。
今回は除去しているが、versionやインストール時刻も一緒に取得できるので、それらが必要な場合はdumpsys
を使えば良い。
おわりに
Androidシステム上で動作するServiceと動的にやりとりをするコマンドとして、
dumpsys
とcmd
が用意されている。
ざっくりいえば、
-
dumpsys
-
Service
に対して状態の出力を要求する。 -
IBinder#dump
経由で、Service#dump
を呼び出す。 -
package
Serviceの実装はここ。
-
-
cmd
-
Service
に対して任意のコマンド要求ができる。 -
IBinder#shellCommaand
->Service#onShellCommand
->ShellCommand#exec
->ShellCommand#onCommand
を呼び出す。 -
package
Serviceの実装はここ。
-
ただし、実際どちらにどのような機能をもたせるかはService
に依存する。
例えばusb
はdumpsys
コマンドでroll switchができたり、
package
はどちらのコマンドでも状態の出力ができたりする。
cmd
コマンドはdumpsys
コマンドに輪をかけて情報が少ない。
(というか検索しずらい、、、)
dumpsys
でほしい情報が取れない場合は、cmd
コマンドもチェックしたほうがよい。
おまけ
UID -> package名
$ adb shell cmd package list packages -U --uid 10078
package:com.google.android.youtube uid:10078
$ adb shell dumpsys package --checkin packages |
awk 'BEGIN {FS=","} $1=="pkg" && $3==10078 {print $2}'
com.google.android.youtube
package名 -> UID
$ adb shell cmd package list packages -U com.google.android.youtube
package:com.google.android.youtube uid:10078
$ adb shell dumpsys package --checkin com.google.android.youtube |
awk 'BEGIN {FS=","} $1=="pkg" {print $3}'
10078
参考
UID stats - Android Developers
awkでカンマ区切りのデータを指定した列だけカンマ区切りで出力する