美文网首页安卓
Android源码开发记录-自定义系统服务和jar包生成

Android源码开发记录-自定义系统服务和jar包生成

作者: LH_1994 | 来源:发表于2019-11-26 11:26 被阅读0次

    在系统开发中,尤其是自定义系统,必然要封装一些系统方法供第三方开发应用使用。
    1.自定义系统服务
    除frameworks自定义服务(本文内容),也可以额外写个service+aidl应用
    2.jar包生成供第三方应用使用

    开发环境
    RK平台5.1Android系统

    一、添加系统服务

    1、创建服务接口aidl文件

    创建文件 IMyApiService
    文件路径 frameworks/base/core/java/android/os/

    package android.os;
    
    interface IMyApiService{
       Integer getSum(Integer data1,Integer data2);
    }
    

    定义了一个计算和的方法。

    2、aidl文件加入Android.mk编译

    在frameworks/base/Android.mk
    LOCAL_SRC_FILES最后加入

    core/java/android/os/IMyApiService.aidl \
    

    3、创建service文件

    创建文件 MyApiService.java
    文件路径 frameworks/base/core/java/com/android/server/

    package com.android.server;
    
    import android.os.RemoteException;
    import android.os.IMyApiService;
    import android.util.Log;
    import android.content.Context;
    
    public class MyApiService extends IMyApiService.Stub{
      private String TAG = "MyApiService";
      private Context mContext;
    
      public MyApiService(Context context){
           mContext = context;
      }
      
      @Override
      public Integer getSum(Integer data1,Integer data2)throws RemoteException{
           return data1+data2;
      }
    }
    

    实现aidl的接口,计算参数和。

    4、自定义service加入SystemServer启动项

    (1)Context添加服务名
    文件路径 frameworks/base/core/java/android/content/Context.java
    添加

    public static final String MY_API_SERVICE = "my_api_service";
    

    (2)添加启动服务
    文件路径 frameworks/base/services/java/com/android/server/SystemServer.java
    在startOtherServices方法中添加

    Slog.i(TAG, "Init MyApiService");
     try{
          ServiceManager.addService(Context.MY_API_SERVICE ,new MyApiService(context));
    }catch(Throwable e){
           Slog.e(TAG, "Failure starting MyApiService", e);
    }
    
    

    5、创建Manager文件

    创建 MyApiManager.java文件
    文件路径 frameworks/base/core/java/android/app/

    package com.android.app;
    
    import android.util.Log;
    import android.os.IMyApiService;
    import android.content.Context;
    
    public class MyApiManager{
      private String TAG = "MyApiManager";
      private Context mContext;
      private IMyApiService mService;
      
      public MyApiManager(Context context,IMyApiService service){
         mContext = context;
         mService = service;
      }
      
        public Integer getSum(Integer data1,Integer data2){
          try{
            return mService.getSum(data1,data2);
          }catch(Exception e){
            Log.e(TAG,"error getSum "+e.toString());
            e.printStackTrace();
          }
          return null;
      }
    }
    

    6、注册到SystemService

    文件路径 frameworks/base/core/java/android/app/ContextImpl
    添加registerService

     registerService(MY_API_SERVICE, new ServiceFetcher() {
            public Object createService(ContextImpl ctx) {
            IBinder b = ServiceManager.getService(MY_API_SERVICE);
            return new MyApiManager(ctx,IMyApiService.Stub.asInterface(b));
            }
    });
    

    7、重新编译源代码

    记住make update-api
    编译打包完成后,烧写新的固件。

    二、生成jar包

    jar主要为了在android studio编译环境中MyApiManager报错导致编译不通过问题。
    也可以导入frameworks jar包或使用反射。

    1、新建JAR包文件夹

    在源码目录packages/app下新建MyJar文件夹
    并新建目录com/myapi/(包名)

    2、新建MyApi.java

    在目录com/myapi/新建文件MyApi.java

    package com.myapi;
     
    import android.app.MyApiManager;
    import android.content.Context;
    
    public class MyApi{
      private MyApiManager myApiManager;
    
      public MyApi(Context context){
          myApiManager= (MyApiManager) context.getSystemService(Context.MY_API_SERVICE);
      }
    
      public int getSum(int data1,int data2){
         return myApiManager.getSum(data1,data2);
      }
    
     }
    
    

    3、新建Android.mk

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES :=com/myapi/MyApi.java
    LOCAL_MODULE :=Myapi
     
    include $(BUILD_STATIC_JAVA_LIBRARY)
    
    

    具体Android.mk语法这里不做解释,可以自行查阅

    3、编译生成jar文件

    在MyApi目录下直接运行mm编译命令(记得先source build/envsetup.sh)
    待编译完成后,jar生成目录
    out/target/common/obj/JAVA_LIBRARIES/Myapi_intermediates/javalib.jar
    可更改为其他名称。

    3、在应用中使用jar包方法即可

     MyApi myApi = new MyApi (this);
     Log.d(TAG,"getSum="+myApi .getSum(2,5));
    

    相关文章

      网友评论

        本文标题:Android源码开发记录-自定义系统服务和jar包生成

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