Android源码阅读方式——教你如何找到ActivityManagerService

Android源码阅读方式可以在线阅读,当然也可以下载到本地阅读。

在线阅读

Android源码在线阅读的网站主流的就是http://androidxref.com,另外还有http://grepcode.comhttp://www.androidos.net.cn等。

这里以AndroidXRef为例介绍。

目前AndroidXRef上最新版本是安卓9(Pie),以下是根目录。

关于这个根目录不做详细介绍,所以就简单介绍下几个目录。

art/:全新的Android Runtime虚拟机(ART)运行环境,这个是从安卓4.4之后新加入的,而ART从安卓5.0开始完全替换了Dalvik虚拟机(到此为止,不扯远)。

packages/:应用程序包,对应系统应用层,包含系统内置的应用以及非系统级的应用。

frameworks/:应用程序框架,这也是安卓系统的核心部分,其主要实现代码在frameworks/base和frameworks/av目录下。我们非常熟悉的ActivityManagerService的源码就在frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java。大多数初、中级应用程序开发者要看的源码基本都在frameworks这个包下面。

hardware/:硬件抽象层代码,所谓的HAL,是位于操作系统内核与硬件电路之间的接口层。这里是手机厂商的开发人员根据手机终端所采用的不同的硬件平台去修改这部分的代码实现(能改HAL层代码的基本都是拿高薪的大牛啊)。

补充:强烈推荐 http://aospxref.com 比 androidxref高效

 

本地阅读

有人说在线阅读比较卡,效率太低,怎么办?那就下载源码到本地来阅读。

本地阅读推荐使用Source Insight(仅支持Windows),也可使用Android Studio和Eclipse,这样就不受网速影响。

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ActivityManagerService是负责监控应用程序的响应情况的服务,当应用程序出现ANR时,该服务会弹出ANR对话框。其ANR相关的源码如下: 1. 监控应用程序响应状态:ActivityManagerService会周期性地检测所有应用程序的响应状态,如果应用程序长时间未响应,就会触发ANR,代码如下: ``` private void checkAppTimeLimitLocked(ProcessRecord app) { // Check if the app has exceeded its time limits. if (app.notResponding) { return; // Don't kill the app if it is already not responding. } final boolean isSilentANR = mService.mDidDexOpt; final long now = SystemClock.uptimeMillis(); final long maxTime = isSilentANR ? mConstants.SANE_ANR_TIMEOUT : mConstants.ANR_TIMEOUT; final long timeSinceUnfrozen = now - app.lastStateTime; final boolean overTimeLimit = timeSinceUnfrozen > maxTime; if (DEBUG_ANR) { Slog.i(TAG, "checkAppTimeLimitLocked: " + app + " timeSinceUnfrozen=" + timeSinceUnfrozen + " maxTime=" + maxTime + " over=" + overTimeLimit); } if (overTimeLimit) { makeAppNotRespondingLocked(app, null, null, 0, "time limit exceeded", isSilentANR); } } ``` 2. 触发ANR:当应用程序长时间未响应时,ActivityManagerService会调用makeAppNotRespondingLocked方法触发ANR,代码如下: ``` void makeAppNotRespondingLocked(ProcessRecord app, String reason, String shortMsg, int flags, String message, boolean isSilentANR) { if (app.notResponding) { return; } mService.addErrorToDropBox("anr", app, app.processName, null, null, reason, message, null, null); ... // Show the ANR to the user. Message msg = Message.obtain(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("app", app); map.put("shortMsg", shortMsg); map.put("flags", flags); map.put("isSilentANR", isSilentANR); msg.obj = map; mHandler.sendMessage(msg); ... } ``` 3. 弹出ANR对话框:当应用程序出现ANR时,ActivityManagerService会通过Handler向主线程发送消息,弹出ANR对话框,代码如下: ``` private final class UiHandler extends Handler { public UiHandler() { super(mService.mHandler.getLooper()); } @Override public void handleMessage(Message msg) { switch (msg.what) { case SHOW_NOT_RESPONDING_UI_MSG: { HashMap<String, Object> data = (HashMap<String, Object>) msg.obj; ProcessRecord app = (ProcessRecord) data.get("app"); String shortMsg = (String) data.get("shortMsg"); int flags = (Integer) data.get("flags"); boolean isSilentANR = (Boolean) data.get("isSilentANR"); ... // Display the ANR dialog. mActivityManagerInternal.showAppErrorUi(app.pid, app.info.packageName, shortMsg, null, null, flags, isSilentANR); ... break; } ... } } } ``` 以上就是ActivityManagerService中ANR相关的源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值