android 8.1 新增自定义系统服务-程序员宅基地

技术标签: android framework初学习  android  

新增一个自定义的系统服务,并尝试在SystemUI中调用自定义service

一、新建相关文件以及定义服务的注册与启动

        1.新建aidl文件

         到android8.1/frameworks/base/core/java/android 目录下,可以看到app文件夹,目录下是aidl服务接口文件和对应的服务管理类。 可以将自定义的aidl文件放在这个目录里。

         本文在android8.1/frameworks/base/core/java/android目录下新建了chenzqTest文件夹,方便管理自定义内容。

        android8.1/frameworks/base/core/java/android/chenzqTest 目录下 新增ITestService.aidl文件。

package android.chenzqTest;

interface ITestService {
    void log();  //因为只是个测试,所以就写一个无参的log方法
}

     

         2. 同目录下新建管理类 TestManager.java

package android.chenzqTest;

import android.os.RemoteException;
import android.content.Context;
import android.os.ServiceManager;
import android.util.Log;

public class TestManager {
    private ITestService mService;

    public TestManager(Context ctx ){
    mService =ITestService.Stub.asInterface(ServiceManager.getService("test-service"));//获取ITestService实例
    }

    public void log ()throws RemoteException{
        mService.log();
    }
}

记得抛异常

注意这个包名“android.chenzqTest

        3.新建aidl实现类

        一般把实现类放在android8.1/frameworks/base/core/java/com/android/server 目录下

        在android8.1/frameworks/base/core/java/com/目录下 新建chenzqTest/server目录

         android8.1/frameworks/base/core/java/com/chenzqTest/server目录下,新建TestServiceImpl.java继承ITestService.Stub

package com.chenzqTest.server;
import android.os.RemoteException;
import android.util.Log;
import android.chenzqTest.ITestService;

public class TestServiceImpl extends ITestService.Stub {

    public void log() {
        for (int i=0;i<10;i++) {
            Log.d("chenzq","服务循环"+i );//这个服务就是打log
        }
    }

}

注意包名“com.chenzqTest.server

        4.在Context中定义服务标识

        android8.1/frameworks/base/core/java/android/content/Context.java中新增

public static final String CHENZQ_TEST_SERVICE = "test-service";

        5.在SystemServer中启动服务

        android8.1/framework/base/services/java/com/android/server/SystemServer.java的startOtherServices方法中新增try-catch

import com.chenzqTest.server.TestServiceImpl;
        try {
            TestServiceImpl testService = new TestServiceImpl();
            Slog.e(TAG, "Create  successfully .");
            // Add this service to service manager
            ServiceManager.addService(Context.CHENZQ_TEST_SERVICE,testService);
        } catch (Throwable e) {
            Slog.e(TAG, "Starting  exception ", e);
        }

        6.在SystemServiceRegisty中注册服务管理类

import android.chenzqTest.TestManager;
    static {
        .......
        .......
        registerService(Context.CHENZQ_TEST_SERVICE, TestManager.class,
                new CachedServiceFetcher<TestManager>() {
                    @Override
                    public TestManager createService(ContextImpl ctx) {
                        Log.d("chenzq","注册服务" );
                        return new TestManager(ctx);
            }});


二、修改Android.mk文件

修改android8.1/frameworks/base/目录下Android.mk

LOCAL_SRC_FILES += \
	core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \
	core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \
	core/java/android/accounts/IAccountManager.aidl \        
    core/java/android/chenzqTest/ITestService.aidl\ //自己写的aidl文件(本文的LOCAL_SRC_FILES在67行)

三、修改配置文件

注:本文采用的是RK3399的源码

        1.设置上下文服务类型

android8.1/system/sepolicy/prebuilts/api/26.0/private/service_contexts 以及android8.1/system/sepolicy/private/service_contexts两个配置文件分别添加

test-service    u:object_r:test_service:s0

这里的“test-service”与Context中定义的相同

        2.service.te 新增服务类型

android8.1/system/sepolicy/prebuilts/api/26.0/public/service.te 以及 android8.1/system/sepolicy/public/service.te两个配置文件分别添加

type test_service, system_api_service, system_server_service, service_manager_type;

        3.白名单修改

android8.1/build/core/tasks/check_boot_jars/package_whitelist.txt

文件末尾新增

#add
com\.chenzqTest
com\.chenzqTest\..*

       注:编译前要先执行 make update-api

四、修改SystemUI调用自定义服务

在我前一篇文章里有介绍怎么自定义SystemUI的快捷方式

android 8.1 SystemUI修改 QuickSetting 新增快捷设置图标_陈十方的博客-程序员宅基地

这次在点击事件里加入如下代码,在单击控件时调用自定义服务

import android.chenzqTest.TestManager;

@Override
protected void handleClick() {
        TestManager con =(TestManager)mContext.getSystemService(Context.CHENZQ_TEST_SERVICE);
        try{
            Log.d("chenzq2", "TestManager");
            con.log();
        }
        catch (Throwable e){
            Log.d("chenzq2", "TestManager excpetion");
        }
     
    }

结果

五、自定义服务导包到其它SDK中

本文是在源码环境下,所以可以直接导包,如果想要在在别的SDK使用可以到

目录:android8.1/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes

找到目录:android/chenzqTest/下:

找到目录:com/chenzqTest/server/下:

        

 找到自己所用的SDK目录:

解压 /platforms/android-**/ 目录下的android.jar文件,在解压文件里对应位置创建上面自定义的文件目录,并复制文件。重新压缩成android.jar。

六、自定义服务生成jar包

        1.相关文件的操作

 android8.1/framework/base/目录下新建chenzqtest文件夹,该文件夹下新建Android.mk文件

                

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ANDROID_COMPILE_WITH_JACK := false
LOCAL_SRC_FILES := $(call all-java-files-under, java/android/chenzqTest)
LOCAL_SRC_FILES += $(call all-java-files-under, java/com/chenzqTest)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := chenzqtest
include $(BUILD_STATIC_JAVA_LIBRARY)
                                            

移动 framework/base/core/java/android/chenzqTest 目录下文件到 framework/base/chenzqtest/java/android/chenzqTest 目录下。

移动 framework/base/core/java/com/chenzqTest/server 目录下文件到 framework/base/chenzqtest/java/com/chenzqTest/server 目录下。

        2.修改其它文件

第二步在 framework/base/下Android.mk中的修改改为

chenzqtest/java/android/chenzqTest/ITestService.aidl\

在 framework/base/下Android.mk中的packages_to_document新增自己的包

# TODO: deal with com/google/android/googleapps
packages_to_document := \
        android \
        javax/microedition/khronos \
        org/apache/http/conn \
        org/apache/http/params\
        android/chenzqTest//自己类的包名

在build/core/pathmap.mk文件的FRAMEWORKS_BASE_SUBDIRS变量后添加chenzqtest

FRAMEWORKS_BASE_SUBDIRS := \
        $(addsuffix /java, \
            core \
            graphics \
            .....
            keystore \
            rs \
            chenzqtest\ //自己的文件夹名
        )

修改android8.1/build/target/product/base.mk文件

PRODUCT_PACKAGES += \
    20-dns.conf \
    95-configured \
    org.apache.http.legacy.boot \
    ....
    vdc \
    vold \
    wm \
    chenzqTest //自己在Android.mk文件中定义的模块名

修改同目录下的generic_no_telephony.mk文件

PRODUCT_PACKAGES := \
    Bluetooth \
    BluetoothMidiService \
    Camera2 \
    ....
    EasterEgg \
    WallpaperCropper \
    chenzqTest //模块名

这样编译生成后就能在android8.1/out/target/common/obj/JAVA_LIBRARIES/chenzqtest_intermediates

目录下找到生成的jar包了

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/NEXAUS/article/details/125913492

智能推荐

国内计算机论文期刊,国内都有哪些计算机领域的投稿期刊-程序员宅基地

文章浏览阅读1.2k次。国内都有哪些计算机领域的投稿期刊发布时间:2019-01-14 15:11浏览: 次计算机在各行各业都得到了广泛的应用,而这一方向的从业人员也越来越多,他们也是可以评定计算机工程师职称的,但也需要发表计算机方向的论文,最近就有作者咨询我们的老师,关于国内计算机领域的投稿期刊,小编在此介绍:计算机专业领域的刊物有很多,也分计算机在各行各业都得到了广泛的应用,而这一方向的从业人员也越来越多,他们也是可..._计算机专业普刊

计算机设备管理使用实施细则,办公电脑及相关设备管理工作细则.doc-程序员宅基地

文章浏览阅读286次。乌蒙科技制度编号:E3055KY制度页数:共12页办公电脑及相关设备管理细则编 制 人:审 核 人:批 准 人:主办单位:总经理室公布日期:20XX年12月30日生效日期:20XX年 1 月 1日第一章 总 则目标为规范办公电脑及相关设备使用、维护、维修,依据集团[办公电脑及相关设备管理措施]之要求制订本细则。适用范围本细则适适用于矿业本部及所属子企业办公电脑及相关设备管理。办公电脑及相关设备分...

python数据结构与算法分析_Python数据结构与算法--算法分析-程序员宅基地

文章浏览阅读202次。在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程。算法的效率或复杂度在理论上表示为一个函数。其定义域是输入数据的长度,值域通常是执行步骤数量(时间复杂度)或者存储器位置数量(空间复杂度)。算法分析是计算复杂度理论的重要组成部分。一个有趣的问题经常出现,那就是两个看似不同的程序,到底哪个更好呢?要回..._energy+=list1[a]*list1[a-1]*list1[(a+1)%(n-i)]

linux6.4发送日志,RHEL6.4 搭建 Rsyslog 日志服务 Rsyslog+MySQL+Loganalyzer-程序员宅基地

文章浏览阅读67次。rsyslog 建立:安装rsyslog服务包,rsyslog-mysql的rpm包需要装上去,是日志和数据库结合的包配置/etc/rsyslog.conf文件vi/etc/rsyslog.confSYSLOGD_OPTIONS="-c2-r-x-m180" ##添加,KLOGD_OPTIONS="-x" ##添加,$ModLoadimm...

android的drawrect透明图层,android – 在活动上创建一个黑色透明的图层-程序员宅基地

文章浏览阅读279次。以编程方式,您可以使用Canvas创建图层.用你的颜色填充整个东西并切出一个洞.public class DrawView extends View {Paint paint = new Paint();Paint transparentPaint = new Paint;public DrawView(Context context) {super(context);}@Overridepubl..._canvas drawrect 全透明

NLP练习之RNN,使用pytorch_pytorch nlp 例子“”-程序员宅基地

文章浏览阅读251次。import numpy as npimport torchimport torch.nn as nnimport torch.optim as optimfrom torch.autograd import Variabledtype = torch.FloatTensorsentences = [ "i like dog", "i love coffee", "i hate milk"]word_list = " ".join(sentences).split()word_list_pytorch nlp 例子“”

随便推点

java http接口 session_Java EE javax.servlet.http中的HttpSession接口-程序员宅基地

文章浏览阅读458次。HttpSession接口public interface HttpSession(https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSession.html)一、介绍HttpSession接口提供了一种方式,使得用户在多个网页间浏览或请求时,他的身份信息可以得到验证,Server可以据此返回与他关联的内容。Server容器通过..._java 请求session接口

linux smartctl 命令,Smartctl 命令查看硬盘详细信息-程序员宅基地

文章浏览阅读6.1k次。Smartctl命令查看硬盘详细信息(2011-08-30 14:21:41)标签:linux硬盘信息使用时间杂谈1.1什么是Smartmontools?Smartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis andReportingTechnology,自动检测分析及报告技术)技术来实现的,SMART技术可以对硬盘的磁头单..._smartctl查看硬盘信息

压力传感器实例编程与java,如何使用Arduino进行编程 通通过压力传感器控制电机转速...-程序员宅基地

文章浏览阅读804次。/** circuits4you.com* 2016 November 25* Load Cell HX711 Module Interface with Arduino to measure weight in KgsArduinopin2 -> HX711 CLK3 -> DOUT5V -> VCCGND -> GNDMost any pin on the Arduin...

python 数据恢复 编程_Python | 数据恢复实验室 Data Recovery Laboratory-程序员宅基地

文章浏览阅读1.1k次。最近使用Python为项目开发一款绘图工具(绘出 声场三维模型)。因为希望能把Python脚本发布为脱离Python平台运行的可执行程序,比如单个的exe文件。PyInstaller恰满足这个需求。本文PyInstaller的版本是2.0,支持Python2.7。下面讨论怎样安装,使用PyInstaller。PyInstaller本身并不属于Python包。在安装 pyinstaller 之前假设..._python恢复硬盘数据 csdn

windows服务器上无法运行bat文件,ad域用户bat脚本运行不了-程序员宅基地

文章浏览阅读1.8k次。发表于2017-2-22 10:20|来自51CTO网页引用:原帖由 wankily 于 2017-2-22 08:33 发表 域环境是server2008,做了一个bat脚本,内容很简单,echo %date%,%username%,%COMPUTERNAME% >>\\192.168.10.1\tools$\pc-imformation-collect.txt,就是收集一下域..._windows sever .bat文件无法运行

既然android service是运行在主线程中的,那service还有什么用?_每个线程都有一个messagequeue-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏6次。既然android service是运行在主线程中的,那service还有什么用?对于Android,每一个进程都有一个主线程,四大组件的处理任务都是在这个线程中进行的。每个线程都有一个MessageQueue,里面用于存放Message,四大组件的处理工作是用Message来封装的。可以说Android应用层是消息驱动的。你的想法可能是,Service长期在后台工作,如果它是运行在主线程中的..._每个线程都有一个messagequeue