美文网首页
Android /framework 新增自定义系统服务

Android /framework 新增自定义系统服务

作者: 使劲挤海绵 | 来源:发表于2018-06-29 14:05 被阅读137次

    一:简介

    • 添加自定义的系统服务,需要添加以下文件:
      • aidl
      • manager
      • service文件
    • 需要修改以下文件:
      • /frameworks/base/Android.mk
      • Context
      • SystemServer
      • ContextImpl

    二:实例说明

    1. 在 /framework/base/core/java/android/app/下添加aidl文件:
           /frameworks/base/core/java/android/os/IOTTInfoService.aidl
    
           package android.os;
            
           interface IOTTInfoManager {
               void setValue(String key, String value);
               String getValue(String key);
           }
    
    1. 在/frameworks/base/core/java/android/app/添加manager文件:
           /frameworks/base/core/java/android/app/OTTInfoManager.java
    
           package android.app;
           import android.os.IOTTInfoService;
           import android.content.Context;
           import android.os.RemoteException;
           import android.util.Slog;
            
           public class OTTInfoManager {
               private Context mContext;
               private IOTTInfoService mService;
            
               public OTTInfoManager(Context context, IOTTInfoService service) {
                   mContext = context;
                   mService = service;
               }
            
               public void setValue(String key, String value) {
                   if(mService != null) {
                       mService.setValue(key, value);
                   } 
               }
               
               public String getValue(String key) {
                //        todo 
                if(mService != null) {
                       mService.getValue(key);
                   }
                   
                   return null;
               }
    }
    
    1. 在/frameworks/base/services/core/java/com/android/server/下添加service文件:
    /frameworks/base/services/core/java/com/android/server/OTTInfoService.java
    
           package com.android.server;
            
           import android.os.IOTTInfoManager;
           import android.content.Context;
           import android.os.Build;
           import android.util.Slog;
            
           import java.text.SimpleDateFormat;
           import java.util.Date;
            
           public class OTTInfoService extends IOTTInfoService.Stub {
            private static final String TAG =  OTTInfoService.class.getSimpleName();
               private Context mContext;
            
               public OTTInfoService(Context context) {
                   mContext = context;
            
                   Slog.d(TAG, " OTTInfoService create...");
               }
            
               @Override
               public String getValue(String value) {
           //      todo
               }
               @Override
               public void setValue(String key, String value) {
           //      todo
               }
    }
    
    1. 修改/frameworks/base/Android.mk文件,将aidl加到该文件中,这样才可以被编译到,否则编译不过
     将core/java/android/os/IOTTInfoService.aidl \加到LOCAL_SRC_FILES后面
    
    1. 在/frameworks/base/core/java/android/content/Context.java中添
      加service名称定义:
           //Context.java
           public static final String OTT_INFO_MANAGER = "OTTInfoManager";
    
    1. 在/frameworks/base/services/java/com/android/server/SystemServer.java中添加服务
        public void initAndLoop() {
           xxxxxx.....
           try {
                 ServiceManager.addService(Context.OTT_INFO_MANAGER,   new OTTInfoService(context));
           } catch (Throwable e) {
                Slog.e(TAG, " ServiceManager.addService failed...");
           }
       }
    
    1. 在/frameworks/base/core/java/android/app/ContextImpl.java中注册服务,在静态代码块中添加:
    static {
        registerService(OTT_INFO_MANAGER, new ServiceFetcher() {
            public Object createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(OTT_INFO_MANAGER);
                return new OTTInfoManager(ctx, IOTTInfoService.Stub.asInterface(b));
            }
        }); 
    }
    
    1. 在/frameworks/base目录下执行mm命令生成 :framewokr.jarframework2.jar文件
    2. 在./framewokes/base/service/java目录下执行mm命令生成:service.jar文件

    10.将 8,9步骤的文件 adb push xxx /system/frameworks/设备的目录下

    11.重启设备;

    12.将/frameworks/base/core/java/android/app/OTTInfoManager.java文件编译到 jar供第三方应用使用:

    • 编译生成OTTInfoManager.jar文件
      Android.mk使用方式
      在 /frameworks/base/Android.mk文件中增加:
    # build OTTInfoManager jar
    include $(CLEAR_VARS)
    
    LOCAL_MODULE := OTTInfoManager
    LOCAL_MODULE_CLASS := JAVA_LIBRARIES
    LOCAL_NO_STANDARD_LIBRARIES := true
    LOCAL_JAVA_LIBRARIES := framework core ext
    
    LOCAL_SRC_FILES := core/java/android/app/OTTInfoManager.java
    
    ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE)
    LOCAL_MODULE_TAGS := optional
    include $(BUILD_STATIC_JAVA_LIBRARY)
    
    • 上述相关配置解析
    include $(CLEAR_VARS)                    #引入编译变量
     
    LOCAL_MODULE_TAGS := optional            #标识在什么情况下去编译起模块
     
    LOCAL_SRC_FILES := hello.c               #源文件(可以指定多个) 
     
    LOCAL_MODULE := hello                    #指示当前编译出来的模块名
     
    LOCAL_MODULE_CLASS := EXECUTABLES        #标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中(此处指示放在system/bin下)
    
    include $(BUILD_XXX)    #表示编译出来的模块类型,有下面三种:
    BUILD_EXECUTABLE:编译成可执行的模块
    BUILD_STATIC_LIBRARY:编译成静态库
    BUILD_SHARED_LIBRARY:编译成动态库
    
    
    • 使用方式:
      • 在/libs/目录放置DevInfoManager.jar文件


        test_ott_devinfomanager.png
      • 在代码中使用:

            String ottInfoService = "OTTInfoManager";
            OTTInfoManager mrg = (OTTInfoManager) context.getSystemService(ottInfoService);
            mrg.setValue("name", "zhangsan");
            String name = mrg.getValue("name");
            System.out.println(" ott info name : " + name);
    

    相关文章

      网友评论

          本文标题:Android /framework 新增自定义系统服务

          本文链接:https://www.haomeiwen.com/subject/kflayftx.html