通过AMS分析Binder流程(Java到Kernel)

本文详细探讨了Android系统中Binder通信机制的工作流程,从Java层的接口调用一直深入到Kernel层面的交互。通过AMS(Activity Manager Service)为例,展示了Binder如何在应用进程和系统服务之间传递消息,涉及IPC、代理对象、binder驱动等多个关键环节。
摘要由CSDN通过智能技术生成
栗子:
public class MainActivity extends Activity{
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
 
     Intent intent = new Intent(this, DisplayMessageActivity.class);
     startActivity(intent);//启动一个Activity
  }
}
 
1.frameworks/base/core/java/android/app/Activity.java
<1>.public void startActivity(Intent intent) {
  this.startActivity(intent, null); 
}
<2>.注意:这里继承关系: Activity —-—> ContextThemeWrapper ——> ContextWrapper ——> Context
   ————>public class Activity extends ContextThemeWrapper{}
     ————>public class ContextThemeWrapper extends ContextWrapper{}
       ————>public class ContextWrapper extends Context {}
 
<3>.在frameworks/base/core/java/android/content/Context.java中定义抽象方法startActivity()
    public abstract void startActivity(@RequiresPermission Intent intent);
    并且在frameworks/base/core/java/android/app/ContextImpl.java中实现了startActivity()抽象方法.
    public void startActivity(Intent intent) {
       mMainThread.getInstrumentation().execStartActivity();
    }
2.frameworks/base/core/java/android/app/Instrumentation.java
public ActivityResult execStartActivity(){
  int result = ActivityManagerNative.getDefault().startActivity();
}
 
 
3.frameworks/base/core/java/android/app/ActivityManagerNative.java
<1>.static public IActivityManager getDefault(){
  return gDefault.get();
}
 
<2>.private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>(){
    IBinder b = ServiceManager.getService("activity");
    IActivityManager am = asInterface(b);
    return am;
}
 
4.frameworks/base/core/java/android/os/ServiceManager.java
   public static void getService(String name, IBinder service){
 
   }
<1>.public static IBinder getService(String name) {
  return getIServiceManager().getService(name);
}
 
<2>.private static IServiceManager getIServiceManager() {
  sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
  return sServiceManager;
}
 
 
5.frameworks/base/core/java/com/android/internal/os/BinderInternal.java
public static final native IBinder getContextObject();//jni函数
 
6.frameworks/base/core/jni/android_util_Binder.cpp
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz){
  sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
  return javaObjectForIBinder(env, b);
}
 
7.frameworks/native/libs/binder/ProcessState.cpp
<1>.sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/){
  //这里参数为0,就是ServiceManager的binder handle值。所以这里你给个0,就返回给你servicemanager的Binde
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值