在 Android 系统源码中自定义系统服务(Custom System Service in AOSP)

无屏智能盒子开发实战:用MT8766 Android12源码修改WiFi热点默认配置(SSID/密码/IP) 本文详细介绍了基于MT8766平台和Android12系统的无屏智能盒子WiFi热点开发实战,包括从源码修改默认SSID/密码、固定IP地址分配以及实现开机自启热点功能。通过深入分析AOSP源码架构,提供完整的开发环境配置、参数定制方案及量产部署建议,帮助开发者快速实现稳定的WiFi热点功能,适用于智能家居和物联网设备开发。 阅读详情

该原创文章首发于微信公众号:字节流动

在 Android 系统源码中自定义系统服务(Custom System Service in AOSP)

配置编译环境(Initial AOSP build environment.)

cd AOSP root dir
source build/envsetup.sh
lunch
2

定义 Service 的 AIDL 文件(Define service AIDL file)

path:frameworks/base/core/java/android/os/
Create IHaoHaoService.aidl file

package android.os;

interface IHaoHaoService {

   void setVal(String key,String value);

   String getVal(String key);
}

修改 Android 模块文件(Modify Android.mk file)

path: frameworks/base/Android.mk


......

## READ ME: ########################################################
##
## When updating this list of aidl files, consider if that aidl is
## part of the SDK API.  If it is, also add it to the list below that
## is preprocessed and distributed with the SDK.  This list should
## not contain any aidl files for parcelables, but the one below should
## if you intend for 3rd parties to be able to send those objects
## across process boundaries.
##
## READ ME: ########################################################
LOCAL_SRC_FILES += \

    ......

	core/java/android/os/IPowerManager.aidl \
	core/java/android/os/IRemoteCallback.aidl \
	core/java/android/os/ISchedulingPolicyService.aidl \
	core/java/android/os/IUpdateLock.aidl \
	core/java/android/os/IUserManager.aidl \
	core/java/android/os/IVibratorService.aidl \
	core/java/android/os/IHaoHaoService.aidl \

	......

进行模块编译:

~/aosp/android-6.0.1_r1$ mmm frameworks/base

generate IHaoHaoService.java file.

创建 HaoHaoService 文件(Create HaoHaoService file)

path: frameworks/base/services/core/java/com/android/server/
Create HaoHaoService.java file.

package com.android.server;

import android.util.Slog; 
import android.os.RemoteException;
import android.os.IHaoHaoService;
import java.util.HashMap;

public class HaoHaoService extends IHaoHaoService.Stub {
    private static HashMap<String,String> mCache = null;
    private static final String TAG="HaoHaoService";

    public HaoHaoService() {
    	 mCache = new HashMap<>();
    	 Slog.d(TAG, "HaoHaoService starting.");
    }

   
    public void setVal(String key, String value) throws RemoteException {
        mCache.put(key, value);
    }

    public String getVal(String key) throws RemoteException {
        return mCache.get(key);
    }

}

注册服务(Register service)

Modify frameworks/base/core/java/android/content/Context.java
Add:

     /**
     * Use with {@link #getSystemService} to retrieve a
     * {@link android.os.IHaoHaoService} for accessing the HaoHao service.
     *
     * @see #getSystemService
     * @hide
     */
    public static final String HAOHAO_SERVICE = "haohao";

Modify frameworks/base/services/java/com/android/server/SystemServer.java
Find function startOtherServices()
Add:


            try {
                Slog.i(TAG, "***HaoHao Service***");
                ServiceManager.addService(Context.HAOHAO_SERVICE, new HaoHaoService());
            } catch (Throwable e) {
                Slog.e(TAG, "Failure starting HaoHao Service", e);
            }

Create HaoHaoServiceManager.java file

path: frameworks/base/core/java/android/app/

package android.app;

/**
 * Created by haohao on 17/10/2.
 */
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.IHaoHaoService;
import android.util.Log;

public class HaoHaoServiceManager {

    private static final String TAG = "HaoHaoServiceManager";
    private IHaoHaoService mService;

    public HaoHaoServiceManager(Context context, IHaoHaoService service){
        mService = service;
    }

    public void setVal(String key,String value){

        try {

            mService.setVal(key,value);

        } catch(Exception e){

            Log.e(TAG, e.toString());

            e.printStackTrace();
        }

    }
    public String getVal(String key){
        try {

            return mService.getVal(key);

        } catch(Exception e){
            
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }
        return null;
    }
}

Register service in SystemServiceRegistry.java file

path: frameworks/base/core/java/android/app/SystemServiceRegistry.java
Add:

import android.os.IHaoHaoService;
      
        ......

         registerService(Context.HAOHAO_SERVICE, HaoHaoServiceManager.class,
                new CachedServiceFetcher<HaoHaoServiceManager>() {
                    @Override
                    public HaoHaoServiceManager createService(ContextImpl ctx) {
                        IBinder binder = ServiceManager.getService(Context.HAOHAO_SERVICE);
                        IHaoHaoService service = IHaoHaoService.Stub.asInterface(binder);
                        return new HaoHaoServiceManager(ctx, service);
            }});

        ......

Modify SePolicy Build Check

path: external/sepolicy/service.te

Add:

type haohao_service, system_api_service, system_server_service, service_manager_type;

path: external/sepolicy/service_contexts

Add:

haohao u:object_r:haohao_service:s0

service_contexts

accessibility                             u:object_r:accessibility_service:s0
account                                   u:object_r:account_service:s0
activity                                  u:object_r:activity_service:s0
alarm                                     u:object_r:alarm_service:s0
haohao                                    u:object_r:haohao_service:s0
android.security.keystore                 u:object_r:keystore_service:s0
android.service.gatekeeper.IGateKeeperService    u:object_r:gatekeeper_service:s0

Update api and build

~/aosp/android-6.0.1_r1$ make update-api -j8

~/aosp/android-6.0.1_r1$ make -j8

Test service in your Activity

    @Override
    public void onCreate() {
        super.onCreate();

        mHaoHaoServiceManager = (HaoHaoServiceManager)getSystemService(Context.HAOHAO_SERVICE);
        mHaoHaoServiceManager.setVal("haohao", "Android Developer");

联系与交流

我的公众号
我的公众号
我的微信

我的微信

RK3588安卓系统开机自启动:从广播到init.rc的四种方案与实战 在嵌入式系统与物联网设备开发中,开机自启动是实现设备自主运行、减少人工干预的核心机制。其原理在于操作系统启动流程中预设的钩子或服务管理机制,允许特定应用或进程在系统引导完成后自动执行。这一技术的价值在于保障关键服务(如数据采集、AI推理或人机界面)的即时可用性,是工控机、边缘计算盒子等产品化设备从“开发板”迈向“可靠产品”的关键一步。应用场景广泛覆盖工业自动化、智能零售终端、AIoT网关等领域。针对瑞芯微高性能AIoT芯片RK3588的安卓系统,实现稳定自启动需深入系统层,本文聚焦于**init.rc脚本* 阅读详情

相关推荐

Android SELinux策略实战:为新增系统服务定义安全标签与权限

SELinux作为Linux内核的强制访问控制安全模块,通过为每个进程和系统资源打上安全上下文标签,构建了细粒度的访问控制体系。其核心原理是基于类型强制策略,对主体与客体之间的访问请求进行强制检查,确保只有策略明确允许的操作才能执行。在Android系统开发中,这一机制对于保障系统安全、防止权限滥用具有重要价值。当开发者需要为新增的守护进程或系统服务赋予合法运行权限时,就必须为其定义专属的SELinux域和文件标签,并遵循最小权限原则编写策略规则。本文以Android平台为背景,深入解析了如何通过修改`.t

weixin_34236869的博客 369

【Android车载系列】第11章 系统服务-SystemServer自定义服务

system/sepolicy/prebuilts/api/32.0/private/ 与 system/sepolicy/private/目录下,分别修改以下三个文件#配置自定义服务selinux角色用户:角色:类型:安全级别#配置自定义服务类型的权限#允许所有app使用自定义服务一般只是用来调试自己的服务功能是否正常} } // 使用 YvanManager yvanManager =(YvanManager) getSystemService("yvan");

Yvan 1310

Android工业评估板实战:从BSP到系统定制的完整指南

在嵌入式系统开发中,Android正从移动终端向工业物联网设备快速延伸。工业级评估板通常以BSP(板级支持包)为核心,预编译系统镜像与驱动适配层,帮助开发者绕过底层移植难题。理解BSP如何桥接硬件与Android框架,是评估硬件平台、缩短产品落地周期的关键。此类开发板注重宽温、长生命周期与接口兼容性,适合触摸交互终端、边缘网关及医疗人机界面等场景。从首次烧录、串口调试到SELinux策略调整,每一环节都影响项目成败。本文围绕VersaLogic Android Demo/Eval Kit,梳理工业评估板从开

weixin_33874713的博客 373

Android Framework 之 SystemServer

SystemServer是Android系统中的一个核心组件,负责启动和管理许多重要的系统服务。

milan-xiao-tiejiang的博客 1034

Android系统定制:如何隐藏开发者模式入口,改用计算器输入%147%+来开启(MTK平台实战)

本文详细介绍了在MTK平台上定制Android系统,通过计算器输入特定暗码`%147%+`来激活开发者模式,同时隐藏常规入口的实战方案。该方案适用于教育设备、企业定制终端等场景,平衡了系统安全性与用户体验,并提供了完整的代码实现和部署验证流程。

weixin_30512043的博客 402

Android WMS深度解析:从窗口管理到车机系统实战

在Android系统开发中,窗口管理是构建复杂用户界面的核心技术基础。其核心原理在于通过WindowManagerService(WMS)统一管理系统中的所有窗口(Window),负责窗口的创建、排序(Z-order)、布局以及输入事件分发。这项技术的核心价值在于为应用提供了稳定、高效的显示与交互基础,尤其在多窗口、分屏以及系统级悬浮窗等高级场景中不可或缺。在智能座舱、车机系统等复杂应用场景下,对WMS的深入理解和定制能力直接决定了系统UI的稳定性与表现力。本文聚焦WMS的架构设计与实战,通过剖析窗口类型、

weixin_34337381的博客 404

aosp下载、编译、刷机和单编framework(android 12)

aosp源码下载,编译,刷机以及单编framework

Tank_Mao的博客 1万+

安卓虚拟机显示驱动启动关键:property机制深度解析

安卓图形栈初始化高度依赖property系统提供的硬件抽象标识,其本质是运行时决策引擎的输入源,通过键值对(如ro.hardware.graphics)动态控制EGL/Vulkan驱动加载路径。该机制实现硬件无关性设计,使同一套Framework可适配不同GPU后端;在虚拟化环境中,因缺乏真实PCI设备,必须人工注入property并配套部署对应so文件(如libEGL_swiftshader.so),否则将导致eglInitialize失败、黑屏或SurfaceFlinger崩溃。典型应用场景包括QEMU

weixin_34101229的博客 352

Android添加自定义系统服务

需求,希望在Android ROM中添加相应的LogService服务,保存每次的log,用于处理系统死机问题; 本文档基于rk的5.1.1系统; 基本框架: 5.1.1系统在framework/base/services/java/com/android/server/SystemServer.java文件中 startOtherServices函数在启动启动了core服务后,开

lzpdz的博客 3436

Android SELinux安全机制详解:从MAC模型到策略定制与调试实战

在Linux系统安全领域,强制访问控制(MAC)是一种核心安全模型,它通过系统全局策略对进程和资源的访问进行强制约束,与传统的自主访问控制(DAC)形成互补,共同构建纵深防御体系。SELinux作为MAC在Linux内核的主流实现,其技术价值在于将安全边界从用户级别细化到进程和对象级别,即使root进程也必须遵守策略规则,从而极大限制漏洞或恶意代码的影响范围。在Android系统中,SELinux自5.0版本起全面启用强制模式,成为系统安全的基石,广泛应用于系统服务、硬件抽象层(HAL)及设备制造商(OEM

weixin_33768481的博客 399

Android ROM解包与打包全流程:从工具链到定制实战

在嵌入式系统与移动开发领域,固件(Firmware)是硬件设备运行的基础软件层,它直接控制硬件操作并向上层操作系统提供接口。其核心原理在于将预先编译好的二进制代码和配置文件存储在设备的非易失性存储器中,系统启动时加载执行。这项技术的价值在于允许开发者深度定制设备功能、优化性能、修复漏洞或适配特定硬件。在Android生态中,ROM(Read-Only Memory)刷机包是固件的一种常见形式,广泛应用于手机、电视盒子等设备的系统升级与个性化定制。通过解包ROM,开发者可以修改系统分区文件、集成Root权限(

wangqiaowqo的专栏 352

Android init.rc 添加自定义服务

Android init.rc 添加自定义服务,运行系统bin文件一、按照rc语法格式添加新增service二、添加te文件三、rc语法链接四、avc权限添加 一、按照rc语法格式添加新增service rc文件中添加如下 # 最后两个必写,其他的省略亦可 service screencnap/system/bin/screencap # class 包括core main late_st...

tq501501的博客 7949

RK3568 Android11开机动画“消失”了?别慌,这份排错指南帮你快速定位(附bootanimation调试技巧)

本文详细解析了RK3568 Android11平台开机动画异常的排查方法,包括文件系统路径检查、属性系统诊断、日志分析和SELinux策略定制等关键步骤。通过实战案例和调试技巧,帮助开发者快速定位bootanimation加载问题,确保自定义动画正常显示。

aodaidi6752的博客 456

Android HAL模块开发实战:从HIDL接口到内核通信完整实现

硬件抽象层(HAL)是Android系统架构中的核心组件,它定义了硬件设备与上层框架之间的标准化接口。其核心原理是通过接口定义语言(如HIDL)实现进程间通信(IPC),将硬件具体实现细节封装在底层,为上层提供统一的访问方式。这一设计的技术价值在于实现了硬件驱动的跨平台兼容性和可维护性,使得Android能够适配多样化的硬件设备。在工程实践中,HAL模块通常需要与Linux内核驱动通过sysfs文件系统或ioctl系统调用进行数据交互,完成传感器数据采集、设备控制等关键功能。本文以构建一个虚拟传感器HAL模

cuanji3287的博客 435

安卓TV流媒体终端轻量适配方案:基于OMX硬解的老旧设备重生实践

流媒体播放器是智能终端内容呈现的核心组件,其性能表现高度依赖底层解码架构与硬件加速能力。在Android TV生态中,MediaCodec作为标准多媒体接口,需结合芯片厂商提供的OMX IL组件实现高效H.264/H.265硬解;而ExoPlayer等高级封装框架虽具备跨平台优势,却常因SoC碎片化导致软解fallback、Z-order冲突与电源管理异常。本方案聚焦低算力终端(如Amlogic S905X2、RK3328)的真实部署瓶颈,通过精简内核、绕过Stagefright框架、强制指定vendor

weixin_34248023的博客 394

AOSP添加服务

AOSP添加服务 framework中添加我们自己的服务,添加步骤如下: 整理知识 1.添加定义的接口 /framework/base/core/java/android/os/Iybftest.aidl package android.os interface Iybftest{ int getNumber(); } /framework/base/Android.mk 添加aidl文件 core/java/android/os/Iybftest.aidl 编译aidl ./framework/base$ mm -B 2.添加Manager /framework/base/co

Android属性系统深度解析:property_get与property_set的权限、陷阱与实战

在Android系统开发中,进程间通信(IPC)与系统配置管理是核心基础。属性系统作为一种轻量级的全局键值存储机制,通过property_get和property_set接口,为系统组件和应用提供了高效的状态共享与配置通道。其技术价值在于实现了跨进程的实时数据同步与事件通知,是系统启动流程、服务管理及动态配置的关键支撑。典型应用场景包括系统启动状态同步(如sys.boot_completed)、运行时调试标志传递及init脚本中的条件触发。本文将聚焦权限控制模型与SELinux策略,解析读取失败、Secur

weixin_34342992的博客 351

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

RK3566安卓驱动实战:从SHT30传感器接入到HAL层调试

嵌入式Linux驱动开发是连接硬件与操作系统的底层技术核心,其本质在于构建稳定、可验证的硬件抽象通信链。在安卓系统中,驱动不仅需满足Linux内核规范,更须跨越Device Tree、Kernel Driver、HAL(HIDL/AIDL)、Framework四层架构,并应对SELinux策略、动态加载、电源管理等工程约束。以RK3566平台接入SHT30温湿度传感器为例,真实项目涉及dts精准绑定、probe函数健壮性检查、hwmon设备注册、HIDL接口实现及SELinux权限适配等关键环节。该过程高度

weixin_33957648的博客 264

研究生如何快速发CVPR

研究生如何快速发CVPR,找到科研方向

python_vb的博客 785

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6571
上一篇: NDK OpenGLES3.0 开发(九):光照基础
下一篇: Java 线程的七种状态
字节流动
字节流动 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄11年 1912粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节流动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值