Android 9 Wifi 服务启动流程(1)

Wifi 服务启动流程

从SystemServer开始分析,以 main 函数作为入口
1、SystemServer.java
(路径:\frameworks\base\services\java\com\android\server\SystemServer.java)

   /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();  //调用 SystemServer 的 run 函数
    }
    

2、run函数启动服务
(路径:\frameworks\base\services\java\com\android\server\SystemServer.java)

private void run() {
	...
		//启动服务
		// Start services.
        try {
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices(); //WIfI 服务在这里
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }
    ...
}

3、startOtherServices
(路径:\frameworks\base\services\java\com\android\server\SystemServer.java)

 private void startOtherServices() {
	if (context.getPackageManager().hasSystemFeature(
		       PackageManager.FEATURE_WIFI)) {
	           // Wifi Service must be started first for wifi-related services.
	           traceBeginAndSlog("StartWifi");
	           //WIFI_SERVICE_CLASS = "com.android.server.wifi.WifiService"
	           mSystemServiceManager.startService(WIFI_SERVICE_CLASS); //开启wifi服务 
	          traceEnd();
	          traceBeginAndSlog("StartWifiScanning");
	          mSystemServiceManager.startService(
	          			"com.android.server.wifi.scanner.WifiScanningService");   //开启wifi扫描服务
	          traceEnd();
	   }
}

4、SystemManger.java的startService启动服务
(路径:frameworks\base\services\core\java\com\android\server\SystemServiceManager.java )

/**
* Starts a service by class name.
*
* @return The service instance.
*/
@SuppressWarnings("unchecked")
public SystemService startService(String className) {
    final Class<SystemService> serviceClass;
    try {
         serviceClass = (Class<SystemService>)Class.forName(className); //获取到类名
    } catch (ClassNotFoundException ex) {
      	Slog.i(TAG, "Starting " + className);
            throw new RuntimeException("Failed to create service " + className
                    + ": service class not found, usually indicates that the caller should "
                    + "have called PackageManager.hasSystemFeature() to check whether the "
                    + "feature is available on this device before trying to start the "
                    + "services that implement it", ex);
    }
      return startService(serviceClass);
}

startService(Class serviceClass)

 public <T extends SystemService> T startService(Class<T> serviceClass) {
	...
	Constructor<T> constructor = serviceClass.getConstructor(Context.class);
	service = constructor.newInstance(mContext);//创建实例	
	...
	startService(service); 启动服务
	...
}

startService(@NonNull final SystemService service)

public void startService(@NonNull final SystemService service) {
	// 将服务注册列表里 统一管理
    mServices.add(service);
    // 应该接收生命周期事件的服务
    // private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
    ...
    service.onStart(); //wifiService的onStart方法
    ...
}

5、WifiService.java
(路径:frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiService.java)

public final class WifiService extends SystemService {
	...
	 @Override
    public void onStart() {
        Log.i(TAG, "Registering " + Context.WIFI_SERVICE);
        publishBinderService(Context.WIFI_SERVICE, mImpl);\\发布服务,调用父类的方法
    }
	...
}

6、SystemService.java 将service添加到ServiceManager
(frameworks\base\services\core\java\com\android\server\SystemService.java)

	/**
      * 发布服务,以便其他服务和应用程序可以访问它。
      *
      * @param name 新服务的名称
      * @param service 服务对象
      */
    protected final void publishBinderService(String name, IBinder service) {
        publishBinderService(name, service, false);
    }
     
    /** 发布服务,以便其他服务和应用程序可以访问它。
     *
     * @param name 新服务的名称
     * @param service 服务对象
     * @param allowIsolated 设置为 true 以允许隔离的沙盒进程访问此服务
     */
    protected final void publishBinderService(String name, IBinder service,
            boolean allowIsolated) {
        publishBinderService(name, service, allowIsolated, DUMP_FLAG_PRIORITY_DEFAULT);
    }

	/**
     * 发布服务,以便其他服务和应用程序可以访问它。
     *
     * @param name 新服务的名称
     * @param service 服务对象
     * @param allowIsolated 设置为 true 以允许隔离沙盒进程访问此服务
     * @param dumpPriority 支持作为位掩码的转储优先级
     */
    protected final void publishBinderService(String name, IBinder service,boolean allowIsolated, int dumpPriority) {
    	//将service添加到ServiceManager
        ServiceManager.addService(name, service, allowIsolated, dumpPriority);
    }

这个时候整个WiFi服务已经正常启动可用实现通讯了

ServiceManager提供binder通讯服务

持续更新

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值