1.涉及修改的类如下:
frameworks\base\services\java\com\android\server\SystemServer.java
frameworks\base\services\core\java\com\android\server\SpecialManagerService.java
frameworks\base\core\java\com\nwd\os\SpecialManager.java
frameworks\base\core\java\com\nwd\os\ISpecialManager.aidl
frameworks\base\core\java\android\app\SystemServiceRegistry.java
frameworks/base/core/java/android/content/Context.java
frameworks/base/Android.bp
2.修改如下:
frameworks\base\services\java\com\android\server\SystemServer.java
import com.android.server.SpecialManagerService;
...
private SpecialManagerService mSpecialManagerService;
private void startBootstrapService(@NonNull TimingTraceAndSlog T){
.....
mSpecialManagerService = mSystemServiceManager.startService(SpecialManagerService.class);
}
...
private void startOtherService(@NonNull TimingTraceAndSlog T){
..........
mSpecialManagerService.setWindowManager(wm);
mSpecialManagerService.setActivityManager(mActivityManagerService);
................
mActivityManagerService.systemReady(() -> {
// start add for specialManager
try {
mSpecialManagerService.systemReady();
} catch (Throwable e) {
reportWtf("making SpecialManager Service ready", e);
}
//end
}
frameworks\base\services\core\java\com\android\server\SpecialManagerService.java
import android.content.Context;
/**
* The special manager service is responsible for vehicle equipment system
* functions management.
*/
+public final class SpecialManagerService extends SystemService {
private static final String TAG = "SpecialManagerService";
private static final boolean DEBUG = true;
private final Context mContext;
...............
StatusBarManagerService mStatusBar;
WindowManagerService mWindowManager;
ActivityManagerService mActivityManager;
public SpecialManagerService(Context context) {
super(context);
mContext = context;
}
@Override
public void onStart() {
print("onStart");
publishBinderService(Context.SPECIAL_MANAGER_SERVICE, mService);
}
@Override
public void onBootPhase(int phase) {
.............
}
public void setWindowManager(WindowManagerService wm) {
mWindowManager = wm;
}
public void setActivityManager(ActivityManagerService am) {
mActivityManager = am;
}
// system is ready!!!
public void systemReady() {
.......
}
// ================================================== ISpecoalManager API ------
public final IBinder mService = new ISpecoalManager.Stub() {
@Override
public boolean isSplitScreenMode() {
return false;
}
........
}
}
frameworks\base\core\java\com\nwd\os\ISpecialManager.aidl
package com.nwd.os;
interface ISpecialManager{
boolean isSplitScreenMode();
}
frameworks\base\core\java\com\nwd\os\SpecialManager.java
import com.nwd.os.ISpecialManager;
import android.content.Context;
public class SpecialManager {
.........
private final ISpecialManager mService;
public SpecialManager(ISpecialManager service, Context context) {
mService = service;
}
........
public boolean isSplitScreenMode() {
try {
return mService.isSplitScreenMode();
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
.........
}
frameworks\base\core\java\android\app\SystemServiceRegistry.java
public final class SystemServiceRegistry {
...
...
registerService(Context.SPECIAL_SERVICE, SpecialManager.class,
new CachedServiceFetcher<SpecialManager>() {
@Override
public MapServiceManager createService(ContextImpl ctx) {
//通过服务名称获取其binder
IBinder b = ServiceManager.getService(Context.SPECIAL_SERVICE);
//将binder转为接口对象,传递给manager管理
ISpecialManager service = ISpecialManager.Stub.asInterface(b);
return new SpecialManager(service,ctx);
}});
...
...
}
frameworks/base/core/java/android/content/Context.java
/**@hide**/
@StringDef(suffix = {"_SERVICE"},vaule = {
....
SPECIAL_SERVICE,
....
})
public static final String SPECIAL_SERVICE = "special_service";
frameworks/base/Android.bp
...
java_library {san
...
"core/java/com/nwd/os/ISpecialManager.aidl",
...
}
...