从上篇文章中我们分析了Native层的ServiceManager处理流程,系统给应用层调用的话会提供Java层接口,接下来我们分析这个情景。我们通常可以通过下面代码来获取AudioManager,本文基于aosp13进行分析:
context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
1.Context.getSystemService()
// frameworks/base/core/java/android/app/ContextImpl.java
public Object getSystemService(String name) {
return SystemServiceRegistry.getSystemService(this, name);
}
2.SystemServiceRegistry.getSystemService()
// frameworks/base/core/java/android/app/SystemServiceRegistry.java
// 缓存服务
private static final Map<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS = new ArrayMap<String, ServiceFetcher<?>>();
// 获取服务
public static Object getSystemService(ContextImpl ctx, String name) {
if (name == null) {
return null;
}
final ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
// 部分log打印省略
final Object ret = fetcher.getService(ctx);
return ret;
}
// 静态代码块中注册服务
static {
registerService(Context.AUDIO_SERVICE, AudioManager.class, new CachedServiceFetcher<AudioManager>() {
@Override
public AudioManager createService(ContextImpl ctx) {
return new AudioManager(ctx);
}});
}
// 到这里可以知道,获取到了AudioManager对象
3.AudioManager.getService()
// /frameworks/base/media/java/android/media/AudioManager.java
// aidl很熟悉的代码,创建了IAudioService,但是多了个ServiceManager是啥,这个很关键,我们接着看
static IAudioService getService()
{
if (sService != null) {
return sService;
}
IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
sService = IAudioService.Stub.asInterface(b);
return sService;
}
4.ServiceManager.getService()
// /frameworks/base/core/java/android/os/ServiceManager.java
// 获取Binder服务
public static IBinder getService(String name) {
try {
IBinder service = sCache.get(name);
if (service != null) {
return service;
} else {
return Binder.allowBlocking(rawGetService(name)); // Binder.allowBlocking可以忽略
}
} catch (RemoteException e) {
Log

文章详细解析了在Android系统中如何通过Context获取AudioManager服务的过程,涉及到的关键步骤包括Context的getSystemService方法、SystemServiceRegistry、ServiceFetcher、AudioManager的getService以及ServiceManager。在这一过程中,涉及到Binder机制,包括Java层和Native层的交互,如何通过BinderProxy和BpBinder建立服务连接。
最低0.47元/天 解锁文章
1055

被折叠的 条评论
为什么被折叠?



