Android9.0系统中添加自定义系统服务给应用调用

参考博客:https://blog.csdn.net/sgzy001/article/details/54344739

              https://blog.csdn.net/dpppppp/article/details/98939733(如何将自己api给第三方使用)

diff --git a/frameworks/base/Android.bp b/frameworks/base/Android.bp
index 7b3a4b1..1d210eb 100755
--- a/frameworks/base/Android.bp
+++ b/frameworks/base/Android.bp
@@ -105,6 +105,7 @@ java_library {
         "core/java/android/app/usage/ICacheQuotaService.aidl",
         "core/java/android/app/usage/IStorageStatsManager.aidl",
         "core/java/android/app/usage/IUsageStatsManager.aidl",
+        "core/java/android/app/ISystemStatusManager.aidl",
         ":libbluetooth-binder-aidl",
         "core/java/android/content/IClipboard.aidl",
         "core/java/android/content/IContentService.aidl",
diff --git a/frameworks/base/core/java/android/app/ISystemStatusManager.aidl b/frameworks/base/core/java/android/app/ISystemStatusManager.aidl
new file mode 100644
index 0000000..6549470
--- /dev/null
+++ b/frameworks/base/core/java/android/app/ISystemStatusManager.aidl
@@ -0,0 +1,6 @@
+package android.app;

+interface ISystemStatusManager
+{
+    String[] getSystemStatus();
+}
diff --git a/frameworks/base/core/java/android/app/SystemServiceRegistry.java b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
index 4a4901d..6ffc857 100755
--- a/frameworks/base/core/java/android/app/SystemServiceRegistry.java
+++ b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
@@ -168,6 +168,7 @@ import java.lang.reflect.Method;
 /// M: Add HpNetUrlManager
 import android.hwapunet.INetUrlManager;
 import android.hwapunet.HpNetUrlManager;
+import android.app.SystemStatusManager;
 
 import java.util.HashMap;
 
@@ -997,6 +998,15 @@ public final class SystemServiceRegistry {
             }});
         /// @}
 
+        registerService(Context.SYSTEM_STATUS_SERVICE, SystemStatusManager.class,
+                new CachedServiceFetcher() {
+            @Override
+            public SystemStatusManager createService(ContextImpl ctx) {
+                IBinder b = ServiceManager.getService(Context.SYSTEM_STATUS_SERVICE);
+                ISystemStatusManager service = ISystemStatusManager.Stub.asInterface(b);
+                return new SystemStatusManager(ctx, service);
+            }});
+
         registerService(Context.TIME_ZONE_RULES_MANAGER_SERVICE, RulesManager.class,
                 new CachedServiceFetcher() {
             @Override
diff --git a/frameworks/base/core/java/android/app/SystemStatusManager.java b/frameworks/base/core/java/android/app/SystemStatusManager.java
new file mode 100644
index 0000000..2b97b80
--- /dev/null
+++ b/frameworks/base/core/java/android/app/SystemStatusManager.java
@@ -0,0 +1,28 @@
+package android.app;

+import android.content.Context;
+import android.os.RemoteException;
+import android.util.Slog;

+public class SystemStatusManager {
+    Context mContext;
+    ISystemStatusManager mService;

+    public SystemStatusManager(Context context, ISystemStatusManager service) {
+        mContext = context;
+        mService = service;
+    }

+    public String[] getSystemStatus() {
+        if (mService != null) {
+            try {
+                return mService.getSystemStatus();
+            } catch (RemoteException e) {
+                Slog.e("SystemStatus", "RemoteException " + e);
+                return null;
+            }
+        }

+        return null;
+    }
+}
diff --git a/frameworks/base/core/java/android/content/Context.java b/frameworks/base/core/java/android/content/Context.java
index add0b14..34e0ea5 100755
--- a/frameworks/base/core/java/android/content/Context.java
+++ b/frameworks/base/core/java/android/content/Context.java
@@ -4200,6 +4200,8 @@ public abstract class Context {
      */
     public static final String CROSS_PROFILE_APPS_SERVICE = "crossprofileapps";
 
+    public static final String SYSTEM_STATUS_SERVICE = "system_status_service";
+
     /**
      * Use with {@link #getSystemService} to retrieve a
      * {@link android.se.omapi.ISecureElementService}
diff --git a/frameworks/base/services/core/java/com/android/server/SystemStatusManagerService.java b/frameworks/base/services/core/java/com/android/server/SystemStatusManagerService.java
new file mode 100644
index 0000000..f5f1486
--- /dev/null
+++ b/frameworks/base/services/core/java/com/android/server/SystemStatusManagerService.java
@@ -0,0 +1,40 @@
+package com.android.server;

+import android.app.ISystemStatusManager;
+import android.content.Context;
+import android.os.Build;
+import android.util.Slog;

+import java.text.SimpleDateFormat;
+import java.util.Date;

+public class SystemStatusManagerService extends ISystemStatusManager.Stub {
+    private Context mContext;

+    public SystemStatusManagerService(Context context) {
+        mContext = context;

+        Slog.d("SystemStatus", "Date:" + getDateTime() + "\nVersion:" + getVersion());
+    }

+    @Override
+    public String[] getSystemStatus() {
+        String[] infos = new String[2];

+        infos[0] = "Date:" + getDateTime();
+        infos[1] = "Version:" + getVersion();

+        return infos;
+    }

+    private String getDateTime() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-DD-mm HH:mm:s");
+        Date date = new Date(System.currentTimeMillis());

+        return format.format(date);
+    }

+    private String getVersion() {
+        return Build.DISPLAY;
+    }
+}
diff --git a/frameworks/base/services/java/com/android/server/SystemServer.java b/frameworks/base/services/java/com/android/server/SystemServer.java
index dfa102b..626515f 100755
--- a/frameworks/base/services/java/com/android/server/SystemServer.java
+++ b/frameworks/base/services/java/com/android/server/SystemServer.java
@@ -120,6 +120,7 @@ import com.android.server.usage.UsageStatsService;
 import com.android.server.vr.VrManagerService;
 import com.android.server.webkit.WebViewUpdateService;
 import com.android.server.wm.WindowManagerService;
+import com.android.server.SystemStatusManagerService;
 
 import com.mediatek.server.MtkSystemServer;
 import com.android.server.hwapu.HpNetUrlManagerService;
@@ -1276,6 +1277,13 @@ public final class SystemServer {
                 }
             }
 
+           try {                                                                          
+               Slog.i(TAG, "ClassMonitor Service is create");                             
+               ServiceManager.addService(Context.SYSTEM_STATUS_SERVICE, new SystemStatusManagerService(context));
+            } catch (Throwable e) {                                                       
+               reportWtf("starting ClassMonitorService", e);                              
+            }     
+
             traceBeginAndSlog("StartNotificationManager");
             mSystemServiceManager.startService(NotificationManagerService.class);
             SystemNotificationChannels.createAll(context);
diff --git a/vendor/mediatek/proprietary/packages/apps/Calendar/src/com/android/calendar/AllInOneActivity.java b/vendor/mediatek/proprietary/packages/apps/Calendar/src/com/android/calendar/AllInOneActivity.java
index 4334bbd..255fd01 100755
--- a/vendor/mediatek/proprietary/packages/apps/Calendar/src/com/android/calendar/AllInOneActivity.java
+++ b/vendor/mediatek/proprietary/packages/apps/Calendar/src/com/android/calendar/AllInOneActivity.java
@@ -34,12 +34,14 @@ import android.app.ActionBar;
 import android.app.ActionBar.Tab;
 import android.app.Fragment;
 import android.app.FragmentManager;
+import android.app.SystemStatusManager;
 import android.app.FragmentTransaction;
 import android.content.AsyncQueryHandler;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.Intent;
+import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.content.res.Configuration;
@@ -624,6 +626,13 @@ public class AllInOneActivity extends AbstractCalendarActivity implements EventH
 
         Log.d(TAG, "onCreate before permission check ");
         PDebug.Start("AllInOneActivity.onCreate");
+        SystemStatusManager mManager = (SystemStatusManager) getSystemService(Context.SYSTEM_STATUS_SERVICE);
+        try {
+            String[] infos = mManager.getSystemStatus();
+            Log.i("SystemStatus", "SystemStatus Date:" + infos[0] + "\nVersion:" + infos[1]);
+        } catch (Exception e) {
+             e.printStackTrace();
+        }
 
         PDebug.Start("AllInOneActivity.onCreate.superOnCreate");
         if (Utils.getSharedPreference(this, OtherPreferences.KEY_OTHER_1, false)) {

 

1. 修改Android源码,将需要用到的API的"@hide"注解去掉
然后单独编译frameworks (即mmm frameworks/base);
编译生成的中间文件在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/

2.将编译好的framework放到AndroidStudio项目中
将源码目录out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar文件,复制到AndroidStudio项目的app/sdk下面并重命名为android23.jar(即android$(api-level).jar).
修改AndroidStudio项目中的build.gradle(Project),在allprojects节点中添加以下内容,配置在编译时使用android23.jar

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:app/sdk/android23.jar')
        }
    }
1
2
3
4
5
修改AndroidStudio项目中的build.gradle(Module),在dependencies节点中添加以下内容,配置让android23.jar只在编译时使用,不会打包到apk中.

    compileOnly files('sdk/android23.jar')
1
如果不想自己修改源代码,但要用隐藏API,github上有已经编译好的: https://github.com/anggrayudi/android-hidden-api

使用自己编译的framework存在的问题
为什么不将android23.jar放到app/libs下面呢?如果放到app/libs下面,会与下面的dependencies冲突,最终编译出来的apk会很大(compileOnly失效)
    implementation fileTree(dir: 'libs', include: ['*.jar'])
1
Cannot resolve symbol 'SERIAL_SERVICE’问题
这只是解析错误提示,并不影响编译;是因为Android Studio将SDK作为第一个语法解析的jar包.
可以手动修改app/app.iml,将以下行移到文档最后(但是如果修改了build.gradle,同步后会自动改回去,需要再手动修改):
   
1
自己写APP注意用平台签名或者放到系统/system/priv-app/下面(使APP成为platform-app),只有系统平台应用才能访问这些隐藏接口和功能.

你可能感兴趣的:(Android系统)