修改涉及的文件:
framework/base/Android.bp
framework/base/api/current.txt
framework/base/core/java/android/app/CCCManager.java
framework/base/core/java/android/app/SystemServiceRegistry.java
framework/base/core/java/android/content/Context.java
framework/base/core/java/android/os/ICCCService.aidl
framework/base/services/core/java/com/android/server/CCCService.java
framework/base/services/java/com/android/server/SystemServer.java
step1 添加编译依赖
framework/base/Android.bp
Index: base/Android.bp
===================================================================
--- base/Android.bp (revision 6290)
+++ base/Android.bp (working copy)
@@ -242,6 +242,7 @@
"core/java/android/os/IThermalService.aidl",
"core/java/android/os/IUpdateLock.aidl",
"core/java/android/os/IUserManager.aidl",
+ "core/java/android/os/ICCCService.aidl",
"core/java/android/os/IVibratorService.aidl",
"core/java/android/os/storage/IStorageManager.aidl",
"core/java/android/os/storage/IStorageEventListener.aidl",
step2 创建Manager,即CCCManager
在frameworks/base/core/java/android/app/ 下创建CCCManager.java 文件 内容如下
framework/base/core/java/android/app/CCCManager.java
package android.app;
/**
* Created by liam on 16/10/2.
*/
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ICCCService;
import android.util.Log;
public class CCCManager {
ICCCService mService;
public CCCManager(Context ctx,ICCCService service){
mService=service;
}
public void setVal(String key,String value){
try{
mService.setVal(key,value);
}catch(Exception e){
Log.e("CCCManager",e.toString());
e.printStackTrace();
}
}
public String getVal(String key){
try{
return mService.getVal(key);
}catch(Exception e){
Log.e("CCCManager",e.toString());
e.printStackTrace();
}
return null;
}
public void appendLog(String log){
try{
mService.appendLog(log);
}catch(Exception e){
Log.e("CCCManager",e.toString());
e.printStackTrace();
}
}
public void clearLog(){
try{
mService.clearLog();
}catch(Exception e){
Log.e("CCCManager",e.toString());
e.printStackTrace();
}
}
public String readLog(){
try{
return mService.readLog();
}catch(Exception e){
Log.e("CCCManager",e.toString());
e.printStackTrace();
}
return null;
}
}
step3 注册到SystemService
修改frameworks/base/core/java/android/app/SystemServiceRegistry.java
在静态代码块中增加
framework/base/core/java/android/app/SystemServiceRegistry.java
--- base/core/java/android/app/SystemServiceRegistry.java (revision 6371)
+++ base/core/java/android/app/SystemServiceRegistry.java (working copy)
@@ -128,6 +128,7 @@
import android.os.Vibrator;
import android.os.health.SystemHealthManager;
import android.os.storage.StorageManager;
+import android.os.ICCCService;
import android.print.IPrintManager;
import android.print.PrintManager;
import android.service.oemlock.IOemLockService;
@@ -190,6 +191,15 @@
return AccessibilityManager.getInstance(ctx);
}});
+ registerService(Context.CCC_SERVICE, CCCManager.class,
+ new CachedServiceFetcher<CCCManager>() {
+ @Override
+ public CCCManager createService(ContextImpl ctx) {
+ IBinder b = ServiceManager.getService(Context.CCC_SERVICE);
+ ICCCService service = ICCCService.Stub.asInterface(b);
+ return new CCCManager(ctx, service);
+ }});
+
registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class,
new CachedServiceFetcher<CaptioningManager>() {
@Override
step4 创建aidl文件
framework/base/core/java/android/os/ICCCService.aidl
// ICCCService.aidl
package android.os;
// Declare any non-default types here with import statements
interface ICCCService {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void setVal(String key,String value);
String getVal(String key);
void appendLog(String log);
void clearLog();
String readLog();
}
step5 创建Service文件 (CCCService)
在 frameworks/base/services/core/java/com/android/server/ 下新增一个 CCCService.java 用来实现aidl文件定义的接口。
framework/base/services/core/java/com/android/server/CCCService.java
package com.android.server;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.lang.*;
import java.util.HashMap;
import android.os.RemoteException;
import android.os.ICCCService;
/**
*
* Created by zhuangqianliu on 2016/9/21.
*/
public class CCCService extends ICCCService.Stub {
private static HashMap<String,String> map=new HashMap<>();
private static String inner_log="";
public CCCService() {
}
@Override
public void setVal(String key, String value) throws RemoteException {
map.put(key,value);
}
@Override
public String getVal(String key) throws RemoteException {
return map.get(key);
}
@Override
public void appendLog(String log) throws RemoteException {
inner_log+=log+"\n";
}
@Override
public void clearLog() throws RemoteException {
inner_log="";
}
@Override
public String readLog() throws RemoteException {
return inner_log;
}
}
step6 将自定义Service 加入到SystemServer 启动进程
先在 frameworks/base/core/java/android/content/Context.java 中添加一行
public static final String CCC_SERVICE="ccc";
framework/base/core/java/android/content/Context.java
--- base/core/java/android/content/Context.java (revision 6371)
+++ base/core/java/android/content/Context.java (working copy)
@@ -369,7 +369,7 @@
* modes (removing network access etc).
*/
public static final int BIND_FOREGROUND_SERVICE = 0x04000000;
-
+ public static final String CCC_SERVICE="ccc";
/**
* @hide Flag for {@link #bindService}: Treat the binding as hosting
* an activity, an unbinding as the activity going in the background.
修改 frameworks/base/services/java/com/android/server/SystemServer.java在startOtherServices() 函数 的try模块中增加以下代码
framework/base/services/java/com/android/server/SystemServer.java
--- base/services/java/com/android/server/SystemServer.java (revision 6371)
+++ base/services/java/com/android/server/SystemServer.java (working copy)
@@ -760,6 +760,18 @@
}
try {
+
+ Slog.i(TAG, "CCC Service");
+
+ ServiceManager.addService(Context.CCC_SERVICE, new CCCService());
+
+ } catch (Throwable e) {
+
+ Slog.e(TAG, "Failure starting CCC Service", e);
+
+ }
+
+ try {
final String SECONDARY_ZYGOTE_PRELOAD = "SecondaryZygotePreload";
// We start the preload ~1s before the webview factory preparation, to
// ensure that it completes before the 32 bit relro process is forked
step7 修改SePolicy的编译验证
修改 /external/sepolicy/service.te
在最后一行添加
type ccc_service, system_api_service, system_server_service, service_manager_type;
然后修改同目录下 /external/sepolicy/service_contexts 文件
中间插入一行
ccc u:object_r:ccc_service:s0
step8 重新编译源码
别忘了先 make update-api。
framework/base/api/current.txt
Index: base/api/current.txt
===================================================================
--- base/api/current.txt (revision 6371)
+++ base/api/current.txt (working copy)
@@ -4388,6 +4388,15 @@
field public static final android.os.Parcelable.Creator<android.app.AutomaticZenRule> CREATOR;
}
+ public class CCCManager {
+ ctor public CCCManager(android.content.Context, android.os.ICCCService);
+ method public void appendLog(java.lang.String);
+ method public void clearLog();
+ method public java.lang.String getVal(java.lang.String);
+ method public java.lang.String readLog();
+ method public void setVal(java.lang.String, java.lang.String);
+ }
+
public class DatePickerDialog extends android.app.AlertDialog implements android.widget.DatePicker.OnDateChangedListener android.content.DialogInterface.OnClickListener {
ctor public DatePickerDialog(android.content.Context);
ctor public DatePickerDialog(android.content.Context, int);
@@ -9483,6 +9492,7 @@
field public static final java.lang.String CAMERA_SERVICE = "camera";
field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
+ field public static final java.lang.String CCC_SERVICE = "ccc";
field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companiondevice";
field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
@@ -32607,6 +32617,21 @@
method public abstract void binderDied();
}
+ public abstract interface ICCCService implements android.os.IInterface {
+ method public abstract void appendLog(java.lang.String) throws android.os.RemoteException;
+ method public abstract void clearLog() throws android.os.RemoteException;
+ method public abstract java.lang.String getVal(java.lang.String) throws android.os.RemoteException;
+ method public abstract java.lang.String readLog() throws android.os.RemoteException;
+ method public abstract void setVal(java.lang.String, java.lang.String) throws android.os.RemoteException;
+ }
+
+ public static abstract class ICCCService.Stub extends android.os.Binder implements android.os.ICCCService {
+ ctor public ICCCService.Stub();
+ method public android.os.IBinder asBinder();
+ method public static android.os.ICCCService asInterface(android.os.IBinder);
+ method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
+ }
+
public abstract interface IInterface {
method public abstract android.os.IBinder asBinder();
}