Android 10以后引入了stable aidl方法,结合上一篇中WifiManager类中通过aidl调用到WifiServiceImpl类中方法,做个详细的记录.
一.frameworks/base/wifi/java/android/net/wifi/WifiManager.java类中方法
public boolean startSoftAp(@Nullable WifiConfiguration wifiConfig) {
try {
return mService.startSoftAp(wifiConfig);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
其中mService在类中定义为:
@UnsupportedAppUsage
IWifiManager mService;
赋值操作在构造函数里面:
public WifiManager(@NonNull Context context, @NonNull IWifiManager service,
@NonNull Looper looper) {
mService = service;
mLooper = looper;
}
IWifiManager为frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl {
startsoftap(){..}
}
二:开始找WifiManager在哪里进行实例话的,service传的哪个service
在framework/base/wifi/java/android/net/wifi/WifiFrameworkInitializer.java
public static void registerServiceWrappers() {
SystemServiceRegistry.registerContextAwareService(
Context.WIFI_SERVICE,
WifiManager.class,
(context, serviceBinder) -> {
IWifiManager service = IWifiManager.Stub.asInterface(serviceBinder);
return new WifiManager(context, service, getInstanceLooper());
}
);
IWifiManager service通过标准的asInterface函数得到实例.
WIFI_SERVICE定义"wifi"
三:在wifi service中寻找IWifiManager 接口的绑定
在frameworks/opt/net/wifi/service/java/com/android/server/wifi/BaseWifiService.java类中实现.
先导入IWifiManager aidl包.
import android.net.wifi.IWifiManager;
然后BaseWifiService继承IWifiManager.Stub
public class BaseWifiService extends IWifiManager.Stub {
startsoftap(){..}
}
该类里面全是接口的声明.实际的实现在impl类里面
四.接口的实际实现位置
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
public class WifiServiceImpl extends BaseWifiService {
startsoftap(){..}
}
该类继承第三步中的BaseWifiService,真正实现了IWifiManager aidl中的接口功能.
这是Android 11中wifimanger中对应adil 调用实现流程.如果我们自己想加服务的话,也可以按照同样的步骤来进行操作