一.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);
}
}