Ahao's Technical Blog Ahao's Technical Blog
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

阿豪讲Framework

不积跬步无以至千里
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础篇

  • 玩转AOSP篇

  • 学穿Binder篇

    • 000.Binder 专题导学 —— 如何深入掌握 Binder
    • 001.学习 Binder 的预备知识
    • 002.Binder 基本原理
    • 003.Binder 程序示例之 C 语言篇
    • 004.Binder 服务注册过程情景分析之 C 语言篇
    • 005.Binder 服务获取与使用过程情景分析之C语言篇
    • 006.Android Binder 驱动框架设计与分析
    • 007.Binder 驱动情景分析之 ServiceManager 启动过程
    • 008.Binder 驱动情景分析之服务注册过程
    • 009.Binder 驱动情景分析之服务获取与使用过程
    • 010.Binder 程序示例之 C++ 篇
    • 011.Binder C++ 程序分析之主要类解析
    • 012.Binder 服务注册过程情景分析之 C++ 篇
    • 013.Binder 服务获取与使用过程情景分析之C++篇
    • 014.Binder 程序示例之 aidl-cpp 篇
    • 015.添加 Android Native 系统服务
    • 016.添加 Native 系统服务回调
    • 017.Binder 程序示例之 Java 篇
    • 018.Binder Java 层初始化
    • 019.Binder Java 层服务注册过程分析
    • 020.Binder Java 层服务获取与使用过程分析
    • 021.添加 Java 系统服务
      • 1. 编写 AIDL
      • 2. 将 AIDL 加入 Android.bp
      • 3. 定义 Binder 服务端类
      • 4. 开机启动服务
      • 5. selinux 配置
      • 6. 添加 Java 接口白名单
      • 7. 系统 App 使用系统服务
    • 022.Android Java 系统服务框架与第三方 App 使用自定义 Java 系统服务
    • 023.添加 Java 系统服务回调
    • 024.AIDL 数据类型详解之 Java 篇
    • 025.AIDL 数据类型详解之 C++ 篇
    • 026.Java 调用 Native 服务
    • 027.Native 调用 Java Binder 服务
    • 028.AIDL 关键字 in out inout oneway 解析
    • 029.Binder 驱动 Debug 入门指南
    • 030.Binder 匿名服务源码分析
    • 031.Binder 中的 Parcel 数据结构分析(C++)
    • 032.Binder 中的 Parcel 数据结构分析(Java)
    • 033.Binder 多线程情景分析
    • 034.Binder 线程池溢出问题
    • 035.Binder 代理对象泄露问题分析
    • 036.Binder 死亡通知情景分析
    • 037.Binder 异常处理机制
    • 038.Binder 系统源码演进
    • 039.Binder 面试题汇总
    • 补充——LocalService
  • 基础组件篇

  • 系统启动过程分析

  • Hal开发入门与实践

  • 显示系统

  • Framework
  • 学穿Binder篇
阿豪
2023-08-01
目录

021.添加 Java 系统服务

# 1. 编写 AIDL

在Binder 程序示例之 java 篇我们写了一个 Binder java 服务,不过需要我们手动去执行 Java 程序。今天我们就来看一下怎么添加一个在开机就自启动的 Java 系统服务。

在 frameworks/base/core/java 目录下创建如下的文件与文件夹:

com/yuandaima
└── IJavaHelloService.aidl
1
2

其中 IJavaHelloService.aidl 的内容如下:

package com.yuandaima;

interface IJavaHelloService
{
	void sayhello();
	int sayhello_to(String name);
}
1
2
3
4
5
6
7

AIDL 在我们自定义的 com/yuandaima 包结构下。

# 2. 将 AIDL 加入 Android.bp

接着修改 frameworks/base/Android.bp:

java_defaults {
    name: "framework-defaults",
    installable: true,

    srcs: [
        //......
        "core/java/com/yuandaima/IJavaHelloService.aidl"
    ]
    //......
}
1
2
3
4
5
6
7
8
9
10

# 3. 定义 Binder 服务端类

frameworks/base/services/core/java/com 目录下新建如下的目录与文件:

yuandaima
└── JavaHelloService.java
1
2

其中 JavaHelloService.java:

package com.yuandaima;

import android.util.Log;

public class JavaHelloService extends IJavaHelloService.Stub {
    private static final String TAG = "JavaHelloService";
    private int cnt1 = 0;
    private int cnt2 = 0;

    public void sayhello() throws android.os.RemoteException {
        cnt1++;
        Log.i(TAG, "sayhello : cnt = "+cnt1);
    }
    
    public int sayhello_to(java.lang.String name) throws android.os.RemoteException {
        cnt2++;
        Log.i(TAG, "sayhello_to "+name+" : cnt = "+cnt2);
        return cnt2;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 4. 开机启动服务

修改 frameworks/base/services/java/com/android/server/SystemServer.java 文件,在 startOtherServices 方法的最后增加以下代码:

//import 不要忘了
import com.yuandaima.JavaHelloService;


// add hello service
traceBeginAndSlog("JavaHelloService");
ServiceManager.addService("JavaHelloService", new JavaHelloService());
traceEnd();
1
2
3
4
5
6
7
8

# 5. selinux 配置

接着添加 selinux 配置:

同时修改 system/sepolicy/private 和 system/sepolicy/prebuilts/api/29.0/private 目录下的:

service.te:

type JavaHelloServiceType,          system_server_service, service_manager_type;
1

service_contexts:

JavaHelloService                          u:object_r:JavaHelloServiceType:s0
1

platform_app.te:

allow platform_app JavaHelloServiceType:service_manager find;
1

# 6. 添加 Java 接口白名单

我们新添加了 com/yuandaima Java 软件包,这些包需要在白名单中声明才能被上层 App 访问到:

在 build/make/core/tasks/check_boot_jars/package_whitelist.txt 中添加如下内容:

com\.yuandaima
com\.yuandaima\..*
1
2

# 7. 系统 App 使用系统服务

接着我们就可以在我们的系统 App 中使用我们的自定义的系统服务了:

修改我们在玩转 AOSP 之系统 App 源码添加 (opens new window)中添加的系统 App Demo:

Android.bp:

android_app {
    name: "FirstSystemApp",
    srcs: ["src/**/*.java"],
    resource_dirs: ["res"],
    manifest: "AndroidManifest.xml",
    platform_apis: true,
    sdk_version: "",
    certificate: "platform",
    //去掉 product_specific
    // product_specific: true,
    static_libs: ["androidx.appcompat_appcompat",
                 "com.google.android.material_material",
                 "androidx-constraintlayout_constraintlayout",
                 "lib-lottie"],
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

接着修改自定义 Product 配置文件 device/jelly/rice14/rice14.mk:


PRODUCT_PACKAGES += \
    # ......
    FirstSystemApp
 
PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \
    # ......
    /system/app/FirstSystemApp/FirstSystemApp.apk
1
2
3
4
5
6
7
8

修改 device/jelly/rice14/FirstSystemApp/src/com/yuandaima/firstsystemapp/MainActivity.java 源码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            IJavaHelloService service = IJavaHelloService.Stub.asInterface(ServiceManager.getService("JavaHelloService"));
            service.sayhello();
        } catch (Exception e) {
           e.printStackTrace();
        }
       
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

接着我们就可以重新编译系统,启动虚拟机了:

source build/envsetup.sh
# 自定义 Product rice14
lunch rice14-eng
# 更新一下 api
make api-stubs-docs-update-current-api
make -j32
emulator
1
2
3
4
5
6
7

接着我们就可以打开我们的 FirstSystemApp 了,然后查看 log:

020.Binder Java 层服务获取与使用过程分析
022.Android Java 系统服务框架与第三方 App 使用自定义 Java 系统服务

← 020.Binder Java 层服务获取与使用过程分析 022.Android Java 系统服务框架与第三方 App 使用自定义 Java 系统服务→

最近更新
01
如何调试 SurfaceFlinger
10-05
02
SurfaceFlinger 概述
10-05
03
HWC 接口分析
10-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 AHao Framework | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式