rk3566 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添加到系统中
首先在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.

在 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",

1
2
3
4
5
6
7
8
9
到了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 就能编译出来
1
2
3
导出我们需要的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
1
2
3

最后导入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)
1
补充说明
framework_intermediates目录下其实有生成jar包,但方法实现为空,上面framework-minus-apex_intermediates中提取的jar 必须要系统签名才能使用.因此 可以尝试在修改下面的文件编译系统之后再从framework_intermediates中提取jar包

diff --git a/art/runtime/class_linker.cc b/art/runtime/class_linker.cc
index c39c5be…13227b8 100644
— a/art/runtime/class_linker.cc
+++ b/art/runtime/class_linker.cc
@@ -8704,7 +8704,7 @@ ArtMethod* ClassLinker::FindResolvedMethod(ObjPtrmirror::Class klass,
hiddenapi::ShouldDenyAccessToMember(resolved,
hiddenapi::AccessContext(class_loader, dex_cache),
hiddenapi::AccessMethod::kLinking)) {

  • resolved = nullptr;
  • //resolved = nullptr;
    }
    if (resolved != nullptr) {
    // In case of jmvti, the dex file gets verified before being registered, so first
    @@ -8840,7 +8840,14 @@ ArtMethod* ClassLinker::ResolveMethod(uint32_t method_idx,
    // If we had a method, or if we can find one with another lookup type,
    // it’s an incompatible-class-change error.
    if (resolved == nullptr) {
  •  resolved = FindIncompatibleMethod(klass, dex_cache.Get(), class_loader.Get(), method_idx);
    
  •  //resolved = FindIncompatibleMethod(klass, dex_cache.Get(), class_loader.Get(), method_idx);
    
  •  if (klass->IsInterface()) {
    
  •    resolved = klass->FindClassMethod(dex_cache.Get(), method_idx, pointer_size);
    
  •  } else {
    
  •    // If there was an interface method with the same signature,
    
  •    // we would have found it also in the "copied" methods.
    
  •    DCHECK(klass->FindInterfaceMethod(dex_cache.Get(), method_idx, pointer_size) == nullptr);
    
  •  }
    
    }
    if (resolved != nullptr) {
    ThrowIncompatibleClassChangeError(type, resolved->GetInvokeType(), resolved, referrer);
    @@ -8882,7 +8889,7 @@ ArtMethod* ClassLinker::ResolveMethodWithoutInvokeType(uint32_t method_idx,
    resolved,
    hiddenapi::AccessContext(class_loader.Get(), dex_cache.Get()),
    hiddenapi::AccessMethod::kLinking)) {
  • resolved = nullptr;
  • //resolved = nullptr;
    }
    return resolved;
    }
    @@ -8983,7 +8990,7 @@ ArtField* ClassLinker::FindResolvedField(ObjPtrmirror::Class klass,
    hiddenapi::ShouldDenyAccessToMember(resolved,
    hiddenapi::AccessContext(class_loader, dex_cache),
    hiddenapi::AccessMethod::kLinking)) {
  • resolved = nullptr;
  • //resolved = nullptr;
    }

if (resolved != nullptr) {
@@ -9010,7 +9017,7 @@ ArtField* ClassLinker::FindResolvedFieldJLS(ObjPtrmirror::Class klass,
hiddenapi::ShouldDenyAccessToMember(resolved,
hiddenapi::AccessContext(class_loader, dex_cache),
hiddenapi::AccessMethod::kLinking)) {

  • resolved = nullptr;
  • //resolved = nullptr;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

android framework

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

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

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

打赏作者

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

抵扣说明:

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

余额充值