Edited at

[Android] package名とUID(linux User ID) の対応の調べ方


やりたいこと

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と動的にやりとりをするコマンドとして、

dumpsyscmdが用意されている。

ざっくりいえば、



  • dumpsys



    • Serviceに対して状態の出力を要求する。


    • IBinder#dump経由で、Service#dumpを呼び出す。


    • packageServiceの実装はここ




  • cmd



    • Serviceに対して任意のコマンド要求ができる。


    • IBinder#shellCommaand->Service#onShellCommand->ShellCommand#exec -> ShellCommand#onCommandを呼び出す。


    • packageServiceの実装はここ



ただし、実際どちらにどのような機能をもたせるかはServiceに依存する。

例えばusbdumpsysコマンドで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でカンマ区切りのデータを指定した列だけカンマ区切りで出力する