android 5.1.1增加自定义服务

闲来无事,试了一下在android 5.1.1 源码中添加自己的服务,以下是增加过程:

1、定义接口
    源码 frameworks/base/core/java/android/os/下面新增 一个 IMyCountTest.aidl
    package android.os;
    interface IMyCountTest{
         int add(int a,int b);
    }
2、注册aidl到编译脚本Android.mk文件中
在目录路径为 frameworks\base\Android.mk 添加如下代码:
在Android.mk如下LOCAL_SRC_FILES += \下添加:

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


3、创建Service文件实现接口
在 frameworks/base/services/core/java/com/android/server/ 下面新增一个 MyCountTestService.java 用来实现aidl文件定义的接口。


    package com.android.server;
    import android.os.IMyCountTest;
    import android.os.RemoteException;
    import android.util.Log;
    public class MyCountTestService extends IMyCountTest.Stub{

        public MyCountTestService(){

        }    
        public  int add(int a,int b){
            try{
                Log.e("MyCountTestService","add fun");    
                return a+b;
            }catch(Exception e){   //异常处理 这里没有完全搞明白,但可以正常跑起来
                e.printStackTrace();    
            }
            return -1;
        }

    }


4、将service添加到SystemServer,使开机时候被加载


先在 frameworks/base/core/java/android/content/Context.java 中添加一行 
    public static final String  MYCOUNT_SERVICE="myCountTest_service";   


在目录路径为 android\frameworks\base\service\java\com\android\server\SystemServer.java  中的 startOtherServices()函数下增加

   private void startOtherServices() {
            try{
                   Slog.i(TAG, "MyCountTestService Service");

                 ServiceManager.addService(Context.MyCountTest_Service, new MyCountTestService());

            }catch(Throwable e){
                   Slog.e(TAG, "Failure string MyCountTestService:"+e);
            }
   }

5、定义Manager
在frameworks/base/core/java/android/app/ MyCountTestManager.java 文件 内容如下

package android.app;
import android.content.Context;
import android.os.IMyCountTest;
import android.os.RemoteException;
import android.util.Log;

public class MyCountTestManeger{
    IMyCountTest   myService;

    public MyCountTestManeger(Context ctx,IMyCountTest service){
    
           myService=service;
    }

    public  int add(int a,int b){
        try{
                  Log.e("MyCountTestManeger","add");
                return myService.add(a,b);
         } catch(Exception e){
                 Log.e("MyCountTestManeger",e.toString);    
               e.printStackTrace();
        }

        return -1;
    }
}


6、注册

(不同版本的注册目录可能不太一样)
在目录路径为 android\frameworks\base\core\java\android\app\SystemServiceRegistry.java添加代码如下:
在   static  模块中增加以下代码
  import  android.os.IMyCountTest;


  registerService(MYCOUNT_SERVICE, new ServiceFetcher() {
            public Object createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(MYCOUNT_SERVICE);
                 IMyCountTest service=IMyCountTest.Stub.asInterface(b);

                return new MyCountTestManeger(ctx, service);
            }});


7、编译检查,在/framewokks/base下执行mm指令,检查是否有报错,自行排除一下笔误

          /framewokks/base# mm


8、更新Api
由于在工程中添加了自己定义的类及常量,系统的api没有更新,因此需要

 root# make update-api


9、制作sdk      这里需要等待一段时间

     (由于个人原因,我先执行了 make clean 又执行了 make -j8,最后执行了make sdk,

        如果直接执行 make sdk  或者 先 make -j8  再执行 make sdk,没有尝试,不知道结果怎么样)
     root# make sdk

9、生成目标
   1、系统文件

     out\target\product\t200\system\framework中  
       framework.jar
       services.jar

    该修改的内容会保存在这两个包中,
   将这两个文件直接刷入设备/system/framework/   目录下就可直接使用 或者重新  更新系统也行


   2、SDK文件

     out\host\linux-x86\sdk目录下生成sdk
     android-sdk_eng.root_linux-x86.zip

     解压后复制 \platforms\android-5.1.1中的android.jar 到windows下相同版本目录下,记得备份原有的android.jar
       D:\androidsdk\platforms\android-22
10、在androidstudio中配置使用该版本的sdk即可

   工程目录下  External Libraries——>Android API 22 Platform ——>android.jar——>android

——>os下存在 IMyCountTest.

——>app下存在 MyCountTestManager

11、使用:跟使用其他系统服务一样
MyCountTestManager myCountTestManager=(MyCountTestManager)getSystemService(Context.MYCOUNT_SERVICE);
int count=  myCountTestManager.add(4,6);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值