Android系统开发 ----- 系统服务开发

article/2025/10/25 19:24:31

系列文章目录

Android系统启动 ---- 主要流程类_MrDarly的博客-CSDN博客Android系统启动Zygote关系主要的类https://blog.csdn.net/weixin_68948960/article/details/125310042


前言

Android系统开发之系统服务开发。

问题:用户操作无界面,但是需要Android启动时,操作服务也进行启动,跟随系统关闭服务关闭。该服务提供打开某个APP功能,调用打开APP进行副屏投屏功能。移交给其他APP进行调用开启。系统提供服务,其他APP进行调用打开。


一、系统服务

Android开发过程中经常会用到各种各样的系统管理服务,

如进行窗口相关的操作会用到窗口管理服务WindowManager,

进行电源相关的操作会用到电源管理服务PowerManager,

还有很多其他的系统管理服务,如通知管理服务NotifacationManager、振动管理服务Vibrator、电池管理服务BatteryManager

这些Manager提供了很多对系统层的控制接口。对于App开发者,只需要了解这些接口的使用方式就可以方便的进行系统控制,获得系统各个服务的信息,而不需要了解这些接口的具体实现方式。而对于Framework开发者,则需要了解这些Manager服务的常用实现模式,维护这些Manager的接口,扩展这些接口,或者实现新的Manager。

Android中的系统服务分为两个部分:

1、C或C++层实现Service Framework。

2、Java层实现Service Framework

本次新加的系统服务就是Java层Service Framework。

由于本人对C和C++不熟悉,现阶段无法进入更深层次的Native Service Framework,所以只是浅层的进行Java Service Framework进行调整和增加。

二、实现步骤

1、环境搭建

 想进行Framework层开发,需要搭建基本的开发环境。本小节介绍环境的搭建

工具:Android Studio Ubuntu 系统。

默认已经参考网上教程已经下载好AOSP原始代码,并切编译成功。

第一步:生成iml和ipr文件

source build/envsetup.sh
lunch aosp_x86-eng # 或者直接输入lunch,然后选择对应的target
make idegen
development/tools/idegen/idegen.sh

情况一:代码在远程Ubuntu服务器中,电脑在本地使用putty进行链接操作,所有编译都在远程进行。由于我们只调整Framework代码,AOSP其他代码都不用同步到本地,当然网络好的情况下,直接打开也可以。

情况二:本地电脑是Ubuntu系统,代码下载到本地电脑,并使用Ubuntu进行了编译,安装了Android Studio工具,电脑性能可观可以进行全量打开,当然最好还是只打开我们调整的framework目录。

第二步:代码导入到Android Studio

在Project Structure下进行代码关联

选择源码位置进行关联,可以分目录,分文件进行关联,也可以一次性全部关联。AOSP代码在远程这里的错误可以不理会。AOSP代码在本地这里没有错误展示。

 

 

点击保存,进行代码同步关联后,查看frameworks中的代码就可以进行跳转,查看。

到此为止,可以在Android Studio中进行编写代码了,这里不能进行编译,需要在Ubuntu下使用命令进行编译。

2、代码分析

第一步:分层

服务层

Java Service Framework没有Service Manager统一的管理类, 所以要单独自行实现一个Manager(应用可以获取该服务,并进行调用的管理类)

xxxManager源码位置

RPC层

AIDL编写的接口,系统编译器自动生成服务代理和服务Stub。直接可用Stub和Stub.Proxy

aidl源码位置

IPC层

新增的服务和Stub.Proxy通过Binder IPC进行交互。调用JNI也属于IPC层

xxxService 实现aidl的源码位置

代码包总览如下图:

第二步:调整代码

在frameworks/base/core/java/android/app/目录下新建ota文件夹,

存放两个类IOtaService.aidl文件和OtaManager.java文件

IOtaService.aidl是RPC层

package android.app.ota;//测试OTA 第一步:添加接口
interface IOtaService{int initDisplay();int startVideo(String url);int startImage(String url);void openMediaCenter();}

OtaManager.java是服务层

package android.app.ota;import android.util.Slog;
import android.os.RemoteException;
import android.annotation.SystemService;
import android.content.Context;//测试OTA 第三步:添加系统服务的Manager
public class OtaManager {private final IOtaService mService;public static final int SENT_STREAM_VIDEO = 0;public static final int SENT_STREAM_IMAGE = 1;public static final int SENT_STREAM_TEXT = 2;public OtaManager(IOtaService mService) {this.mService = mService;}public int initDisplay() {int result = 0;try {result = mService.initDisplay();Slog.i("OtaManager", "IOtaService getCpuTemperature:" + result);} catch (RemoteException ex) {ex.printStackTrace();}return result;}public int setInputFlowerToDisplay(String url, int type) {int result = 0;try {if (type == SENT_STREAM_VIDEO) {result =  mService.startVideo(url);} else if (type == SENT_STREAM_IMAGE || type == SENT_STREAM_TEXT) {result =  mService.startImage(url);}Slog.i("OtaManager", "setInputFlowerToDisplay:" + result);} catch (RemoteException ex) {ex.printStackTrace();}return result;}public void openMediaCenter(){try {mService.openMediaCenter();Slog.i("OtaManager", "openMediaCenter");} catch (RemoteException ex) {ex.printStackTrace();}}
}

在frameworks/base/services/core/java/com/android/server/目录下,新建ota文件夹存放OtaManagerService.java是IPC层

package com.android.server.ota;import android.hardware.display.DisplayManager;
import android.view.Display;
import android.app.ActivityOptions;
import android.content.Context;
import android.content.Intent;import android.app.ota.IOtaService;
import android.content.Context;
import android.util.Slog;//测试OTA 第二步:添加系统服务,实现aidl文件的接口
public class OtaManagerService extends IOtaService.Stub {private Context mContext;private int display = 0;public OtaManagerService(Context context) {mContext = context;Slog.d("OTAManagerService", "Construct");}@Overridepublic int initDisplay() {DisplayManager  mDisplayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE);//屏幕管理类Slog.i("initDisplay-->DisplayManager", "获取DisplayManager" + mDisplayManager);if(mDisplayManager == null){return -1;}else{Display[] displays = mDisplayManager.getDisplays(); //得到显示器数组Slog.i("initDisplay-->Display", "获取Display显示器数组" + displays);if (displays != null && displays.length >= 2) {display = displays[1].getDisplayId();return display;} else {return -1;}}}@Overridepublic int startVideo(String url) {if(display == 0){//没有拿到屏幕信息Slog.i("startVideo-->display", "没有拿到屏幕信息" + display);return -1;}else{// 启动客显屏ActivityIntent intent = mContext.getPackageManager().getLaunchIntentForPackage("com.darly.otamedia");Slog.i("startVideo-->intent", "拿到的Intent数据" + intent);if (intent != null) {intent.putExtra("video_url", url);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);ActivityOptions options = ActivityOptions.makeBasic();options.setLaunchDisplayId(display);mContext.startActivity(intent, options.toBundle());return 100;}else{return -1;}}}@Overridepublic int startImage(String url) {if(display == 0){//没有拿到屏幕信息Slog.i("startImage-->display", "没有拿到屏幕信息" + display);return -1;}else{// 启动客显屏ActivityIntent intent = mContext.getPackageManager().getLaunchIntentForPackage("com.darly.otamedia");Slog.i("startImage-->intent", "拿到的Intent数据" + intent);if (intent != null) {intent.putExtra("image_url", url);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);ActivityOptions options = ActivityOptions.makeBasic();options.setLaunchDisplayId(display);mContext.startActivity(intent, options.toBundle());return 100;}else{return -1;}}}@Overridepublic void openMediaCenter() {Intent intent = mContext.getPackageManager().getLaunchIntentForPackage("com.android.htmlviewer");Slog.i("openMediaCenter-->intent", "拿到的Intent数据" + intent);if (intent != null) {mContext.startActivity(intent);}}}

第三步:注册以及绑定

在frameworks/base/core/java/android/content/Context.java中增加新标签

    //测试OTA 第四步:添加OTA_SERVICE常量public static final String OTA_DM_SERVICE = "ota_dm";

在frameworks/base/core/java/android/app/SystemServiceRegistry.java中将新服务注册到系统中

//测试OTA 第五步:将实现的服务注册到系统中去
registerService(Context.OTA_DM_SERVICE,  OtaManager.class,new CachedServiceFetcher<OtaManager>() {@Overridepublic OtaManager createService(ContextImpl ctx) {IBinder dm = ServiceManager.getService(Context.OTA_DM_SERVICE);return new OtaManager(IOtaService.Stub.asInterface(dm));}});	

在frameworks/base/services/java/com/android/server/SystemServer.java的startOtherServices方法中进行IPC层注册和启动

        //测试OTA 第六步:将注册的服务设置成开机启动服务t.traceBegin("OtaManagerService");ServiceManager.addService(Context.OTA_DM_SERVICE, new OtaManagerService(context));t.traceEnd();

第四步:查看编译

首先查看Ubuntu下,修改文件的编码格式是不是UTF-8,其次查看文件权限是不是被调整。

其次进行如下操作,进行编译,将增加修改的代码编译到System.img中

source build/envsetup.sh
lunch aosp_x86-eng # 或者直接输入lunch,然后选择对应的target
make update-api # 完成后,进行整体项目编译
make -j6

编译完成后,查看对应out目录下找到img文件。

3、运行调试

情况一:有实体手机,运行烧录到手机中,测试APP中使用

OtaManager manager = (OtaManager) context.getSystemService(Context.OTA_DM_SERVICE);

获取调用,输出日志正常。

情况二:无实体手机,如果代码本地,直接启动虚拟机。测试APP中使用

OtaManager manager = (OtaManager) context.getSystemService(Context.OTA_DM_SERVICE);

进行调用,输出日志正常。


总结

其实如果只是Java代码,针对Android应用开发的朋友还是比较轻松的。AOSP 的Framework层概念比较多,有时候就是简单的一个调用,书本中能写一两页,赋予不同的名称不同的功能。看书和代码同步进行是最快的学习方式。

由于Framework层动不动就调到Native层代码,但AOSP源码超级大,导致源码查找不方便,学习成本增加。Native层代码看懂还真不容易。而且更多的是调用到内核中,更让人看不懂。所以学习Framework层,还是先从Java开始,遇到Native慢慢研究,慢慢深入,日后都是大牛。


http://chatgpt.dhexx.cn/article/hDeNj6db.shtml

相关文章

安卓开发入门基础

文章目录 一、APP的运行环境&#xff1a;二、APP的开发语言1.java2.Kotlin3.C/C4.XML 三、APP的数据库四、APP的工程结构配置模块级别的build.gradle清单文件 五、APP的界面显示和逻辑处理 一、APP的运行环境&#xff1a; 首先APP运行在Android系统之上&#xff0c;Android系统…

安卓Android开发快速入门

配合天哥视频食用更佳&#xff1a;【天哥】Android开发视频教程最新版 Android Studio开发 UI组件&#xff08;控件&#xff09; 布局管理器 LinearLayout&#xff08;线性布局&#xff09; 可嵌套 最常用属性 id 起标记布局的作用 layout_width [wrap_content根据内容选…

安卓开发—Android基础

安卓开发—Android基础 移动开发 移动开发也叫做移动互联网开发。是指以手机、PDA、UMPC等便携终端为基础&#xff0c;进行相应的开发工作&#xff0c;由于这些随身设备基本都采用无线上网的方式&#xff0c;业内也称作为无线开发。 移动应用包括早期的WM掌上助理设备&#…

为什么要自建量化交易平台?

量化交易平台概述 量化交易是指借助现代统计学和数学的方法&#xff0c;利用计算机技术来进行交易的投资方式。它从历史数据中选择经数量模型验证的大概率事件制定策略&#xff0c;通过严格执行来获得持续稳定的超额回报。它具有严格的纪律性、完备的系统性、善用套利思想、依靠…

easytrader 量化交易平台连接同花顺软件使用平安证券

参考&#xff1a;https://easytrader.readthedocs.io/zh/master/usage/#_15 https://blog.csdn.net/iycai/article/details/107592462 *** 安装&#xff1a;pip install easytrader import easytraderuser easytrader.use(ths) #其他券商专用同花顺客户端需要提前下载同花…

量化交易平台设计浅谈

“买入前10只现价创一年新高的股票&#xff0c;合计10万元平均分配&#xff0c;限价下单”&#xff0c;这是一个交易策略&#xff1b;运行该交易策略所需要的实时行情、历史行情、事件处理、风控、下单接口、回测统计等模块&#xff0c;就是交易系统平台。 从投资机构的角度考…

Lean — 优秀好用的开源量化交易平台

Lean 是 QuantConnect 开源的一款非常强大的开源量化交易平台&#xff0c;可以回测或运行Python或者C#写的策略&#xff0c;并在代码仓库中内置了上百个C#和Python的策略算法。 这个开源的算法交易引擎&#xff0c;专为让用户方便轻松地进行策略研究、回测和实时交易而构建。它…

基于聚宽量化交易平台实现量化交易策略

一、入门量化策略 JoinQuant聚宽API文档&#xff1a;https://www.joinquant.com/help/api/help?nameapi 1、策略内容 设置股票池为沪深300的所有成分股 如果当前股价小于10元/股且当前不持仓&#xff0c;则买入&#xff1b; 如果当前股价比买入时上涨了25%&#xff0c;则清仓止…

手把手搭建Python量化交易平台-1:系统架构

个人量化交易的系统架构图&#xff1a; 个人量化交易平台特点&#xff1a; 个性化&#xff1a;开源参考设计 自行个性化设计数据化&#xff1a;python数据分析可视化&#xff1a;phthon前台显示智能化&#xff1a;人工智能及机器学习自动化&#xff1a;通过自动化机制&#x…

Python量化交易平台:QMT (日内交易策略示例)

QMT /Ptrade是一款面向个人投资者,尤其是中高净值个人投资者的专业交易系统。系统采用先进的技术框架,具有功能丰富、风控全面、管理灵活、架构精简、高效稳定等核心优势。PTrade终端不仅支持多品种普通交易、日内回转交易、量化交易等场景;还集成了期权组合交易、期权无风险…

量化交易平台Quantopian学习的笔记(一)

最近对量化感兴趣&#xff0c;每周末带孩子上辅导班等候时在星巴克记录的一些笔记&#xff0c;记录一下便于以后查阅&#xff0c;一并分享出来希望对大家有帮助。 Quantopian量化交易平台主要针对美股&#xff0c;国内也有几个针对A股的&#xff0c;对A股感兴趣的可以去网上找…

如何通过量化交易平台接口搭建自己的平台?

市面上其实已经有那么多的可以使用的相对比较完善的量化平台了&#xff0c;但是为什么还是有那么多人选择自己搭平台呢&#xff1f;毕竟重复造轮子&#xff0c;是一件吃力不讨好的事情。因为每个人的选择是不一样的&#xff0c;而且在整个搭建的过程中&#xff0c;也能学习到很…

支持python的量化交易平台

现在支持python的量化平台有很多&#xff0c;其中的“佼佼者”无疑是聚宽量化平台和讯投QMT。 简单介绍下两款量化平台&#xff1a; 迅投QMT量化交易平台&#xff1a;支持VBA、python语言编程&#xff0c;可交易的标的包括股票、ETF、可转债。 优点包括&#xff1a;智能算法行…

主流量化交易与程序化交易平台整理

本文整理了主流的股票、期货与外汇程序化交易的平台与相关资料介绍&#xff0c;部分内容来自网络&#xff0c;图片来自各平台官网截图。 国内大众版 【名称】掘金量化 | MyQquant 【官网】https://www.myquant.cn/ 【简介】成立于2013年&#xff0c;深耕量化投资领域&#xf…

ISE 14.7安装教程——新版(普通安装环境以及难搞的Win10)

对于学习Xilinx系列FPGA的同学们一定少不了和ISE软件的接触&#xff0c;ISE软件最新的版本就是ISE14.7&#xff0c;但是这个版本在win10系统64位的电脑上安装可谓是问题百出&#xff0c;这篇文章的目的是让你会在你的电脑上安装ISE14.7&#xff0c;也是让ISE14.7在64位的win10电…

第2章 Linux操作系统应用入门

嵌入式系统就是一个专用的计算机系统&#xff0c;其上运行的操作系统一般采用Linux系统&#xff0c;既然如此我们就要学会如何使用Linux操作系统。 2.1启动Linux系统 1.在宿主机上启动虚拟机,点击启动Ubuntu系统。 如下图所示&#xff1a; 2、Ubuntu系统启动以后&#xff0c;…

HPS SoC和FPGA联合使用例程

本教程演示了如何使用HPS/ARM与FPGA进行通信。我们将为DE10标准开发板介绍如何根据官方的DE10_Standard_GHRD工程开发出自己的My_GRHD工程。之后&#xff0c;我们会在My_GHRD工程上运行我们自己改造过后的HPS_FPGA_LED应用程序。该应用程序会控制连接到DE10标准开发板上FPGA部分…

RV1126与RV1109 AI系统设计概要(一部分)

RV1109与RV1126参数 主要区别 RV1126处理器(例子) 四核核 Cortex-A7&#xff0c;ARM架构V7-A指令&#xff0c;独立Neon SIMD(一种高级单指令多数据扩展指令集&#xff0c;可执行并行数据处理)&#xff0c;与独立FPU(浮点计算)。&#xff08;RV1109双核A7&#xff09; 每核有32…

JTAG学习笔记 (3)

因为WIGGLER的一些不可避免的缺点&#xff0c;我们现在将精力集中在JLink上。 JLink是大家都能够买的起的仿真器&#xff08;当然是D版&#xff09;&#xff0c;已经是白菜价了&#xff0c;可以参考淘宝。他真的是仿真器&#xff0c;虽然目前只能支持ARM系列的芯片&#xff0c…

嵌入式系统设计笔记

难点&#xff1a;第五章&#xff0c;第十章三级流水线组织&#xff0c;第十一章 第一章 嵌入式系统导论 1、ARM是RISC架构 2、Cortex&#xff0c;ARM11以后的产品使用Cortex命名&#xff0c;并分为A/R/M三类 3、ARM指令分为数据处理、数据传递、控制指令 4、CM 2835 在树莓派上…