Android 11 Radio 服务启动流程

1,576 阅读2分钟

一.Radio的hal层服务启动流程

文件:

hardware/interfaces/broadcastradio/2.0/default/android.hardware.broadcastradio@2.0-service.rc
hardware/interfaces/broadcastradio/2.0/default/service.cpp
hardware/interfaces/broadcastradio/2.0/default/BroadcastRadio.cpp

概述: Radio模块hal层服务被init.rc进程拉起,在1.0/1.1/1.2版本的BroadcastRadio.cpp构造的时候会获取AM,DAB的配置,服务名称为amfm和dab,等待上层调用其中的函数

init.rc相关代码

service broadcastradio-hal2 /vendor/bin/hw/android.hardware.broadcastradio@2.0-service
    interface android.hardware.broadcastradio@2.0::IBroadcastRadio default
    class hal
    user audioserver
    group audio

init.rc启动后执行的代码service.cpp, 注册了名称为amfm和dab的服务

int main() {
    android::base::SetDefaultTag("BcRadioDef");
    android::base::SetMinimumLogSeverity(android::base::VERBOSE);
    configureRpcThreadpool(4, true);

    sp<BroadcastRadio> broadcastRadio(new BroadcastRadio(gAmFmRadio));
    auto amFmStatus = broadcastRadio->registerAsService("amfm");
    CHECK_EQ(amFmStatus, android::OK)
        << "Failed to register Broadcast Radio AM/FM HAL implementation";

    sp<BroadcastRadio> dabRadio(new BroadcastRadio(gDabRadio));
    auto dabStatus = dabRadio->registerAsService("dab");
    CHECK_EQ(dabStatus, android::OK) << "Failed to register Broadcast Radio DAB HAL implementation";

    joinRpcThreadpool();
    return 1;  // joinRpcThreadpool shouldn't exit
}

二.Radio的framework层服务启动流程

文件

frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/core/java/android/app/ApplicationPackageManager.java
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
frameworks/base/core/java/com/android/server/SystemConfig.java
frameworks/base/services/core/java/com/android/server/broadcastradio/BroadcastRadioService.java
frameworks/base/services/core/java/com/android/server/SystemService.java

当系统启动SystemServer进程,执行startOtherServices方法,先通过PackageManageService(安装管理服务)读取配置文件(vendor/etc/permissions/android.hardware.broadcastradio.xml)是否存在( feature name="android.hardware.broadcastradio" ),正常都能走到startService


private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    ....
    if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_BROADCAST_RADIO)) {
        t.traceBegin("StartBroadcastRadioService");
        mSystemServiceManager.startService(BroadcastRadioService.class);
        t.traceEnd();
    }
    ...
}
PackageManager.FEATURE_BROADCAST_RADIO名称为android.hardware.broadcastradio

1.1mPackageManager.hasSystemFeature(PackageManager.FEATURE_BROADCAST_RADIO)调用流程

public class ApplicationPackageManager extends PackageManager {
    //首先调用这个函数
    @Override
    public boolean hasSystemFeature(String name) {
        return hasSystemFeature(name, 0);  
    }
    // 从系统特征缓存中查询
    @Override
    public boolean hasSystemFeature(String name, int version) {
        return mHasSystemFeatureCache.query(new HasSystemFeatureQuery(name, version));
    }
    
    // 从PackageManagerService中查询是否存在
    private final static PropertyInvalidatedCache<HasSystemFeatureQuery, Boolean>
            mHasSystemFeatureCache =
            new PropertyInvalidatedCache<HasSystemFeatureQuery, Boolean>(
                256, "cache_key.has_system_feature") {
                @Override
                protected Boolean recompute(HasSystemFeatureQuery query) {
                    try {
                        return ActivityThread.currentActivityThread().getPackageManager().
                            hasSystemFeature(query.name, query.version);
                    } catch (RemoteException e) {
                        throw e.rethrowFromSystemServer();
                    }
                }
            };

}

1.2.调用到PackageManagerService服务的hasSystemFeature方法

public class PackageManagerService extends IPackageManager.Stub
        implements PackageSender {
    // 构造函数从系统配置中读取相关特性
    public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
        SystemConfig systemConfig = SystemConfig.getInstance();
        mAvailableFeatures = systemConfig.getAvailableFeatures();
    }

    @Override
    public boolean hasSystemFeature(String name, int version) {
        // allow instant applications
        synchronized (mAvailableFeatures) {
            final FeatureInfo feat = mAvailableFeatures.get(name);
            if (feat == null) {
                return false;
            } else {
                return feat.version >= version;
            }
        }
    }
}

1.3.PackageManagerService服务创建会读取相关配置文件(其中vendor/etc/permissions/android.hardware.broadcastradio.xml),将读取的feature 特性加入到mAvailableFeatures缓存中。

public class SystemConfig {
    // These are the features this devices supports that were read from the
    // system configuration files.
    final ArrayMap<String, FeatureInfo> mAvailableFeatures = new ArrayMap<>();

    private void readAllPermissions() {
        ...
        readPermissions(Environment.buildPath(
                Environment.getVendorDirectory(), "etc", "permissions"), vendorPermissionFlag);
        ...
    }

    @VisibleForTesting
    public void readPermissions(File libraryDir, int permissionFlag) {
        File platformFile = null;
        for (File f : libraryDir.listFiles()) {
            ...
            readPermissionsFromXml(f, permissionFlag);
        }
        ...
    }
  
    private void readPermissionsFromXml(File permFile, int permissionFlag) {
        ...
        addFeature(fname, fversion);
        ...
    }

    private void addFeature(String name, int version) {
        ...
        FeatureInfo fi = mAvailableFeatures.get(name);
        ...
    }

    public ArrayMap<String, FeatureInfo> getAvailableFeatures() {
        return mAvailableFeatures;
    }

}

vendor/etc/permissions/android.hardware.broadcastradio.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- This is the standard set of features for a broadcast radio. -->
<permissions>
    <feature name="android.hardware.broadcastradio" />
</permissions>

2 注册发布服务mSystemServiceManager.startService(BroadcastRadioService.class),此处在构造函数创建java层的Hal代理对象(hal层服务已经在init进程中创建), onStart方法调用父类添加服务

public class BroadcastRadioService extends SystemService {
   
    private final ServiceImpl mServiceImpl = new ServiceImpl();

    private final com.android.server.broadcastradio.hal1.BroadcastRadioService mHal1;
    private final com.android.server.broadcastradio.hal2.BroadcastRadioService mHal2;

    private final Object mLock = new Object();
    private List<RadioManager.ModuleProperties> mV1Modules = null;

    public BroadcastRadioService(Context context) {
        super(context);

        mHal1 = new com.android.server.broadcastradio.hal1.BroadcastRadioService();
        mV1Modules = mHal1.loadModules();
        OptionalInt max = mV1Modules.stream().mapToInt(RadioManager.ModuleProperties::getId).max();
        mHal2 = new com.android.server.broadcastradio.hal2.BroadcastRadioService(
                max.isPresent() ? max.getAsInt() + 1 : 0);
    }
    // 在SystemServiceManager中回调
    @Override
    public void onStart() {
        // 调用父类的方法通过ServiceManager.addService添加服务
        publishBinderService(Context.RADIO_SERVICE, mServiceImpl);
    }

    private class ServiceImpl extends IRadioService.Stub {


        @Override
        public List<RadioManager.ModuleProperties> listModules() {
            enforcePolicyAccess();
         
        }

        @Override
        public ITuner openTuner(int moduleId, RadioManager.BandConfig bandConfig,
                boolean withAudio, ITunerCallback callback) throws RemoteException {
           
        }

        @Override
        public ICloseHandle addAnnouncementListener(int[] enabledTypes,
                IAnnouncementListener listener) {
         
        }
    }
}


public class SystemServiceManager {
    public <T extends SystemService> T startService(Class<T> serviceClass) {
       ...
        final T service;
        Constructor<T> constructor = serviceClass.getConstructor(Context.class);
        service = constructor.newInstance(mContext);
        startService(service);
        return service;
        ...
    }

    public void startService(@NonNull final SystemService service) {
      ...
        service.onStart();
      ...
    }
}

public abstract class SystemService {
    // 添加服务
    protected final void publishBinderService(String name, IBinder service,
            boolean allowIsolated, int dumpPriority) {
        ServiceManager.addService(name, service, allowIsolated, dumpPriority);
    }

}