3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-09-07

やりたいこと

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?