这里要在android N添加一个Usb add-on的状态查询、切换控制的服务。应该L/M版本中也可以使用。android O以及之后的话,框架有变化,应该都放到vendor下。
1. AIDL
1.1 创建 frameworks/base/core/java/android/os/IUsbAddon.aidl

package android.os;/** {@hide} */interface IUsbAddon{    boolean isAddon();    boolean switch2Addon(boolean on);}

1.2. 修改 frameworks/base/Android.mk
    添加    core/java/android/os/IUsbAddon.aidl \    如下:

    core/java/android/os/IUserManager.aidl \    core/java/android/os/IVibratorService.aidl \    ......    core/java/android/os/IUsbAddon.aidl \

执行 mmm frameworks/base,此时会自动根据aidl文件生成对应的stub接口,输出在 out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/IUsbAddon.java

2. 添加远端实现UsbAddonService
frameworks/base/services/core/java/com/android/server/UsbAddonService.java

package com.android.server;import android.util.Log;import android.os.IUsbAddon;/**     * @hide     */public class UsbAddonService extends IUsbAddon.Stub {    /**     * @hide     */    public boolean isAddon() {        int result = isusbexternel();        Slog.e("UsbAddon", "isusbexternel=" + result);        return result==1;    }    /**     * @hide     */    public boolean switch2Addon(boolean on) {        Log.e("UsbAddon", "switch2Addon:" + on);        return usb_switch(on?1:0) == 0;    }    private static int usb_switch( int which );    /*     *    retrun val: 0: usb internel/pc; 1: usb externel/addon/fingerprint; other: error.     */    private static native int isusbexternel();}


3. 创建对应的USB add-on管理程序
frameworks/base/core/java/android/app/UsbAddon.java

package android.app;import android.util.Log;import android.os.IUsbAddon;import android.content.Context;import android.os.RemoteException;public class UsbAddon {    private static String TAG = "UsbAddon";    IUsbAddon mUsbAddon;    public UsbAddon(Context ctx,IUsbAddon UsbAddon) {        mUsbAddon = UsbAddon;    }    public boolean isAddon() throws RemoteException {        return mUsbAddon.isAddon();    }    public boolean switch2Addon(boolean on) throws RemoteException {        return mUsbAddon.switch2Addon(on);    }}

4. 管理和注册 USB add-on service
在系统Service中注册服务,需要分别在SystemServer.java和SystemServiceRegistry.java中修改。

在SystemServer.java中将UsbAddonService添加到系统服务中
frameworks/base/services/java/com/android/server/SystemServer.java

@@ -678,6 +678,11 @@ public final class SystemServer {             Slog.i(TAG, "Reading configuration...");             SystemConfig.getInstance(); +            //sukha, usbaddon+            traceBeginAndSlog("Start UsbAddonService");+            ServiceManager.addService("usbaddonservice", new UsbAddonService());+            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);+             traceBeginAndSlog("StartSchedulingPolicyService");             ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());             Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); 

在SystemServiceRegistry.java中注册UsbAddonService服务
frameworks/base/core/java/android/app/SystemServiceRegistry.java

@@ -156,6 +156,8 @@ import com.mediatek.usp.IUspService; import com.mediatek.usp.UspManager; /// @} +import android.os.IUsbAddon;+ import java.util.HashMap;  /**@@ -177,6 +179,16 @@ final class SystemServiceRegistry {     private SystemServiceRegistry() { }      static {+            //sukha, usbaddon+            registerService("usbaddonservice", UsbAddon.class,+                new CachedServiceFetcher() {+                    @Override+                    public UsbAddon createService(ContextImpl ctx) {+                        IBinder b = ServiceManager.getService("usbaddonservice");+                        IUsbAddon service = IUsbAddon.Stub.asInterface(b);+                        return new UsbAddon(ctx,service);+                }});+                 registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,                 new CachedServiceFetcher() {             @Override 


 

5. native jni
5.1 功能实现
创建 frameworks/base/services/core/jni/com_android_server_UsbAddonService.cpp 文件如下:

#define LOG_TAG "UsbAddonService"#include "jni.h"#include "JNIHelp.h"#include "android_runtime/AndroidRuntime.h"#include      /*标准输入输出定义*/  #include     /*标准函数库定义*/  #include     /*Unix 标准函数定义*/  #include   #include     #include      /*文件控制定义*/  #include    /*PPSIX 终端控制定义*/  #include      /*错误号定义*/  #include  #include #include #include #include #include /*  retrun val: 0: usb internel; 1: usb externel; other: error.*/int usb2addon_drv_isusbexternel(){........    return 0;}int usb2addon_drv_switch( int turnon ){......    return 0;}namespace android{    JNIEXPORT jint JNICALL com_android_server_UsbAddonService_usb_switch (JNIEnv *e, jobject o, jint i)    {        ALOGE ("%s: enter; mode=%d", __FUNCTION__,i );        return usb2addon_drv_switch(i);    }    JNIEXPORT jint JNICALL com_android_server_UsbAddonService_isusbexternel(JNIEnv *e, jobject o)    {        ALOGE ("%s: enter", __FUNCTION__);        return usb2addon_drv_isusbexternel();    }    /*Java本地接口方法表*/    static JNINativeMethod method_table[] = {        { "isusbexternel", "()I", (void*)com_android_server_UsbAddonService_isusbexternel },        { "usb_switch", "(I)I", (void*)com_android_server_UsbAddonService_usb_switch }    };    /*注册Java本地接口方法*/    int register_android_server_UsbAddonService(JNIEnv *env)    {            return jniRegisterNativeMethods(env, "com/android/server/UsbAddonService",            method_table, NELEM(method_table));    }};

5.2. 注册native接口
在frameworks/base/services/core/jni/onload.cpp中添加如下:

@@ -51,6 +51,8 @@ int register_android_server_tv_TvInputHal(JNIEnv* env); int register_android_server_PersistentDataBlockService(JNIEnv* env); int register_android_server_Watchdog(JNIEnv* env); int register_android_server_HardwarePropertiesManagerService(JNIEnv* env);+//sukha, usbaddon+int register_android_server_UsbAddonService(JNIEnv *env); }; /// M: Mediatek defined @{@@ -118,6 +120,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)     register_com_android_internal_app_ShutdownManager(env); #endif -+    //sukha, usbaddon+    register_android_server_UsbAddonService(env);     return JNI_VERSION_1_4; } 

 

5.3 修改Android.mk
在frameworks/base/services/core/jni/Android.mk中加入如下:

@@ -39,6 +39,7 @@ LOCAL_SRC_FILES += \     $(LOCAL_REL_DIR)/com_mediatek_perfservice_PerfServiceManager.cpp \     $(LOCAL_REL_DIR)/com_mediatek_hdmi_MtkHdmiManagerService.cpp \     $(LOCAL_REL_DIR)/com_android_server_display_DisplayPowerController.cpp \+    $(LOCAL_REL_DIR)/com_android_server_UsbAddonService.cpp \     $(LOCAL_REL_DIR)/onload.cpp  ifneq (yes,$(MTK_BSP_PACKAGE)) 

6. sepolicy 修改
6.1 添加服务类型
system/sepolicy/service.te

#sukha, usbaddontype usbaddonservice, system_api_service, system_server_service, service_manager_type;


6.2 服务权限
system/sepolicy/service_contexts

#sukha, usbaddonusbaddonservice               u:object_r:usbaddonservice:s0


6.3 添加system_server操作设备文件的权限
device/mediatek/common/sepolicy/basic/system_server.te

#sukha, usbaddonallow system_server g909_usb_sys_file:file rw_file_perms;


6.4 让应用可以访问改服务,这里只在untrusted_app添加,如果需要的话,system app之类的都要加上。
device/mediatek/common/sepolicy/basic/untrusted_app.te

allow untrusted_app usbaddonservice:service_manager find;

7. 编译
mmm frameworks/base/services 重编服务
make update-api 更新api8. 在app中调用

UsbAddon usbAddon = (UsbAddon) getSystemService("usbaddonservice");try {    useAddonUsb = useAddonUsb();    if (!useAddonUsb) {        switch2AddonUsb(true);    }} catch (RemoteException e) {    e.printStackTrace();}//Add-on USB switchpublic boolean useAddonUsb() throws RemoteException {    useAddonUsb = usbAddon.isAddon();    Log.d(TAG, "Is using addon USB: " + useAddonUsb);    return useAddonUsb;}void switch2AddonUsb(boolean on) throws RemoteException {    usbAddon.switch2Addon(on);}

这里需要导入的jar文件可以在以上编译中生成获得。
 

更多相关文章

  1. 自定义图片点击效果
  2. android checkbox,radiobox style自定义
  3. Android:CourseTableLayout — 好用的Android自动生成课程表的自
  4. 自定义 RadioButton 选中和未选中时的图片
  5. animation的xml定义中的android:interpolator属性
  6. Android简单自定义圆形和水平ProgressBar
  7. android 自定义 permission 权限
  8. android init.rc增加一个自定义的service

随机推荐

  1. 为什么说Android令人沮丧
  2. Android 知识图谱:该如何入门Android开发?
  3. Android Studio目录结构
  4. android切换效果、Flutter信息类App、仿
  5. Google:Android正在走出碎片化泥沼
  6. Android(安卓)自定义View (三部曲)
  7. 我的Android相关文章目录
  8. Java事件模型与Android事件模型的比较
  9. Service与Android系统设计(3)
  10. Android(安卓)P解决Socket通信Tcp粘包问