常见AMS log

解析Android系统中PID与UID
本文详细解析了Android系统中PID与UID的作用与区别,包括它们如何帮助识别应用程序身份,以及在日志中如何体现activity、service和broadcast的状态变化。通过理解这些概念,开发者可以更好地诊断和优化应用性能。

说明:
pid指进程id。pid 是进程的身份标识,程序一旦运行,就会给应用分配一个独一无二的pid(ps:一个应用可能包含多个进程,每个进程只有唯一一个pid),进程终止后pid会被系统回收,再次打开应用,会重新分配一个pid(新进程的pid一般比之前的值要大)
查看命令 :adb shell ps

uid指用户的id。为了实现数据共享,android为每个应用几乎都分配了不同的uid,使之成了数据共享的工具。
查看命令 :命令:adb shell  cat  /proc/PID号/status

因此在android中pid、uid都是用来识别应用程序的身份的,但uid是为了不同的程序来使用共享的数据。

(1) process 相关的log
ActivityManager: START u0 {act=android.media.action.STILL_IMAGE_CAMERA flg=0x80000 cmp=com.htc.camera3/.CameraEntry (has extras)} from uid 10020 pid 26314
点击应用入口进入应用触发此log,新的activity还没有创建之前打印此log

act -- 表示被调用启动的activity的action,此处是activity com.htc.camera3/.CameraEntry的action
cmp -- 表示被调用启动的 activity,此处启动的activity 为com.htc.camera3/.CameraEntry
uid -- 表示发起调用的 uid
pid -- 表示发起调用的 pid,可以通过查询pid知道当前应用包名

Android规定android.system.uid=1000,具有该Uid的application,我们称之为获得Root权限

ActivityManager: Start proc 23009:com.htc.albumgp/u0a20 for activity com.htc.albumgp/com.htc.album.AlbumMain.ActivityMainTabHost
在新的activity创建前打印此log,生成新应用的pid

23009 -- 表示要启动的activity 的 pid
u0a20 -- pid 对应的UserID

ActivityManager: Start proc 23024:com.htc.pitroadCN/u0a77 for broadcast com.htc.pitroadCN/com.htc.pitroad.gametuning.receiver.GameTuningReceiver
23024 -- 表示要启动的broadcast receiver的 pid
u0a77 -- pid 对应的UserID
Start proc表示应用进程第一次启动
Start u0 表示启动已存在堆栈中的应用

ActivityManager: Start proc 23056:com.htc.mediamanager/u0a20 for service com.htc.albumgp/com.htc.mediamanager.providers.media.MMPService
23056 -- 表示要启动的service 的 pid
u0a20 -- pid 对应的UserID

ActivityManager: Killing 3434:com.google.android.partnersetup/u0a45 (adj 906): empty #17
3434 -- 表示kill掉的进程的pid
u0a45 -- 表示kill掉的进程的pid所在的userId
empty -- 表示kill的原因
adj 906 -- 906 不可见进程的adj最大值

系统是根据各个app四大组件的状态来决定进程的优先级值adj。系统会根据一定的策略先去回收优先级最低的(同时也是adj值最大的),其次再回收优先级略低的,依次类推,直到回收了足够的系统资源,保证系统正常运转。

Process : killProcessQuiet, pid=
被killed的pid

(2) activity 生命周期相关的log
Displayed com.android.settings/.Settings$NetworkDashboardActivity: +279ms (total +1s32ms)
说明已经走完onResume,activity显示出来了

 第一个时间表示系统接受到打开的intent到HomeActivity界面显示出来的时间0.279秒。
 第二个时间特殊情况下才会有。例如这种调用流程:A->B(在onCreate立刻finish掉自己,直接跳转到C)->C(TestActivity),它包含了B页面onCreate处理以及finish的时间。
 这个时间如果过长,会导致用户点击跳转后,页面还停留在原来界面,延迟一段时间再跳转。这种体验很差,用户会觉得卡顿并容易点击多次。很多应用程序的入口页面,都设计成这种情况的跳转。

(3) service 相关的 log

ActivityManager: startService: Intent { cmp=com.android.phone/.NetworkQueryService } type=null args=null pid=2508
Start service打印此log

cmp -- 启动的service的名字
pid -- 发起调用service的包 com.android.phone所在的进程号

如果Service没有设定属性android:process=”:remote” 
Service会和Activity是在同一个进程中的,而且都是主线程 
如果Service设定属性android:process=”:remote” 
那么就会创建新进程,这时Activity可以通过跨进程访问Service中的数据

ActivityManager: stopService: Intent { cmp=com.android.settings/.framework.service.ChargerWarningService } type=null pid=2220
Stop service打印此log

cmp – 停止的service的名字
pid -- 发起调用service的包com.android.settings所在的进程号

(4) broadcast 相关的 log
ActivityManager: registerReceiver filter=f500a3b from com.android.phone,userId=0,pid=2508,uid=1001,rec=1e29c35

filter – filter的对象的值
pid -- broadcast所在的com.android.phone 的pid
uid -- broadcast所在的com.android.phone 的uid
rec -- 注册的对象的值

ActivityManager: broadcast act=android.media.VOLUME_CHANGED_ACTION flg=0x14000000 from pid=1744, uid=1000,parallel BR:a57ef64,u-1,size=3,replaced=0,order BR:null,size=0,resultTo=null
在调用sendBroadcast 时打印此log
act -- broadcast的过滤的名字
pid -- broadcast所在的pid
uid -- broadcast所在的uid
BR -- BroadcastRecord的对象的值
size -- registeredReceivers的个数

如果 resultTo == null, 则打印 BR:null,size=0,resultTo=null

Activity Manager Service(AMS)是 Android 的核心服务,在 Android 系统中扮演着至关重要的角色,以下从功能、原理、使用方法和开发相关方面介绍: ### 功能 - **应用生命周期管理**:负责管理四大组件(Activity/Service/Broadcast/ContentProvider)的生命周期,是统一调度中心,确保各组件在合适的时机创建、启动、暂停、恢复和销毁等,例如在用户切换应用时,AMS 会控制 Activity 的生命周期变化[^1][^2][^4]。 - **进程调度**:作为进程沙箱守护者,进行应用隔离与资源访问控制,依据 UID/PID 权限体系,合理分配系统资源给不同进程,保障系统稳定运行。同时也是低内存回收(LMK)的决策者,在系统内存不足时,决定回收哪些进程以释放内存[^2]。 - **任务栈管理**:管理 Activity 的任务栈,记录 Activity 的启动顺序和层次关系,保证 Activity 启动与切换的正确逻辑,例如在用户按返回键时,AMS 根据任务栈的情况决定显示哪个 Activity[^1]。 - **系统稳定性保障**:进行 ANR(Application Not Responding)监控,当应用无响应时采取相应措施,维持系统的稳定性[^2]。 - **内存管理**:对系统内存进行管理,确保系统资源的有效利用,通过低内存回收等机制,优化系统内存使用情况[^4]。 ### 原理 - **启动入口**:AMS 的启动入口是 SystemServer,在系统启动过程中,SystemServer 会初始化并启动 AMS 服务,使其开始工作[^1]。 - **Binder IPC 通信**:ActivityManagerService 是 Binder 的子类,借助 Binder 机制实现进程间通信(IPC),使得不同进程可以与 AMS 进行交互,完成组件的调度和管理等操作,例如应用进程向 AMS 请求启动 Activity 时,就是通过 Binder 通信完成的[^2][^4]。 - **反射创建服务**:以 startService 方法为例,它通过传入的 class 反射创建对应的 service 服务,如创建 Lifecycle 的实例,然后启动 AMS 服务,这体现了 AMS 在服务创建方面的工作原理[^3]。 ### 使用方法 在实际开发中,一般不会直接操作 AMS,而是通过系统提供的 ActivityManager 类来间接与 AMS 交互。以下是一些常见的使用示例: ```java // 获取 ActivityManager 实例 ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); // 获取正在运行的进程信息 List<ActivityManager.RunningAppProcessInfo> runningProcesses = activityManager.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) { Log.d("ProcessInfo", "Process Name: " + processInfo.processName); } // 获取最近任务列表 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { List<ActivityManager.AppTask> appTasks = activityManager.getAppTasks(); for (ActivityManager.AppTask appTask : appTasks) { Log.d("AppTask", "Task ID: " + appTask.getTaskInfo().id); } } ``` ### 开发相关 - **系统级开发**:若进行系统级开发,可能需要深入研究 AMS 的源码,对其功能进行定制和扩展,例如修改进程调度策略或优化内存管理机制等,这需要具备扎实的 Android 系统知识和源码阅读能力。 - **应用开发**:在应用开发中,虽然不直接操作 AMS,但需要了解 AMS 的工作原理,以便更好地处理组件的生命周期和与系统的交互,避免出现 ANR 等问题。同时,合理使用 ActivityManager 类提供的方法,实现如获取系统信息、管理任务栈等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值