技术标签: android framework初学习 android
新增一个自定义的系统服务,并尝试在SystemUI中调用自定义service
到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方法
}
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”
一般把实现类放在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”
android8.1/frameworks/base/core/java/android/content/Context.java中新增
public static final String CHENZQ_TEST_SERVICE = "test-service";
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);
}
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);
}});
修改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的源码
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中定义的相同
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;
android8.1/build/core/tasks/check_boot_jars/package_whitelist.txt
文件末尾新增
#add
com\.chenzqTest
com\.chenzqTest\..*
注:编译前要先执行 make update-api
在我前一篇文章里有介绍怎么自定义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使用可以到
目录:android8.1/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes
找到目录:android/chenzqTest/下:
找到目录:com/chenzqTest/server/下:
找到自己所用的SDK目录:
解压 /platforms/android-**/ 目录下的android.jar文件,在解压文件里对应位置创建上面自定义的文件目录,并复制文件。重新压缩成android.jar。
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 目录下。
第二步在 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包了
文章浏览阅读1.2k次。国内都有哪些计算机领域的投稿期刊发布时间:2019-01-14 15:11浏览: 次计算机在各行各业都得到了广泛的应用,而这一方向的从业人员也越来越多,他们也是可以评定计算机工程师职称的,但也需要发表计算机方向的论文,最近就有作者咨询我们的老师,关于国内计算机领域的投稿期刊,小编在此介绍:计算机专业领域的刊物有很多,也分计算机在各行各业都得到了广泛的应用,而这一方向的从业人员也越来越多,他们也是可..._计算机专业普刊
文章浏览阅读286次。乌蒙科技制度编号:E3055KY制度页数:共12页办公电脑及相关设备管理细则编 制 人:审 核 人:批 准 人:主办单位:总经理室公布日期:20XX年12月30日生效日期:20XX年 1 月 1日第一章 总 则目标为规范办公电脑及相关设备使用、维护、维修,依据集团[办公电脑及相关设备管理措施]之要求制订本细则。适用范围本细则适适用于矿业本部及所属子企业办公电脑及相关设备管理。办公电脑及相关设备分...
文章浏览阅读202次。在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程。算法的效率或复杂度在理论上表示为一个函数。其定义域是输入数据的长度,值域通常是执行步骤数量(时间复杂度)或者存储器位置数量(空间复杂度)。算法分析是计算复杂度理论的重要组成部分。一个有趣的问题经常出现,那就是两个看似不同的程序,到底哪个更好呢?要回..._energy+=list1[a]*list1[a-1]*list1[(a+1)%(n-i)]
文章浏览阅读67次。rsyslog 建立:安装rsyslog服务包,rsyslog-mysql的rpm包需要装上去,是日志和数据库结合的包配置/etc/rsyslog.conf文件vi/etc/rsyslog.confSYSLOGD_OPTIONS="-c2-r-x-m180" ##添加,KLOGD_OPTIONS="-x" ##添加,$ModLoadimm...
文章浏览阅读279次。以编程方式,您可以使用Canvas创建图层.用你的颜色填充整个东西并切出一个洞.public class DrawView extends View {Paint paint = new Paint();Paint transparentPaint = new Paint;public DrawView(Context context) {super(context);}@Overridepubl..._canvas drawrect 全透明
文章浏览阅读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 例子“”
文章浏览阅读458次。HttpSession接口public interface HttpSession(https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSession.html)一、介绍HttpSession接口提供了一种方式,使得用户在多个网页间浏览或请求时,他的身份信息可以得到验证,Server可以据此返回与他关联的内容。Server容器通过..._java 请求session接口
文章浏览阅读6.1k次。Smartctl命令查看硬盘详细信息(2011-08-30 14:21:41)标签:linux硬盘信息使用时间杂谈1.1什么是Smartmontools?Smartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis andReportingTechnology,自动检测分析及报告技术)技术来实现的,SMART技术可以对硬盘的磁头单..._smartctl查看硬盘信息
文章浏览阅读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...
文章浏览阅读1.1k次。最近使用Python为项目开发一款绘图工具(绘出 声场三维模型)。因为希望能把Python脚本发布为脱离Python平台运行的可执行程序,比如单个的exe文件。PyInstaller恰满足这个需求。本文PyInstaller的版本是2.0,支持Python2.7。下面讨论怎样安装,使用PyInstaller。PyInstaller本身并不属于Python包。在安装 pyinstaller 之前假设..._python恢复硬盘数据 csdn
文章浏览阅读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文件无法运行
文章浏览阅读4.9k次,点赞2次,收藏6次。既然android service是运行在主线程中的,那service还有什么用?对于Android,每一个进程都有一个主线程,四大组件的处理任务都是在这个线程中进行的。每个线程都有一个MessageQueue,里面用于存放Message,四大组件的处理工作是用Message来封装的。可以说Android应用层是消息驱动的。你的想法可能是,Service长期在后台工作,如果它是运行在主线程中的..._每个线程都有一个messagequeue