• 安卓系统中的进程介绍


    前言

    本文主要对安卓中进程的一个介绍,以及一些知识的科普。

    阅读本文,可以帮你解答以下几个问题:

    1.安卓系统有哪些服务。

    2.为什么手机上没有打开任何一个引用,但是系统内存却已经使用了很多。

    3.安卓的应用进程由谁生成。

    一.应用进程介绍

    我们可以通过adb命令:adb shell ps > ps.txt导出一份安卓应用进程文件,其部分内容如下:

    1. USER PID PPID VSZ RSS WCHAN ADDR S NAME
    2. root 1 0 2319696 8084 0 0 S init
    3. root 2 0 0 0 0 0 S [kthreadd]
    4. root 3 2 0 0 0 0 I [rcu_gp]
    5. root 310 1 2289352 4436 0 0 S init
    6. u0_a81 353 1520 5858304 106084 0 0 S com.heytap.openid
    7. system 1040 1 2153044 5020 0 0 S servicemanager
    8. system 1303 1 2433864 6136 0 0 S android.system.suspend@1.0-service
    9. keystore 1304 1 2602468 13864 0 0 S keystore2
    10. tombstoned 1368 1 2126624 3136 0 0 S tombstoned
    11. root 1520 1 6138208 148784 0 0 S zygote64
    12. root 1521 1 1801468 61636 0 0 S zygote
    13. audioserver 1592 1 3565804 13400 0 0 S android.hardware.audio.service_64
    14. gpu_service 1830 1 2349128 5624 0 0 S gpuservice
    15. system 1835 1 3808932 134676 0 0 S surfaceflinger
    16. u0_a404 2105 1520 6647556 167056 0 0 S com.whatsapp
    17. u0_a188 4351 1520 8760400 457416 0 0 S com.android.systemui
    18. webview_zygote 4564 1521 1749980 17420 0 0 S webview_zygote
    19. u0_a178 4703 1520 8375780 314520 0 0 S com.android.launcher
    20. system 4807 1520 6352940 110272 0 0 S com.oplus.notificationmanager
    21. system 7402 1520 7194740 159872 0 0 S com.oplus.battery
    22. u0_a311 7085 1520 8340428 164928 0 0 S com.tencent.mm:push
    23. u999_a311 11870 1520 8285364 158096 0 0 S com.tencent.mm:push
    24. u999_a311 12172 1520 26825040 266652 0 0 S com.tencent.mm
    25. u0_a311 31989 1520 146617368 411492 0 0 S com.tencent.mm
    26. u0_a120 13476 1520 24472076 236484 0 0 S com.baidu.input_oppo
    27. shell 17369 1 2408000 6088 0 0 S adbd
    28. system 23451 1520 6020924 119656 0 0 S com.oplus.securitypermission
    29. u0_a372 32704 1520 24923448 263656 0 0 S cn.damai
    30. 总数量有800多个进程

    字段含义:

    字段名

    解释

    USER

    所属用户,一般来说,同一个签名下的应用属于同一个用户。

    PID

    进程ID

    PPID

    父亲进程的ID

    VSZ

    进程的虚拟内存大小

    RSS

    当前在物理内存中占用的空间大小

    WCHAN

    当前正在等待的事件或条件

    ADDR

    表示进程的起始内存地址

    S(State)

    表示进程的当前状态。包括:R(运行),S(睡眠),D(不可中断的睡眠),I(空闲)等

    NAME

    进程名

    这里我们扩展介绍下USER字段,主要区别以下ROOT和SYSTEM用户,正如其字面意思,ROOT代表的是超级用户,拥有的是最高权限,具有完全控制权。而SYSTEM代表是系统用户,拥有的是较高权限,但并不是完全的控制权。一般来说,系统级的应用都属于SYSTEM用户。

    一些主要的进程介绍:

    NAME

    USER

    PID

    PPID

    介绍

    init

    root

    1

    0

    init进程,安卓系统的大儿子。其PID一定为1。

    kthreadd

    root

    2

    0

    内核线程守护进程,它是Linux内核的一部分,负责创建和管理其他内核线程

    rcu_gp

    root

    3

    2

    内核进程,这一类的还有很多,都是由kthreadd创建

    init

    root

    310

    1

    有PID=1的init进程fork生成,负责执行一些特定的任务

    com.heytap.openid

    u0_a81

    353

    1520

    这是一个系统级的应用,我们APP中经常会需要唯一标识符openId,就是由这个应用提供的。

    这里为什么它的PID比其父进程zygote64还小呢?答案留到最后

    servicemanager

    system

    1040

    1

    系统服务进程,类似于系统中的一个路由,当需要某个服务时,先向这个路由进行访问,其生成时间早于zogyte。

    zygote64

    root

    1520

    1

    和zygote功能类似,但是这个进程是针对64位应用的

    zygote

    root

    1521

    1

    zygote进程,所有的应用进程都是由该进程孵化的。

    android.hardware.audio.service_64

    audioserver

    1592

    1

    负责处理与音频功能相关的服务和任务

    gpuservice

    gpu_service

    1830

    1

    负责管理和控制图形处理单元(GPU)的功能和资源

    surfaceflinger

    system

    1835

    1

    负责管理和显示屏幕上所有图形和图层的任务。所有APP的最终刷新频率和绘制都是由其负责的。

    com.whatsapp

    u0_a404

    2105

    1520

    这就是一个正常的聊天应用,所以其parentId=1520,其PID=2105应该是进程ID复用了。

    com.android.systemui

    u0_a188

    4351

    1520

    负责一些系统级的展示,最常用的就是toast的展示就是由其负责的。

    webview_zygote

    webview_zygote

    4564

    1521

    我们APP中使用webView组件,其实APP只是通知了webview_zygote,解析html以及渲染的逻辑都是由webview_zygote完成的。

    com.android.launcher

    u0_a178

    4703

    1520

    我们的桌面应用

    com.oplus.notificationmanager

    system

    4807

    1520

    通知栏应用

    com.oplus.battery

    system

    7402

    1520

    推测应该是电源管理类的应用

    com.tencent.mm:push

    u0_a311

    7085

    1520

    负责处理推送的微信进程

    com.tencent.mm:push

    u999_a311

    11870

    1520

    负责处理推送的微信进程

    com.tencent.mm

    u999_a311

    12172

    1520

    微信

    com.tencent.mm

    u0_a311

    31989

    1520

    微信,这里为什么会有两个呢?第三章会讲

    com.baidu.input_oppo

    u0_a120

    13476

    1520

    输入法

    adbd

    shell

    17369

    1

    我们的adb命令得以执行,是因为手机上有一个服务在处理我们输入的命令。

    com.oplus.securitypermission

    system

    23451

    1520

    系统级的应用,应该是权限管理一类的。

    cn.damai

    u0_a372

    32704

    1520

    虽然大麦在页面上的显示进程已经被杀死了,但是系统进程中仍然还存在。

    感觉这属于一加系统故意的设置

    com.xt.myapp

    u0_a379

    32707

    1520

    这是我自定义的应用,是一个普通的应用,退出后会被彻底杀死

    二.运行service介绍

    我们可以通过adb命令:adb shell dumpsys activity services > service.txt导出一份service运行列表文件,获取当前处于活跃状态的service。

    其部分内容如下:

    1. ACTIVITY MANAGER SERVICES (dumpsys activity services)
    2. * ServiceRecord{4f884ba u0 com.oplus.battery/.OplusBatteryService}
    3. intent={act=com.oplus.battery.OplusBatteryService pkg=com.oplus.battery}
    4. packageName=com.oplus.battery
    5. processName=com.oplus.battery
    6. permission=com.oplus.permission.safe.READ_COMMON
    7. baseDir=/system_ext/app/Battery/Battery.apk
    8. dataDir=/data/user_de/0/com.oplus.battery
    9. * ServiceRecord{3015c51 u0 com.android.launcher/com.android.keyguardservice.KeyGuardDismissedService}
    10. intent={act=com.android.launcher.action.KeyGuardDismissedService cmp=com.android.launcher/com.android.keyguardservice.KeyGuardDismissedService}
    11. packageName=com.android.launcher
    12. processName=com.android.launcher
    13. permission=oplus.permission.OPLUS_COMPONENT_SAFE
    14. baseDir=/system_ext/priv-app/OplusLauncher/OplusLauncher.apk
    15. dataDir=/data/user_de/0/com.android.launcher
    16. app=ProcessRecord{d41799e 4703:com.android.launcher/u0a178}
    17. * ServiceRecord{d4df27a u0 com.tencent.mobileqq/.winkpublish.service.WinkPublishService}
    18. intent={cmp=com.tencent.mobileqq/.winkpublish.service.WinkPublishService}
    19. packageName=com.tencent.mobileqq
    20. processName=com.tencent.mobileqq
    21. baseDir=/data/app/~~zynQ-ZG3_WwINWYGDBfM2g==/com.tencent.mobileqq-vEZqX7KombL9LhGhkQYEWw==/base.apk
    22. dataDir=/data/user/0/com.tencent.mobileqq
    23. app=ProcessRecord{7a090aa 8840:com.tencent.mobileqq/u0a383}
    24. allowWhileInUsePermissionInFgs=true
    25. recentCallingPackage=com.tencent.mobileqq
    26. recentCallingUid=10383
    27. allowStartForeground=ACTIVITY_STARTER
    28. startForegroundCount=0
    29. infoAllowStartForeground=[callingPackage: com.tencent.mobileqq; callingUid: 10383; uidState: SVC ; intent: Intent { cmp=com.tencent.mobileqq/.winkpublish.service.WinkPublishService }; code:ACTIVITY_STARTER; tempAllowListReason:<,reasonCode:SYSTEM_ALLOW_LISTED,duration:9223372036854775807,callingUid:-1>; targetSdkVersion:26; callerTargetSdkVersion:26; startForegroundCount:0; bindFromPackage:null]
    30. createTime=-1h37m30s314ms startingBgTimeout=--
    31. lastActivity=-4m25s954ms restartTime=-47m19s338ms createdFromFg=false
    32. Bindings:
    33. * IntentBindRecord{6d2ae21 CREATE}:
    34. intent={cmp=com.tencent.mobileqq/.winkpublish.service.WinkPublishService}
    35. binder=android.os.BinderProxy@7486246
    36. requested=true received=true hasBound=true doRebind=false
    37. * Client AppBindRecord{fe75c07 ProcessRecord{7a090aa 8840:com.tencent.mobileqq/u0a383}}
    38. Per-process Connections:
    39. ConnectionRecord{ff84ea5 u0 CR com.tencent.mobileqq/.winkpublish.service.WinkPublishService:@4dd249c}
    40. All Connections:
    41. ConnectionRecord{ff84ea5 u0 CR com.tencent.mobileqq/.winkpublish.service.WinkPublishService:@4dd249c}
    42. 共有253的service

    我们可以看到,有的service所属的APK目录不一致,分别有以下几种:

    目录

    介绍

    /system/app/

    该目录下的应用是预装在设备上的系统应用程序,一般是系统开发商或者设备制造商定制。

    /my_bigball/priv-app/

    my_bigball应该是一加定制的,其实应该是system/priv-app/,该目录下的应用通常是敏感或核心的系统应用程序,提供了更高的特权和权限。

    /system_ext/app/

    顾名思义,应该是设备制造商提供的具有扩展功能的系统级应用

    /vendor/app/

    由设备供应商定制的系统级应用

    三.问题汇总

    1.为什么手机上一个应用都没有打开,但是内存却占用了很多?

    使用一部手机的时候,你会发现没有打开任何一个应用,但是往往16G的内存已经使用了6个G甚至更多,这是为什么呢?主要分为两块:

    第一块系统进程,安卓系统中并不是只有应用进程,它还有众多的系统进程,这些进程虽然没有前台展示给用户看,但是确实一直运行的。

    第二块应用后台服务,而且我们经常使用到的微信支付/支付宝支付等等也都会默认在后台运行,所以其对应的进程自然也会存在。比如第二章中,我们发现QQ的后台服务就一直存活中。

    com.tencent.mobileqq/.winkpublish.service.WinkPublishService

    2.一加手机部分应用退出后进程还在

    第一章中,我们发现大麦APP彻底退出后,甚至于点击菜单栏看不到任何运行中的进程,但是通过ps查看进程,发现大麦进程仍然存活。另外,我们还发现竟然有两个微信进程,这明显不合理。

    1. u0_a372 32704 1520 24923448 263656 0 0 S cn.damai
    2. u0_a311 7085 1520 8340428 164928 0 0 S com.tencent.mm:push
    3. u999_a311 11870 1520 8285364 158096 0 0 S com.tencent.mm:push
    4. u999_a311 12172 1520 26825040 266652 0 0 S com.tencent.mm
    5. u0_a311 31989 1520 146617368 411492 0 0 S com.tencent.mm

    但是如果是普通的应用,比如com.xt.myapp,应用彻底退出后进程就会被杀死。

    这一块无法解释,如果直接使用安卓模拟器是没有这问题的,所以只能说明一加的手机做了魔改,并且产生了一些副作用。

    3.为什么有的进程PID比其父进程PID还小?

    比如第一章的例子中,com.heytap.openid的PID就比zoygte的1520还小。

    1. root 1520 1 6138208 148784 0 0 S zygote64
    2. u0_a81 353 1520 5858304 106084 0 0 S com.heytap.openid

    这是因为PID进程不可能无限增长下去,所以当某个进程完全死亡后,其进程标识符(PID)可以被系统重新分配给新的进程。这里很明显,com.heytap.openid使用了重新分配的PID。

  • 相关阅读:
    java毕业设计选题基于SSM毕业设计管理系统|毕设管理文档成绩Shiro
    〖Python WEB 自动化测试实战篇⑯〗- WEB自动化的总结与未来技术上的展望
    瑞芯微rk3568移植openbmc(二)
    论文详读:IMPROVING CONVOLUTIONAL MODELS FOR HANDWRITTEN TEXT RECOGNITION
    【题解】同济线代习题一.6.2
    Axi接口的DDR3:参数,时序,握手机制
    Arm64 linux Virtual memory分析
    【附源码】计算机毕业设计SSM团结里小区疫情防控系统
    VectorDraw Developer Framework 10.1004 Crack
    Pytorch面试题面经
  • 原文地址:https://blog.csdn.net/AA5279AA/article/details/131290822