笔记

前言:

android系统是基于linux系统的多进程系统;
android系统从启动开始,顺序启动三个重要的进程init,zygote,systemServer; //前俩个涉及到c、cpp,搞不定,下一步再说 ##

SystemServer

官方解释:SystemServer是android系统java层框架的核心,维护着android系统核心服务
自己解释:mmp,现阶段SystemServer就是祖宗,得从SystemServer开始把他的子孙搞个遍

SystemServer启动重要的服务(AMS,WMS,等)

//SystemServer是有入口的
public static void main(String[] args) {
    new SystemServer().run();
}

//以AMS为例
private void run() {
    //1.其他也很重要的事略
    //2.启动系统服务的核心方法
    startBootstrapServices();
    startCoreServices();//启动一些服务如BatteryService,UsageStatsService以后再说
    startOtherServices();
}

//1.创建ams
private void startBootstrapServices() {
    mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setSystemProcess();
}

private void startOtherServices() {
    mActivityManagerService.systemReady()
}

ams启动有三个关键方法:
1.mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService()
2.mActivityManagerService.setSystemProcess()
3.mActivityManagerService.systemReady()

startService:初始化服务

public <T extends SystemService> T startService(Class<T> serviceClass) {
    final String name = serviceClass.getName();
    //构造器
    Constructor<T> constructor = serviceClass.getConstructor(Context.class);
    //反射创建
    service = constructor.newInstance(mContext);
    return service;
}

//结合上面参数ActivityManagerService.Lifecycle.class,看看Lifecycle
public static final class Lifecycle extends SystemService {
    private final ActivityManagerService mService;

    public Lifecycle(Context context) {
        super(context);
        //创建Lifecycle的同时,创建了ActivityManagerService
        mService = new ActivityManagerService(context);
    }

    @Override
    public void onStart() {
        mService.start();
    }

    public ActivityManagerService getService() {
        return mService;
    }
}

//再看ActivityManagerService的构造干嘛了
public ActivityManagerService(Context systemContext) {


    mHandlerThread = new ServiceThread(TAG,
            THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
    mHandlerThread.start();
    mHandler = new MainHandler(mHandlerThread.getLooper());
    //主线程消息循环
    mUiHandler = mInjector.getUiHandler(this);

    //创建 /data/system/文件夹
    File dataDir = Environment.getDataDirectory();
    File systemDir = new File(dataDir, "system");
    systemDir.mkdirs();

    //看门狗,ams停止响应,杀掉systemServer,导致重启
    Watchdog.getInstance().addMonitor(this);
    //看门狗,mHandler消息队列阻塞,杀掉systemServer,导致重启
    Watchdog.getInstance().addThread(mHandler);
}

setSystemProcess: 添加至系统服务管理进程ServiceManager中,并调整该服务进程的优先级

public void setSystemProcess() {
    try {
        //注册到系统的ServiceManager
        ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
        ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
        ServiceManager.addService("meminfo", new MemBinder(this));
        ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
        ServiceManager.addService("dbinfo", new DbBinder(this));
        if (MONITOR_CPU_USAGE) {
            ServiceManager.addService("cpuinfo", new CpuBinder(this));
        }
        ServiceManager.addService("permission", new PermissionController(this));
        ServiceManager.addService("processinfo", new ProcessInfoService(this));
        //由上面那些可以知道ams管理者很多功能

        ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
                "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
        mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());

        synchronized (this) {
            ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
            app.persistent = true;
            app.pid = MY_PID;
            app.maxAdj = ProcessList.SYSTEM_ADJ;
            app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
            synchronized (mPidsSelfLocked) {
                mPidsSelfLocked.put(app.pid, app);
            }

            //调整进程调度优先级
            updateLruProcessLocked(app, false, null);
            //调整OOM_ADj值(查看分配内存的依据值)
            updateOomAdjLocked();
        }
    } catch (PackageManager.NameNotFoundException e) {
        throw new RuntimeException(
                "Unable to find android system package", e);
    }
}

systemReady:启动的状态设置等

public void systemReady(final Runnable goingCallback, BootTimingsTraceLog traceLog) {
    traceLog.traceBegin("PhaseActivityManagerReady");
    synchronized(this) {
        mAppOpsService.systemReady();
        mSystemReady = true;

    }

    ArrayList<ProcessRecord> procsToKill = null;
    synchronized(mPidsSelfLocked) {
        for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
            ProcessRecord proc = mPidsSelfLocked.valueAt(i);
            if (!isAllowedWhileBooting(proc.info)){
                if (procsToKill == null) {
                    procsToKill = new ArrayList<ProcessRecord>();
                }
                procsToKill.add(proc);
            }
        }
    }
    synchronized(this) {
        if (procsToKill != null) {
            for (int i=procsToKill.size()-1; i>=0; i--) {
                ProcessRecord proc = procsToKill.get(i);
                Slog.i(TAG, "Removing system update proc: " + proc);
                removeProcessLocked(proc, true, false, "system update done");
            }
        }

        // Now that we have cleaned up any update processes, we
        // are ready to start launching real processes and know that
        // we won't trample on them any more.
        mProcessesReady = true;
    }
    //利用removeProcessLocked方法,把优先于ams的进程都关闭

    //启动launcher
    startHomeActivityLocked(currentUserId, "systemReady");
}

小结:SystemServer作为android系统中重要的进程。
他的作用有:加载了“android—servers”库,创建了系统的context,最主要的是创建了启动了android系统中重要的服务(ams,wms,pms,等等)
这样一个android设备的功能就能正常的运行。
至于每一个系统级服务怎么添加到ServiceManager中(被管理和获取),怎么运作等,一步步分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值