2.4.2 systemReady函数详解

systemReady函数详解如下所示。

[—>NetworkManagementService.java::systemReady]

  1. public void systemReady() {
  2. prepareNativeDaemon();
  3. }

prepareNativeDaemon用于将系统中一些与带宽控制、防火墙相关的规则发送给Netd去执行,其代码如下所示。

[—>NetworkManagementService.java::prepareNativeDaemon]

  1. private void prepareNativeDaemon() {
  2. mBandwidthControlEnabled = false;
  3. // 判断kernel是否支持bandwidthcontrol
  4. final boolean hasKernelSupport = new File("/proc/net/xt_qtaguid/ctrl").exists();
  5. if (hasKernelSupport) {
  6. try {
  7. mConnector.execute("bandwidth", "enable");// 使能bandwidth功能
  8. mBandwidthControlEnabled = true;
  9. } catch .......
  10. }
  11. // 设置Android系统属性"net.qtaguid_enabled"
  12. SystemProperties.set(PROP_QTAGUID_ENABLED, mBandwidthControlEnabled ? "1" : "0");
  13. // 设置Bandwidth规则
  14. synchronized (mQuotaLock) {
  15. int size = mActiveQuotas.size();
  16. if (size > 0) {
  17. // mActiveQuotas保存了每个interface的配额设置
  18. final HashMap<String, Long> activeQuotas = mActiveQuotas;
  19. mActiveQuotas = Maps.newHashMap();
  20. for (Map.Entry<String, Long> entry : activeQuotas.entrySet())
  21. setInterfaceQuota(entry.getKey(), entry.getValue());
  22. }
  23. ......// 其他规则
  24. }
  25. // 设置防火墙规则
  26. setFirewallEnabled(mFirewallEnabled || LockdownVpnTracker.isEnabled());
  27. }

以setFireWallEnabled函数为例,它和Netd交互的方法如下。

[—>NetworkManagementService.java::setFirewallEnabled]

  1. public void setFirewallEnabled(boolean enabled) {
  2. enforceSystemUid();
  3. try {// 发送firewall相关的Command给Netd
  4. mConnector.execute("firewall", enabled ? "enable" : "disable");
  5. mFirewallEnabled = enabled;
  6. }catch ......
  7. }

systemReady函数非常简单,本章就不详述了。