参考博客: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),只有系统平台应用才能访问这些隐藏接口和功能.