android 10 自定义系统服务接口给app调用

2023-05-16

Android 安卓自定义系统服务

最近有个需求,要增加系统服务,生成第三方 jar 包提供给第三方应用调用,而且 jar 包必须用特定的包名 ,最后生成的 jar 包不能包含 frameworks 相关代码。

网上搜索了很多资料,搜索结果都没有自定义包名的案例,导出的 jar 也包含了 frameworks
相关代码。最终搜到这篇 博客 ,结合其他博客,最终完成功能

Android 10 自定义系统服务 安卓自定义系统服务 输出jar包

  • 该案例基于 rockchip 芯片开发,在 PX30 Android10 上进行的测试,在其他设备上大同小异,请自行查找或替换为对应的路径。
  • 实操过程中,可以在 AndroidStudio 中先编写好代码,检查代码中是否有语法错误,然后将代码拷贝到 frameworks 中,最后进行编译。
  • 该示例包名为 com.test.customservice

1. 编写代码

1.1 编写 AIDL ITestService.aidl文件

frameworks/base/test/java/com/test/customservice/ITestService.aidl

package com.test.customservice;

import android.os.Bundle;

interface ITestService {

     void setValue(int value);

     int getValue();

     void setBundle( in Bundle bundle);

     Bundle getBundle();
}

1.2 编写服务管理 TestServiceManager.java 文件

frameworks/base/test/java/com/test/customservice/TestServiceManager.java

package com.test.customservice;

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

import com.test.customservice.ITestService;

public class TestServiceManager {
    private static final String TAG = "TestServiceManager";
    private ITestService iTestService;

    public TestServiceManager(Context context, ITestService iTestService) {
        this.iTestService = iTestService;
    }


    public void setValue(int value) {
        try {
            iTestService.setValue(value);
        } catch (RemoteException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }
    }

    public int getValue() {
        try {
            return iTestService.getValue();
        } catch (RemoteException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }
        return 0;
    }

    public void setBundle(Bundle bundle) {
        try {
            iTestService.setBundle(bundle);
        } catch (RemoteException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }
    }

    public Bundle getBundle() {
        try {
            return iTestService.getBundle();
        } catch (RemoteException e) {
            Log.e(TAG, e.toString());
            e.printStackTrace();
        }
        return null;
    }
}

1.3 编写服务的实现 TestService.java 文件

frameworks/base/services/core/java/com/test/customservice/TestService.java

package com.test.customservice;

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

import com.test.customservice.ITestService;

public class TestService extends ITestService.Stub {
    public static final String TAG = "TestService";
    private Context mContext;

    public TestService(Context context){
        this.mContext = context;
    }
    @Override
    public void setValue(int value) throws RemoteException {
        Log.i(TAG, "set value is " + value);
    }

    @Override
    public int getValue() throws RemoteException {
        Log.i(TAG, "get value is default value 0");
        return 0;
    }

    @Override
    public void setBundle(Bundle bundle) throws RemoteException {
        Log.i(TAG, "set bundle is " + bundle.toString());
    }

    @Override
    public Bundle getBundle() throws RemoteException {
        Bundle bundle = new Bundle();
        Log.i(TAG, "get bundle is " + bundle);
        return bundle;
    }
}

1.4 编写 Android.mk 文件

此文件用于将自定义的 service 生成jar包

frameworks/base/test/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, java)

LOCAL_MODULE_CLASS := JAVA_LIBRARIES
include $(BUILD_JAVA_LIBRARY)


1.5 拷贝文件到 frameworks 指定目录

该步骤仅针对先在 AndroidStudio 中创建好 AIDL 和 java 文件的情况;如果你是直接在 frameworks 源码中创建的,请忽略本步骤。

  1. 拷贝 ITestService.aidlTestServiceManager.java
    + 在 frameworks/base 目录下创建子目录 test/java/com/test/customservice,
    + 将 ITestService.aidlTestServiceManager.java
    拷贝到 frameworks/base/test/java/com/test/customservice 路径下
  1. 拷贝 Android.mk
    + 将 Android.mk 拷贝到 frameworks/base/test 路径下,用来生成 jar 包,供第三方应用使用
  1. 拷贝 TestService.java
    + 在 frameworks/base/services/core/java/ 目录下创建子目录 com/test/customservice,
    由于 frameworks/base/services/core/java/com 目录已经创建,因此相当于在 frameworks/base/core/java/com
    创建 test/customservice 目录即可。
    + 将 TestService.java 拷贝到 frameworks/base/core/java/com/test/customservice 路径下

2. 配置

2.1 frameworks 引入创建的 AIDL 和 java 代码

编辑 frameworks/base/Android.bp 或者 frameworks/base/Android.mk 文件,配置自定义的 aidl 和 java 文件

java_library {
name: "framework",

    srcs: [
        "packages/services/PacProcessor/com/android/net/IProxyService.aidl",
        "packages/services/Proxy/com/android/net/IProxyCallback.aidl",
        "packages/services/Proxy/com/android/net/IProxyPortListener.aidl",
        "core/java/android/service/quicksettings/IQSService.aidl",
        "core/java/android/service/quicksettings/IQSTileService.aidl",
        
+        "test/java/**/*.java",
+        "test/java/com/test/customservice/ITestService.aidl",

    ],
    aidl: {
        export_include_dirs: [
            // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
            "core/java",
            "graphics/java",
            "location/java",
            "lowpan/java",
            "media/java",
            "media/mca/effect/java",
            "media/mca/filterfw/java",
            "media/mca/filterpacks/java",
            "drm/java",
            "opengl/java",
            "sax/java",
            "telecomm/java",
            "telephony/java",
            "wifi/java",
            "keystore/java",
            "rs/java",
+              "test/java",
        ],

}

2.2 编辑 device.mk 将 test 模块编译进 system 中

编辑 device/rockchip/rk3326/PX30_indpx30a/device-common.mk,增加以下内容


# add test service
PRODUCT_PACKAGES += \
    test
# add test service

2.3 将 test 模块加入到 framework

编辑 build/core/pathmap.mkFRAMEWORKS_BASE_SUBDIRS 中增加 test \

FRAMEWORKS_BASE_SUBDIRS := \
        $(addsuffix /java, \
            core \
            graphics \
            location \
            media \
            media/mca/effect \
            media/mca/filterfw \
            media/mca/filterpacks \
            drm \
            opengl \
            sax \
            telecomm \
            telephony \
            wifi \
            lowpan \
            keystore \
            rs \
+            test \
         )

2.4 编辑 Context.java

修改 frameworks/base/core/java/android/content/Context.java 增加 TEST_SERVICE 常量

    /**
     * Use with {@link #getSystemService(String)} to retrieve a {@link com.test.customservice.TestServiceManager} for test by the system.
     *
     * @see #getSystemService(String)
     * @see com.test.customservice.TestServiceManager
     */
    public static final String TEST_SERVICE = "test";

2.5 编辑 SystemServer.java

frameworks/base/services/java/com/android/server/SystemServer.javastartOtherServices() 方法中中增加服务,注意别漏掉 import 语句

import com.test.customservice.TestService;

***
    private void startOtherServices() {
    
    
***
        traceBeginAndSlog("Start Test Service");
        try {
            ServiceManager.addService(Context.TEST_SERVICE, new TestService(context));
        } catch (Throwable e) {
            reportWtf("starting TestService", e);
        }
        traceEnd();
        
***        
    }
    

2.6 编辑 SystemServiceRegistry.java 注册服务

frameworks/base/core/java/android/app/SystemServiceRegistry.java 中注册服务,注意别漏掉 import 语句

import com.test.customservice.ITestService;
import com.test.customservice.TestServiceManager;

***
    static {
***
        registerService(Context.TEST_SERVICE, TestServiceManager.class,
                new CachedServiceFetcher<TestServiceManager>() {
                    @Override
                    public TestServiceManager createService(ContextImpl ctx)
                            throws ServiceNotFoundException {
                        IBinder b = ServiceManager.getService(Context.TEST_SERVICE);
                        return new TestServiceManager(ctx,
                                ITestService.Stub.asInterface(b));
                    }});

***
    }

2.7 编辑 package_whitelist.txt 添加白名单

build/make/core/tasks/check_boot_jars/package_whitelist.txt 中最后一行增加

com\.test\.customservice\..*

2.8 编辑 hiddenapi-greylist-packages.txt 添加白名单

frameworks/base/config/hiddenapi-greylist-packages.txt 中最后一行增加

***
org.apache.xpath
org.apache.xpath.axes
org.apache.xpath.compiler
org.apache.xpath.domapi
org.apache.xpath.functions
org.apache.xpath.jaxp
org.apache.xpath.objects
org.apache.xpath.operations
org.apache.xpath.patterns
org.apache.xpath.res
org.ccil.cowan.tagsoup
org.ccil.cowan.tagsoup.jaxp
+ com.test.customservice

2.9 配置SELinux

  • device/rockchip/common/sepolicy/private/service_contexts 中加一行,其中 test 为 frameworks/base/core/java/android/content/Context.java 中增加的 TEST_SERVICE 的值
test                                                   u:object_r:test_service:s0
  • device/rockchip/common/sepolicy/vendor/service.te 中加一行
type test_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;

3. 编译验证

先执行 make update-api ,然后编译新固件,刷机后开机验证 ,
windows : adb shell service list | findstr "test" linux : adb shell service list | grep test
如果显示有 test: [com.test.customservice.ITestService] 证明 service 启动成功

4. 集成到应用并调用

自定义服务生成的 jar 包路径为 out/target/common/obj/JAVA_LIBRARIES/test_intermediates/classes.jar ,将其拷贝到 AndroidStudio 工程的 libs 目录,然后右击Add As Library 集成到工程中。

调用示例如下

package com.test.tempserviceclient;

import android.annotation.SuppressLint;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import com.test.customservice.TestServiceManager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        @SuppressLint("WrongConstant") TestServiceManager testServiceManager = (TestServiceManager) getSystemService("test");
        int value = testServiceManager.getValue();
        System.out.println(value);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 10 自定义系统服务接口给app调用 的相关文章

  • 如何在android中使用Ontouchevent突出显示此pdf页面

    这里我想使用android中的onTouchevent来突出显示这段文字 您可以使用 OnTouchListener 来获取事件的 x 和 y 然后将屏幕绘制为位图 并根据字母的左上角显示和字母的大小使用bitmap getPixel 看看
  • 测试权限和 Android 应用清单文件

    我想知道是否有办法添加某些权限 或任何东西 到 android 清单文件 但这样它仅在测试运行期间使用 不在生产期间使用 我正在寻找一些程序化的东西 而不是在测试时剪切和粘贴 这是上下文 我正在读这篇文章 http developer an
  • Android 2.1:如何轮询现有蓝牙连接的 RSSI 值?

    我需要知道使用 Android 2 1 手机与远程设备建立蓝牙连接的信号强度 从SDK中 我可以看到我可以在发现远程设备时确定RSSI 但我不知道如何随着时间的推移更新该 RSSI 值 有人可以帮我吗 谢谢 从 SDK 中这是获取 RSSI
  • 清单合并失败:属性 application@appComponentFactory

    一切都很好 但我正在尝试添加这个库https github com wdullaer MaterialDateTimePicker https github com wdullaer MaterialDateTimePicker有了这个 i
  • Android 重新启动我的 Activity

    我怎样才能做到这一点 单击按钮 mycontext finish 然后 重新开始 你可以尝试这个 MyActivity finish Intent intent new Intent MyActivity this MyActivity c
  • Android BuildConfig 字段错误生成字符串

    在开始新项目的最后一天 我在构建配置中创建了一些变量 作为在发布和调试构建之间单独处理它们的好习惯 如下所示 buildTypes release minifyEnabled false buildConfigField String PA
  • RxJava 相当于 orElse 是什么

    在其他语言的流 函数域中有一个常见的操作 那就是 orElse 它就像一个 if 当当前链没有得到任何结果时 它会更改为备用链 在具有 Maybe 类型的语言中 它基本上会继续 Some 类型的链或更改为 None 类型的 orElse 理
  • 使用 Android 将文件上传到 Django Web 服务

    我正在开发一个与 Django 后端交互的 Android 应用程序 我已经使用 mod wsgi 部署了 Web 服务 并且有许多 Web 服务调用可以工作并且已经过测试 所以我知道一切都应该工作 所有其他呼叫都工作正常 这是我在Andr
  • 对早期设备使用 Roboto 字体

    我想在我的 Android 应用程序中使用 Roboto 字体 并确保它适用于未安装该字体的早期版本的 Android 我知道我可以通过使用 Typeface createFromAsset 然后手动设置每个 TextViews Butto
  • 如何提高加速度计和指南针传感器的精度?

    我正在创建一个增强现实应用程序 当手机面向兴趣点 GPS 位置存储在手机上 时 它可以简单地可视化文本视图 文本视图绘制在屏幕中的兴趣点位置上 它工作正常 问题是指南针和加速度计非常 变体 并且文本视图由于传感器的准确性而不断左右上下移动
  • 在视图上按下按键时不会调用 onKeyDown

    我有一个包含两个视图的活动 一个视图重写 onDraw 并正确处理 onTouchEvent 但是当我尝试检索第二个视图的 onKeyDown 时 它没有给我任何结果 相反 当我按下后退按钮或任何其他键盘按钮时 会调用 onKeyDown
  • 谷歌gson LinkedTreeMap类转换为myclass

    我知道这个问题以前已经被问过 由于我对java和android的新手技能 我一个多星期都无法解决这个问题 我和我的一位朋友正在开发一个 Android 项目 其中有一些类似的事情 最奇怪的部分是 只有当我从 Google Play 商店下载
  • 字符串包含相同的字符但仍然不同[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个 txt 文件并使用每个句子作为团队的名称 同时使用该名称查找另一个 txt 文件以获取其内容 所有 txt 文件都位于我的资产文件夹的根目录中 第一个 txt 文件工作正常 我使用assetm
  • 消费者关闭了输入通道或发生错误。事件=0x8

    D AndroidRuntime 11752 D AndroidRuntime 11752 gt gt gt gt gt gt AndroidRuntime START com android internal os RuntimeInit
  • 如何:获取 AVD 的端口号并向其自身发送消息

    我该如何执行以下操作 获取我的 AVD 的端口号 从我的代码而不是命令行 使用步骤 1 中获得的端口号从 AVD 向自身发送消息 这是可能的 模拟器可以给自己发送短信吗 https stackoverflow com questions 8
  • 如何在真实设备上模拟来电? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 出于测试目的 我想在真实的 Andr
  • adb shell 的 BroadcastReceiver 权限

    考虑一个简单的工具 使用BroadcastReceiver实现一个简单的目标 因为这不应该被其他应用程序使用 所以它定义了一个保护级别为signature or signatureOrSystem
  • Robotium 和系统对话框

    当我尝试与蓝牙设备配对时 会出现带有 PIN 码的系统确认对话框 有 取消 和 确定 按钮 但我无法使用 Robotium 单击它们 如何在 Robotium 中使用 Android 操作系统对话框 谢谢 这对我有用 solo clickO
  • 安卓应用安全

    我想开发一个用户数据非常敏感的应用程序 我是开发新手 所以不确定以下内容 技术对于安全或高效来说是必要的 请留下您的评论 提前致谢 为了额外的安全性 我们可以避开市场 游戏商店 并将应用程序安装在个人设备上 它会让它更安全吗 我必须在设备上
  • 如何防止LRU缓存android中的内存不足错误

    我在我的 Android 应用程序中使用内存 LRU 缓存来缓存位图 但是在将某些位图加载到 LRU 映射中后 应用程序强制关闭并提示内存不足异常 我花了一整天的时间 但还没有找到解决方案 请任何人都可以帮助我 我严重陷入这个问题 提前致谢

随机推荐

  • oracle sql loader命令与ctl写法

    xfeff xfeff sql loader 的特点 oracle自己带了很多的工具可以用来进行数据的迁移 备份和恢复等工作 但是每个工具都有自己的特点 比如说exp和imp可以对数据库中的数据进行导出和导出的工作 xff0c 是一种很好的
  • 史上最全的字符串格式化方法,学这些就够用了

    一 思考 1 什么是字符串格式化 将变量 xff08 对象 xff09 的值填充到字符串中 在字符串中解析Python表达式 对字符串进行格式化显示 左对齐 右对齐 居中对齐保留数字有效位数 2 你学过的字符串格式化方式有哪些 字符串格式化
  • Linux实现黑客帝国效果,超级简单

    MATRIX是Linux的环境下黑客帝国风格的屏保 xff0c 绿色的字母在屏幕上刷刷如雨水落下 xff0c 偶尔看看能回忆起程序猿的黑客梦 首先要在网上找到CMATRIX安装包 xff0c 然后安装 xff0c 需要的话找柠檬班小米 xf
  • 10年互联网职场过来人给测试专业大学生的学习建议

    改进学习方法 xff0c 就如改进你的测试方法一样 不管你面临的是什么环境和挑战 xff0c 值得期许的 就值得去尝试 1 关于学习 在学校期间以专业课为主 xff0c 专业理论知识越扎实 xff0c 后期实践才越容易深入理解且上手更快 对
  • 使用 GitHub Copilot 自动化测试

    代码完成并不是什么新鲜事 像 IntelliSense 这样的工具已经允许开发人员通过尝试自动完成他们正在编写的函数或语句的名称来提高工作效率 xff0c 但是可用的工具只有一定程度的实际 智能 可用 随着 GitHub 的 Copilot
  • 想让你的接口自动化测试更加有效? 这个统计方法必须掌握

    覆盖率概念 接口自动化测试是现代软件开发中不可或缺的一环 xff0c 它能够帮助开发团队自动化执行测试用例 xff0c 以快速而准确地发现并修复软件缺陷 而覆盖率统计则是在测试执行完成后 xff0c 帮助测试团队了解哪些代码路径被覆盖了 x
  • 大小端字节序详解

    目录 引文 大小端介绍 xff08 1 xff09 什么是大端小端 xff08 2 xff09 为什么有大端和小端 xff08 3 xff09 笔试题讲解 引文 在开始正文之前 xff0c 我想先问一下大家 xff0c 内存中是怎样存放一个
  • 【C库函数】strcat函数详解

    目录 strcat 函数原型 参数讲解 返回值详解 函数讲解 xff08 1 xff09 源字符串和目标字符串都必须以 39 0 39 结束 xff08 2 xff09 目标空间必须足够大 xff0c 能容纳下源字符串的内容 xff08 3
  • CAN协议

    CAN xff08 Controller Area Network xff09 是一种常见的串行总线通信协议 xff0c 用于在汽车 工业控制和其他应用中传输数据 它是一种高效 可靠 安全的通信协议 xff0c 具有广泛的应用 下面是CAN
  • 串口协议简介

    串口协议是一种基于串行通信的数据传输协议 它通过串口接口将数据以串行的方式传输 串口协议通常包括物理层 数据链路层和应用层三个部分 xff0c 其中物理层主要定义了串口接口的电气特性 xff0c 数据链路层定义了数据的传输方式和错误检测机制
  • CAN协议总线仲裁原理:数据发送权争夺

    CAN总线仲裁原理是指在多个CAN节点同时发送数据时 xff0c 如何避免冲突 并选择一个节点作为发送者 CAN总线的仲裁原理基于一个分布式仲裁机制 xff0c 它可以快速而可靠地确定哪个节点可以获得总线控制权 xff0c 从而发送数据 C
  • Spring整合JMS(一)——基于ActiveMQ实现

    1 1 JMS简介 JMS的全称是Java Message Service xff0c 即Java消息服务 它主要用于在生产者和消费者之间进行消息传递 xff0c 生产者负责产生消息 xff0c 而消费者负责接收消息 把它应用到实际的业务需
  • getopt函数详解

    getopt 函数是C语言中一个常用的命令行参数解析函数 xff0c 它可以方便地解析命令行输入的参数 xff0c 以便程序对不同参数进行不同的处理 本文将详细讲解getopt 函数的使用方法和注意事项 xff0c 分点阐述如下 xff1a
  • UCOSIII

    UCOSIII简介 xff1a UCOSIII是MicroC OS III的改编版本 xff0c 主要是用于实时系统中的任务调度 xff0c 它是嵌入式系统中应用最广泛的操作系统之一 用函数说明 xff1a 1 OSInit 用于初始化UC
  • UCOSIII-任务创建-库函数

    创建任务 xff1a OSTaskCreate OS TCB amp StartTaskTCB 任务控制块 xff08 amp 传地址 xff09 CPU CHAR 34 start task 34 任务名字 xff08 可以随便写 xff
  • ucosiii-常用api

    uC OS III 提供了许多 API 函数 xff0c 可以根据需要选择使用 以下是一些常用的 uC OS III API 函数 xff1a 任务管理 API OSTaskCreate xff1a 创建一个新任务 xff1b OSTask
  • windows 清除 .git 文件夹

    有时我们需要将 git 管理项目中的 git文件夹删除 xff0c 但是如果项目太多 xff0c 一个一个手动删除太麻烦 xff0c 这时候可以用 bat 批处理文件删除 xff0c 具体操作如下 桌面 右击 新建文本文档 xff0c 此时
  • Your anti-virus program might be impacting your build performance.解决方案

    Your anti virus program might be impacting your build performance 解决方案 在使用 AndroidStudio 时 xff0c 经常会弹出框提示 xff1a Your ant
  • init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本

    Android 重启时执行 shell 脚本 init rc 执行 shell 脚本 最近有个需求 xff0c 需要生成系统的默认配置 xff0c 使得在系统开机后 xff0c 直接读取已经配置好的文件 当时想的解决方案是 xff0c 在编
  • android 10 自定义系统服务接口给app调用

    Android 安卓自定义系统服务 最近有个需求 xff0c 要增加系统服务 xff0c 生成第三方 jar 包提供给第三方应用调用 xff0c 而且 jar 包必须用特定的包名 xff0c 最后生成的 jar 包不能包含 framewor