やりたいこと
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を呼び出す。 -
packageServiceの実装はここ。
-
-
cmd-
Serviceに対して任意のコマンド要求ができる。 -
IBinder#shellCommaand->Service#onShellCommand->ShellCommand#exec->ShellCommand#onCommandを呼び出す。 -
packageServiceの実装はここ。
-
ただし、実際どちらにどのような機能をもたせるかは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でカンマ区切りのデータを指定した列だけカンマ区切りで出力する