部分一
一 我們首先需要寫好自己的服務
frameworks/base/core/java/android/content/dyna/DynaSystemManager.java
frameworks/base/core/java/android/content/dyna/IDynaSystemManager.aidl
frameworks/base/services/core/java/com/android/server/dyna/DynaSystemService.java
這一部分可根據業務需求實現,真正實現是在DynaSystemService中
二 我們需要去註冊我們的服務
frameworks/base/core/java/android/app/SystemServiceRegistry.java
--- a/frameworks/base/core/java/android/app/SystemServiceRegistry.java
+++ b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
@@ -158,6 +158,11 @@ import com.mediatek.usp.UspManager;
import java.util.HashMap;
+//weiyw add start
+import android.content.dyna.DynaSystemManager;
+import android.content.dyna.IDynaSystemManager;
+//weiyw add end
+
/**
* Manages all of the system services that can be returned by {@link Context#getSystemService}.
* Used by {@link ContextImpl}.
@@ -743,6 +748,16 @@ final class SystemServiceRegistry {
return new MediaProjectionManager(ctx);
}});
+ //weiyw add start
+ registerService(Context.DYNASYSTEM_SERVICE, DynaSystemManager.class,
+ new CachedServiceFetcher<DynaSystemManager>(){
+ @Override
+ public DynaSystemManager createService(ContextImpl ctx) {
+ IBinder b = ServiceManager.getService(Context.DYNASYSTEM_SERVICE);
+ return new DynaSystemManager(ctx, IDynaSystemManager.Stub.asInterface(b));
+ }});
+ //weiyw add end
+
registerService(Context.APPWIDGET_SERVICE, AppWidgetManager.class,
new CachedServiceFetcher<AppWidgetManager>() {
@Override
在此處我們用到了Context.DYNASYSTEM_SERVICE,所以我們需要去定義一下
frameworks/base/core/java/android/content/Context.java
+ /*
+ *weiyw add
+ */
+ public static final String DYNASYSTEM_SERVICE = "dynasystem";
三 需要將我們的服務託管給SystemServer
frameworks/base/services/java/com/android/server/SystemServer.java
import com.mediatek.suppression.service.SuppressionService;
/// @}
+import com.android.server.dyna.DynaSystemService;
+
public final class SystemServer {
private static final String TAG = "SystemServer";
@@ -647,6 +649,9 @@ public final class SystemServer {
ConsumerIrService consumerIr = null;
MmsServiceBroker mmsService = null;
HardwarePropertiesManagerService hardwarePropertiesService = null;
+ //weiyw add start
+ DynaSystemService dynasystem = null;
+ //weiyw add end
/// M: add for hdmi feature
MtkHdmiManagerService hdmiManager = null;
@@ -725,6 +730,16 @@ public final class SystemServer {
mSystemServiceManager.startService(AlarmManagerService.class);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
+ //weiyw add start
+ try {
+ Slog.i(TAG, "DynaSystemService");
+ dynasystem = new DynaSystemService(context);
+ ServiceManager.addService(Context.DYNASYSTEM_SERVICE,dynasystem);
+ } catch (Throwable e) {
+ reportWtf("starting DynaSystemService", e);
+ }
+ //weiyw add end
+
traceBeginAndSlog("InitWatchdog");
final Watchdog watchdog = Watchdog.getInstance();
watchdog.init(context, mActivityManagerService);
四 需要修改Android.mk將我們的代碼添加編譯
frameworks/base/Android.mk
core/java/android/bluetooth/IBluetoothGatt.aidl \
core/java/android/bluetooth/IBluetoothGattCallback.aidl \
core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \
+ core/java/android/content/dyna/IDynaSystemManager.aidl \
core/java/android/content/IClipboard.aidl \
core/java/android/content/IContentService.aidl \
core/java/android/content/IIntentReceiver.aidl \
主要是添加aidl文件,java文件會默認包含的
五 添加相關selinux權限
這部分主要涉及文件
system/sepolicy/service.te
system/sepolicy/service_contexts
system/sepolicy/system_server.te
在service.te 中定義
type dynasystem_service,system_api_service,system_server_service,service_manager_type;
在service_contexts 中關聯
dynasystem u:object_r:dynasystem_service:s0
在system_server.te中賦予權限
allow system_server gas_srv_service:service_manager find;
基本就這些了,目前還沒發現有什麼問題