安(an)卓原生框架(jia)層代碼位于frameworks目錄下,在(zai)這里基于vendor目錄下的ctyun-framework添(tian)加一個自定義(yi)的系統服務,并在(zai)system server中進行啟動。以ApplicationAccessManagerService為例。
1.添加自定義服務。
一個系統服務(wu)需(xu)要(yao)包含(han)manager類和(he)service實現,通過aidl進行通信。首先新(xin)建以下三個文件(jian)定義接口功(gong)能。
1.1 IApplicationAccessManager.aidl
在/vendor/ctyun/source/frameworks/core/java/android/app/下添加aidl文件,定義API。
interface IApplicationAccessManager {
    // add your method here
}1.2 ApplicationAccessManager.java
在/vendor/ctyun/source/frameworks/core/java/android/app/下添加manager文件(jian),實現(xian)第三(san)方調用接口。
public class ApplicationAccessManager {
    Context mContext;
    IApplicationAccessManager mApplicationAccessManagerService;
    public ApplicationAccessManager(Context context, IApplicationAccessManager aam) {
        mContext = context;
        mApplicationAccessManagerService = aam;
    }
	//......
}1.3 ApplicationAccessManagerService.java
在/vendor/ctyun/source/frameworks/services/core/java/com/android/server/下添加(jia)service文(wen)件,實現(xian)服(fu)務端邏輯(ji)。
public class ApplicationAccessManagerService extends IApplicationAccessManager.Stub {
    private static final String TAG = "ApplicationAccessManagerService";
    public ApplicationAccessManagerService(Context context){
        //.....
    }
    //@Override
	//......
}2. 修改Android.bp,聲明新增的aidl
在/vendor/ctyun/source/frameworks/Android.bp中聲明新增(zeng)aidl編(bian)譯,這(zhe)樣編(bian)譯時才會(hui)生(sheng)成IApplicationAccessManager類。
java_library {
    name: "ctyun-framework",
    srcs: [
		......       
       "core/java/android/app/IApplicationAccessManager.aidl",   
        ......
	],
	......
}3. 聲明service name
在/vendor/ctyun/source/frameworks/core/java/android/content/ContextExternal.java中聲(sheng)明系統服務的service name。
public static final String APP_ACCESS_SERVICE = "app_access";4. 注冊service
在(zai)/vendor/ctyun/source/frameworks/services/core/java/com/android/server/SystemServerExternal的(de)startExternalServices()方(fang)法中注冊服務,開機自啟(qi)動(dong)。
private void startApplicationAccessManagerService() {
    try {
        ServiceManager.addService(ContextExternal.APP_ACCESS_SERVICE, new ApplicationAccessManagerService(mSystemContext));
    } catch (Exception e) {
        e.printStackTrace();
    }
}5. 注冊manager
在/vendor/ctyun/source/frameworks/core/java/android/app/ExternalSystemServiceManager中注冊自定義的manager,綁定service name和manager實例。
registerExternalService(ContextExternal.APP_ACCESS_SERVICE, ApplicationAccessManager.class,
    new ExternalCachedServiceFetcher<ApplicationAccessManager>() {
        @Override
        public ApplicationAccessManager createService(Context ctx) throws ServiceManager.ServiceNotFoundException {
            IBinder b = ServiceManager.getServiceOrThrow(ContextExternal.APP_ACCESS_SERVICE);
            IApplicationAccessManager service = IApplicationAccessManager.Stub.asInterface(b);
            return new ApplicationAccessManager(ctx, service);
        }});