ServiceManager addService流程

 

1.zygote启动

zygote是由init进程通过解析 init.zygote.rc 文件而创建的,zygote所对应的可执行程序
app_process,所对应的源文件是 app_main.cpp ,进程名为zygote

// system/core/rootdir/init.zygote32.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --startsystem-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
writepid /dev/cpuset/foreground/tasks

1-2.执行app_main.cpp 中的main方法

int main(int argc, char* const argv[])
{
    ...
    runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    ...
}

1-3.AndroidRuntime::start

runtime继承自AndroidRuntime

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
    //启动虚拟机
    if (startVm(&mJavaVM, &env, zygote) != 0) {
        return;
    }
    onVmCreated(env);

    /*
     * Register android functions.注册jni
     */
    if (startReg(env) < 0) {
        ALOGE("Unable to register all android natives\n");
        return;
    }

    //反射调用ZygoteInit main()方法
   jmethodID startMeth = env->GetStaticMethodID(startClass, "main","([Ljava/lang/String;)V");
        
      env->CallStaticVoidMethod(startClass, startMeth, strArray);
    ...
}
package com.android.internal.os;
//ZygoteInit
public static void main(String argv[]) {
        ...
            // 标记Zygote开始初始化,并Hook确保不创建其他线程
            ZygoteHooks.startZygoteNoThreadCreation();

            // In such cases, we will preload things prior to our first fork.
            if (!enableLazyPreload) {
               //预加载资源
                preload(bootTimingsTraceLog);
                
            } else {
                Zygote.resetNicePriority();
            }

            ...
            ZygoteHooks.stopZygoteNoThreadCreation();
            if (startSystemServer) {
                //forkSystemServer
                Runnable r = forkSystemServer(abiList, socketName, zygoteServer);

                if (r != null) {
                    r.run();
                    return;
                }
            }

           ...
            zygoteServer.closeServerSocket();
    }

frameworks/base/services/java/com/android/server/SystemServer.java

public static void main(String[] args) {
        new SystemServer().run();
    }

1-1.run

    private void run() {
        try {
            
            Looper.prepareMainLooper();
            
            // Initialize native services.
            System.loadLibrary("android_servers");

            // Initialize the system context.
            createSystemContext();

            // Create the system service manager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // Prepare the thread pool for init tasks that can be parallelized
            SystemServerInitThreadPool.get();
        } finally {
            traceEnd();  // InitBeforeStartServices
        }

        // Start services.
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
        } 

        // Loop forever.
        Looper.loop();
        
    }
    private void startBootstrapServices() {
        

        // Activity manager runs the show.
    
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
       ...
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
        ...
        mSystemServiceManager.startService(RecoverySystemService.class);
        ...
        mSystemServiceManager.startService(LightsService.class);
        ...
            mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);
        ...
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

mActivityManagerService.setSystemProcess();
...
    }

1-3.setSystemProcess

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.
java
// 2172
public void setSystemProcess() {
// 2174 添加 AMS("activity")到 service_manager中
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);

1-4.ServiceManager.addService

frameworks/base/core/java/android/os/ServiceManager.java

public static void addService(String name, IBinder service, boolean
allowIsolated) {
//(分别分析 getIServiceManager和 addService)
getIServiceManager().addService(name, service, allowIsolated);

2.getIServiceManager

frameworks/base/core/java/android/os/ServiceManager.java

private static IServiceManager getIServiceManager() {
/* 采用单例形式返回 ServiceManagerProxy对象 */
    if (sServiceManager != null) {
        return sServiceManager;
    } 
    //相当于 new ServiceManagerProxy(new BinderProxy); 
    sServiceManager =
    ServiceManagerNative.asInterface(BinderInternal.getContextObject());
    return sServiceManager;
}

2-1.BinderInternal.getContextObject

frameworks/base/core/java/com/android/internal/os/BinderInternal.java

public static final native IBinder getContextObject();

2-1-1.android_os_BinderInternal_getContextObject

frameworks/base/core/jni/android_util_Binder.cpp

static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject
clazz)
{
/* 打开 binder驱动(ProcessState是单例的),创建 BpBinder(handle) 对象,并返回 */
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b);
}

2-1-2.javaObjectForIBinder BpBinder与BinderProxy互相绑定

frameworks/base/core/jni/android_util_Binder.cpp

jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val)
//从 BpBinder中查找 BinderProxy对象,第一次为 null
jobject object = (jobject)val->findObject(&gBinderProxyOffsets);
//创建 BinderProxy对象
object = env->NewObject(gBinderProxyOffsets.mClass,gBinderProxyOffsets.mConstructor);
//BinderProxy.mObject成员变量记录 BpBinder对象
env->SetLongField(object, gBinderProxyOffsets.mObject, (jlong)val.get());
//将 BinderProxy对象信息添加到 BpBinder的成员变量 mObjects中
val->attachObject(&gBinderProxyOffsets, refObject,
jnienv_to_javavm(env), proxy_cleanup);
//inderProxy.mOrgue成员变量记录死亡通知对象
env->SetLongField(object, gBinderProxyOffsets.mOrgue, reinterpret_cast<jlong>
(drl.get()));

2-2.ServiceManagerNative.asInterface

frameworks/base/core/java/android/os/ServiceManagerNative.java

static public IServiceManager asInterface(IBinder obj)
    {
        if (obj == null) {
            return null;
        }
        //obj为 BinderProxy,默认返回 null
        IServiceManager in =(IServiceManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }
        
        return new ServiceManagerProxy(obj);
    }

2-3.ServiceManagerProxy

frameworks/base/core/java/android/os/ServiceManagerNative.java$ServiceManagerPro
xy.java

class ServiceManagerProxy implements IServiceManager {
    public ServiceManagerProxy(IBinder remote) {
        mRemote = remote;
    }
    
    public IBinder asBinder() {
        return mRemote;
    }
    
    public IBinder getService(String name) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IServiceManager.descriptor);
        data.writeString(name);
        mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);
        IBinder binder = reply.readStrongBinder();
        reply.recycle();
        data.recycle();
        return binder;
    }

    ...

    public void addService(String name, IBinder service, boolean allowIsolated)
            throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IServiceManager.descriptor);
        data.writeString(name);
        data.writeStrongBinder(service);
        data.writeInt(allowIsolated ? 1 : 0);
        mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0);
        reply.recycle();
        data.recycle();
    }
    
    ...
}

3.SMP.addService--1

3.1 data.writeStrongBinder(service)

nativeWriteStrongBinder(mNativePtr, val);

android_os_Parcel_writeStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object)

static void android_os_Parcel_writeStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object)
{
//将java层 Parcel转换为 native层 Parcel
    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
    if (parcel != NULL) {
        const status_t err = parcel->writeStrongBinder(ibinderForJavaObject(env, object));
        if (err != NO_ERROR) {
            signalExceptionForError(env, clazz, err);
        }
    }
}

3-2-1.ibinderForJavaObject

sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj)
{
    if (obj == NULL) return NULL;

    // 是否是 Java层的 Binder对象,此处是 AMS,if命中
    if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) {
        JavaBBinderHolder* jbh = (JavaBBinderHolder*)
            env->GetLongField(obj, gBinderOffsets.mObject);
    //返回 JavaBBinder对象
        return jbh != NULL ? jbh->get(env, obj) : NULL;
    }

    if (env->IsInstanceOf(obj, gBinderProxyOffsets.mClass)) {
        return (IBinder*)
            env->GetLongField(obj, gBinderProxyOffsets.mObject);
    }

    ALOGW("ibinderForJavaObject: %p is not a Binder object", obj);
    return NULL;
}

3-2-2.(Parcel.cpp)parcel->writeStrongBinder

flatten_binder(ProcessState::self(), val, this);

3.3 mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0)

BinderProxy.transact --> transactNative(code, data, reply, flags);

jni调用android_os_BinderProxy_transac

//获取 BpBinder 对象
IBinder* target = (IBinder*)env->GetLongField(obj, gBinderProxyOffsets.mObject);
status_t err = target->transact(code, *data, reply, flags);

3-3.1BpBinder::transact

status_t BpBinder::transact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    // Once a binder has died, it will never come back to life.
    if (mAlive) {
        status_t status = IPCThreadState::self()->transact(
            mHandle, code, data, reply, flags);
        if (status == DEAD_OBJECT) mAlive = 0;
        return status;
    }

    return DEAD_OBJECT;
}

3-4.IPCThreadState::transact

status_t IPCThreadState::transact(int32_t handle,
                                  uint32_t code, const Parcel& data,
                                  Parcel* reply, uint32_t flags)
{
    status_t err = data.errorCheck();

    flags |= TF_ACCEPT_FDS;

   
    if (err == NO_ERROR) {
        //整理数据,并把结果存入 mOut 中。(在 talkWithDriver方法中才会将命令真正发送给
Binder驱动)
        err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL);
    }
    
  ...
    
    if ((flags & TF_ONE_WAY) == 0) {
       
        if (reply) {
            err = waitForResponse(reply);
        } else {
            Parcel fakeReply;
            err = waitForResponse(&fakeReply);
        }


    } else {
        err = waitForResponse(NULL, NULL);
    }
    
    return err;
}

3-4-1.writeTransactionData

status_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags,
    int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer)
{
   ...
    // mOut写入命令为 BC_TRANSACTION
    mOut.writeInt32(cmd);
    // 写入 binder_transaction_data数据
    mOut.write(&tr, sizeof(tr));
    
    return NO_ERROR;
}

3-5.IPCThreadState::waitForResponse--1

status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)
{
    uint32_t cmd;
    int32_t err;

    while (1) {
        if ((err=talkWithDriver()) < NO_ERROR) break;
       ...
    }
    
    return err;
}

3-5-1.talkWithDriver

status_t IPCThreadState::talkWithDriver(bool doReceive)
{
        ...
        //写入命令 BC_TRANSACTION
        if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0)
        ...
    return err;
}

3-5-2.binder_ioctl_write_read--1

binder_transaction(proc, thread, &tr,cmd == BC_TRANSACTION, 0); 

/* 获取目标对象的 target_node,目标是 service_manager,所以可以直接使用全局变量
binder_context_mgr_node */
target_node = context->binder_context_mgr_node;
/* 1919 target_proc为 service_manager进程 */
target_proc = target_node->proc;

// 1954 找到 service_manager进程的 todo队列
target_list = &target_proc->todo;
target_wait = &target_proc->wait;

// 生成一个 binder_transaction 变量(即变量 t),用于描述本次要进行的
transaction(最后将其加入 target_thread->todo)。
// 这样当目标对象被唤醒时,它就可以从这个队列中取出需要做的工作。
t = kzalloc(sizeof(*t), GFP_KERNEL);
//生成一个binder_work变量(即变量 tcomplete),用于说明当前调用者线程有一宗未完成的
transaction(它最后会被添加到本线程的 todo队列中)
tcomplete = kzalloc(sizeof(*tcomplete), GFP_KERNEL);

- addService

  - data.writeStrongBinder(service); -- service == AMS --- 将AMS 放入 data中

  - mRemote.transact --- mRemote == BinderProxy

    - 获取BpBinder  --- IPCThreadState::transact

      - 1.writeTransactionData --- out 写入命令 --write  --- cmd == BC_TRANSACTION

      - 2.waitForResponse

        - talkWithDriver -- 非常重要 --- 代码非常长

          - binder_transaction

            - handle == 0 --》 sm

            - 1. target_node

              2. proc

              3. todo,wait

              4. 创建t,tcomplete,

              5. 数据拷贝

              6. binder_transaction_binder --> handle

              7. thread->transaction_stack = t; ---> 方便sm找到client

              8. t->work.type = BINDER_WORK_TRANSACTION; -- 给sm -- 做事

              9. tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE; -- 给client--挂起

              10. wake_up_interruptible 唤醒sm

      - client挂起

        - BR_NOOP ,BR_TRANSACTION_COMPLETE

        - wait_event_freezable --- 挂起

      - sm处理添加服务

        - BINDER_WORK_TRANSACTION --- 要处理 cmd == BR_TRANSACTION

        - 1. reply初始化

          2. res = func(bs, txn, &msg, &reply); --- 函数指针 --- svcmgr_handler作用:获取或者添加 service

             1. sm是用 svclist  保存所有服务的

          3. binder_send_reply --- bc_reply

          4. t->work.type = BINDER_WORK_TRANSACTION; --- 给Client

             list_add_tail(&t->work.entry, target_list);

             tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE; -- 给SM --- 被挂起

             list_add_tail(&tcomplete->entry, &thread->todo);

          5. wake_up_interruptible(target_wait); -- 唤醒 Client

      - client 被唤醒

        - BINDER_WORK_TRANSACTION --- cmd = BR_REPLY;

SM 处理 onTransact

- IPCThreadState::executeCommand

  -  error = reinterpret_cast<BBinder*>(tr.cookie)->transact(tr.code, buffer, &reply, tr.flags);

  - JavaBBinder.onTransact --- C++

  - jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact,

                code, reinterpret_cast<jlong>(&data), reinterpret_cast<jlong>(reply), flags); -- Binder.java.execTransact 方法

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值