IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 11添加自定义service并提供jar包 -> 正文阅读

[移动开发]Android 11添加自定义service并提供jar包

环境

基于rk3566 android 11 系统

步骤

添加aidl文件

frameworks/base/core/java/android/os/IMyTestService.aidl

package android.os;
 
/**
 * @hide
 */
interface IMyTestService {
    void test();
}

添加service

frameworks/base/services/core/java/com/android/server/MyTestService.java

package com.android.server;
 
import android.util.Log;
import android.os.IMyTestService;
 
public class MyTestService extends IMyTestService.Stub {
	private static final String TAG = "MyTestService";
    public MyTestService() {}
    @Override
    public void test(){
        Log.i(TAG,"MyTestService test ...");
    }
}

将自定义的service添加到系统中

  1. 首先在Context中添加常量
--- a/frameworks/base/core/java/android/content/Context.java
+++ b/frameworks/base/core/java/android/content/Context.java
@@ -3494,6 +3494,7 @@ public abstract class Context {
             //@hide: TIME_ZONE_DETECTOR_SERVICE,
             PERMISSION_SERVICE,
             LIGHTS_SERVICE,
+            MY_TEST_SERVICE,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface ServiceName {}
@@ -5016,6 +5017,13 @@ public abstract class Context {
      */
     public static final String TIME_ZONE_RULES_MANAGER_SERVICE = "timezone";
 
+
+    /**
+     * custom service zhuw add 
+     * @hide
+     */
+    public static final String MY_TEST_SERVICE="my_test";
+
     /**
      * Use with {@link #getSystemService(String)} to retrieve a
      * {@link android.content.pm.CrossProfileApps} for cross profile operations.

  1. 在 frameworks/base/services/java/com/android/server/SystemServer.java文件中的startOtherServices方法中加上我们自己的服务
//zhuw add code start
+            try {
+                ServiceManager.addService(Context.MY_TEST_SERVICE, new MyTestService());
+            } catch (Throwable e) {
+                Slog.e(TAG, "Failure starting MyTest Service", e);
+            }
+           //zhuw add code end

添加manager

frameworks/base/core/java/android/app/MyTestManager.java

package android.app;
 
import android.annotation.NonNull;
import android.content.Context;
import android.os.IMyTestService;
import android.os.RemoteException;
 
public class MyTestManager {
    private IMyTestService mService;
 
    /**
     * @hide
     */
    public MyTestManager(@NonNull Context mContext, @NonNull IMyTestService service) {
        mService = service;
    }
 
    /**
     * @hide
     */
    public void test() {
        try {
            mService.test();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

将manager注册到系统

frameworks/base/core/java/android/app/SystemServiceRegistry.java

diff --git a/frameworks/base/core/java/android/app/SystemServiceRegistry.java b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
index e599a5c..243790d 100644
--- a/frameworks/base/core/java/android/app/SystemServiceRegistry.java
+++ b/frameworks/base/core/java/android/app/SystemServiceRegistry.java
@@ -43,6 +43,8 @@ import android.app.usage.IUsageStatsManager;
 import android.app.usage.NetworkStatsManager;
 import android.app.usage.StorageStatsManager;
 import android.app.usage.UsageStatsManager;
+import android.os.IMyTestService;//add code
+import android.app.MyTestManager;//add code
 import android.appwidget.AppWidgetManager;
 import android.bluetooth.BluetoothManager;
 import android.companion.CompanionDeviceManager;
@@ -1334,6 +1336,18 @@ public final class SystemServiceRegistry {
                         return new DreamManager(ctx);
                     }});
 
+        //custom service zhuw add begin
+        registerService(Context.MY_TEST_SERVICE, MyTestManager.class,
+                new CachedServiceFetcher<MyTestManager>() {
+                    @Override
+                    public MyTestManager createService(ContextImpl ctx)
+                            throws ServiceNotFoundException {
+                        IBinder b = MyTestManager.getServiceOrThrow(Context.MY_TEST_SERVICE);
+                        IMyTestService service = IMyTestService.Stub.asInterface(b);      
+                        return new MyTestManager(ctx.getOuterContext(),service);
+                    }});
+        //custom service zhuw add end
+
         sInitializing = true;
         try {
             // Note: the following functions need to be @SystemApis, once they become mainline

添加到系统中编译

  • 在Android 9 之前 是在frameworks/base/Android.mk中添加,后续已经移到了frameworks/base/Android.bp中
    像Android 10的时候只需要添加aidl文件即可
java_defaults {
    name: "framework-defaults",
    installable: true,

    srcs: [
        // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
        "core/java/**/*.java",
        ...省略代码...
        "core/java/android/app/IMyTestService.aidl",

到了Android 11 的时候又变了,我们添加的文件直接不用管,已经被包含进去了

filegroup {
    name: "framework-core-sources",
    srcs: [
        "core/java/**/*.java",
        "core/java/**/*.aidl",
    ],
    path: "core/java",
}

编译

build/envsetup.sh
lunch rk3566_r-userdebug //看自己平台配置
好像不需要执行 make update-api 直接使用./build.sh -KUAuo 就能编译出来

导出我们需要的jar包

  • 在out/target/common/obj/JAVA_LIBRARIES目录下找到framework-minus-apex_intermediates目录,11之前的好像是framework_intermediates目录 现在改成了这个framework-minus-apex_intermediates
  • 使用下面的命令生成jar
cd rk3566-11.0/out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates
jar -xvf classes.jar android/app/MyTestManager.class
jar -cvf 3566_smatek.jar android

framework-minus-apex_intermediates

最后导入jar包使用即可

如果报下面这个错误,则需要导入平台的系统签名

java.lang.NoSuchMethodError: No virtual method test()V in class Landroid/app/MyTestManager; or its super classes (declaration of 'android.app.MyTestManager' appears in /system/framework/framework.jar)

有用请点赞,谢谢观看

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:49:24  更:2021-11-11 12:50:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:26:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码