A13的自定义系统服务终于编译成功,他的编译机制和A10 A12(未验证)不同的。集成方式都一样,但是配置编译规则真是一路坎坷。接下来我们总结下A13自定义系统服务的开始流程
一 创建AIDL文件
为了看起来符合代码结构合理,我们要顺着framework/base 架构来添加
在framework/base/core/java/android/flyscale(新建目录)下,创建FlyscaleManager.java,IFlyscaleManager.aidl。
内容如下:
From f975fdceb462417f5aea891419e2d363054fc440 Mon Sep 17 00:00:00 2001
From: admin <bianjb@xxx.cn>
Date: Fri, 21 Mar 2025 10:25:04 +0800
Subject: [PATCH] 自定义系统服务
Change-Id: Ifeeae14c44cd73af7fcf5f843ffb6f1fb0c8ac26
---
diff --git a/core/java/android/flyscale/FlyscaleManager.java b/core/java/android/flyscale/FlyscaleManager.java
new file mode 100644
index 0000000..9d40c4f
--- /dev/null
+++ b/core/java/android/flyscale/FlyscaleManager.java
@@ -0,0 +1,41 @@
+package android.flyscale;
+/**
+ * Created by bian on 2019/5/17.
+ */
+import android.content.Context;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.annotation.SystemService;
+import android.util.Log;
+// import android.flyscale.IFlyscaleManager;
+//import com.android.server.flyscale.FlyscaleService;
+
+
+import java.util.Arrays;
+@SystemService(Context.FLYSCALE_SERVICE)
+public class FlyscaleManager {
+ public static final String FLYSCALE_SERVICE = "flyscale";
+ private static final String TAG = "FlyscaleManager";
+ private Context mContext;
+
+ private IFlyscaleManager mService;
+
+ public FlyscaleManager(Context context,IFlyscaleManager service){
+ if(service==null){
+ Log.e(FLYSCALE_SERVICE,"Construct service is null");
+ }
+ this.mContext = context;
+ this.mService = service;
+ }
+
+
+ public String getImei(){
+ Log.i(TAG, "getIMEI");
+ try {
+ return this.mService.getImei();
+ } catch(RemoteException e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+}
diff --git a/core/java/android/flyscale/IFlyscaleManager.aidl b/core/java/android/flyscale/IFlyscaleManager.aidl
new file mode 100644
index 0000000..08a5ca9
--- /dev/null
+++ b/core/java/android/flyscale/IFlyscaleManager.aidl
@@ -0,0 +1,8 @@
+package android.flyscale;
+
+/**
+ * @hide
+ */
+interface IFlyscaleManager {
+ String getImei();
+}
\ No newline at end of file
二我们要注册该服务:
理论自己找资料理解,我这边只是做操作说明:
From 5b540d9de77858e33887ce4325650b78ef2b6ed2 Mon Sep 17 00:00:00 2001
From: admin <bianjb@xxx.cn>
Date: Thu, 20 Mar 2025 16:31:47 +0800
Subject: [PATCH] 自定义系统服务
Change-Id: I66ac289c04d3dd0feceedd062f91890e9f591b9e
---
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index c62089d..b263ef0 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -1,5 +1,5 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
+
+/* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -253,8 +253,8 @@
import java.util.Map;
import java.util.Objects;
-//import android.flyscale.FlyscaleManager;
-
+import android.flyscale.FlyscaleManager;
+import android.flyscale.IFlyscaleManager;
/**
* Manages all of the system services that can be returned by {@link Context#getSystemService}.
* Used by {@link ContextImpl}.
@@ -1533,13 +1533,17 @@
}
});
- // registerService(Context.FLYSCALE_SERVICE, FlyscaleManager.class,
- // new CachedServiceFetcher<FlyscaleManager>() {
- // @Override
- // public FlyscaleManager createService(ContextImpl ctx) {
- // return new FlyscaleManager();
- // }
- // });
+ registerService(Context.FLYSCALE_SERVICE, FlyscaleManager.class,
+ new CachedServiceFetcher<FlyscaleManager>() {
+ @Override
+ public FlyscaleManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ IBinder iBinder = ServiceManager.getServiceOrThrow(
+ Context.FLYSCALE_SERVICE);
+ IFlyscaleManager service = IFlyscaleManager.Stub.asInterface(iBinder);
+ return new FlyscaleManager(ctx,service);
+ }
+ });
registerService(Context.AMBIENT_CONTEXT_SERVICE, AmbientContextManager.class,
new CachedServiceFetcher<AmbientContextManager>() {
diff --git a/services/core/java/com/android/server/flyscale/FlyscaleService.java b/services/core/java/com/android/server/flyscale/FlyscaleService.java
index ceb605d..da8651c 100644
--- a/services/core/java/com/android/server/flyscale/FlyscaleService.java
+++ b/services/core/java/com/android/server/flyscale/FlyscaleService.java
@@ -1,9 +1,7 @@
package com.android.server.flyscale;
-/**
- * Created by bian on 2019/5/29.
- */
-//import android.flyscale.IFlyscaleManager;
-//import android.flyscale.IFlyscaleManager.Stub;
+
+import android.flyscale.IFlyscaleManager;
+import android.flyscale.IFlyscaleManager.Stub;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
@@ -27,33 +25,25 @@
import java.io.FileNotFoundException;
import java.io.FileReader;
import android.text.TextUtils;
+import android.os.RemoteException;
import android.telephony.TelephonyManager;
import android.telephony.SubscriptionManager;
-public class FlyscaleService /**extends IFlyscaleManager.Stub**/ {
+
+/**
+ * @hide
+ */
+public class FlyscaleService extends IFlyscaleManager.Stub {
private final boolean DEBUG = true;
private static final String TAG = "FlyscaleService";
private Context mContext;
- private IPowerManager mIPowerManager;
private TelephonyManager mTelephonyManager;
public FlyscaleService(Context context) {
this.mContext = context;
this.mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
}
+
+ @Override
+ public String getImei() throws RemoteException{
+ return mTelephonyManager.getImei();
}
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 0021812..b9fb194 100755
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1612,13 +1612,13 @@
//lijp add flyscaleService
+ t.traceBegin("StartFlyscaleService");
+ try {
+ ServiceManager.addService(Context.FLYSCALE_SERVICE, new FlyscaleService(context));
+ } catch (Throwable e) {
+ Slog.e(TAG, "Failure to add FlyscaleService", e);
+ }
+ t.traceEnd();
三编译:
如果你添加完了,长舒一口气。那么抱歉,你开心的太早了。这样编译是有问题的。异常日志如下:
看到以上异常,我相信你想的和我一样。在bp文件中显式增加这两个新增文件路径,参与编译就可以了。恭喜你,答错了,错误如下:
[ 86% 5580/6437] //frameworks/base:api-stubs-docs-non-updatable metalava merged [common]
FAILED: out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable-stubs.srcjar out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable_annotations.zip out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable_api.txt out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable_removed.txt out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api_lint.timestamp out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api_lint_report.txt out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/check_last_released_api.timestamp out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/last_released_baseline.txt
out/host/linux-x86/bin/sbox --sandbox-path out/soong/.temp --output-dir out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava --manifest out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava.sbox.textproto --write-if-changed
The failing command was run inside an sbox sandbox in temporary directory
out/soong/.temp/sbox/49a7cc33d80847891abf538139e05268e1581b41
The failing command line can be found in
out/soong/.temp/sbox/49a7cc33d80847891abf538139e05268e1581b41/sbox_command.0.bash
2025/03/25 09:18:56 "android/app/IFlyscaleManager.java" found in both "./out/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/gen/aidl/aidl0.srcjar" and "./out/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/gen/aidl/aidl33.srcjar"
exit status 1
[ 86% 5581/6437] //frameworks/base:system-api-stubs-docs-non-updatable metalava merged [common]
FAILED: out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/api_lint.timestamp out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/api_lint_baseline.txt out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/api_lint_report.txt out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/check_last_released_api.timestamp out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/last_released_baseline.txt out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/system-api-stubs-docs-non-updatable-stubs.srcjar out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/system-api-stubs-docs-non-updatable_annotations.zip out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/system-api-stubs-docs-non-updatable_api.txt out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava/system-api-stubs-docs-non-updatable_removed.txt
out/host/linux-x86/bin/sbox --sandbox-path out/soong/.temp --output-dir out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava --manifest out/soong/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/metalava.sbox.textproto --write-if-changed
The failing command was run inside an sbox sandbox in temporary directory
out/soong/.temp/sbox/fda0b18ffaf5729df6b6844505ba957a1d7c0612
The failing command line can be found in
out/soong/.temp/sbox/fda0b18ffaf5729df6b6844505ba957a1d7c0612/sbox_command.0.bash
2025/03/25 09:18:56 "android/app/IFlyscaleManager.java" found in both "./out/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl0.srcjar" and "./out/.intermediates/frameworks/base/system-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl33.srcjar"
exit status 1
[ 86% 5582/6437] //frameworks/base:module-lib-api-stubs-docs-non-updatable metalava merged [common]
FAILED: out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/api_lint.timestamp out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/api_lint_baseline.txt out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/api_lint_report.txt out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/check_last_released_api.timestamp out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/last_released_baseline.txt out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/module-lib-api-stubs-docs-non-updatable-stubs.srcjar out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/module-lib-api-stubs-docs-non-updatable_annotations.zip out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/module-lib-api-stubs-docs-non-updatable_api.txt out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/module-lib-api-stubs-docs-non-updatable_removed.txt
out/host/linux-x86/bin/sbox --sandbox-path out/soong/.temp --output-dir out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava --manifest out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava.sbox.textproto --write-if-changed
The failing command was run inside an sbox sandbox in temporary directory
out/soong/.temp/sbox/94ee1d5d0f8f74a52dd5f8aab9bb38f10d72e8d4
The failing command line can be found in
out/soong/.temp/sbox/94ee1d5d0f8f74a52dd5f8aab9bb38f10d72e8d4/sbox_command.0.bash
2025/03/25 09:18:56 "android/app/IFlyscaleManager.java" found in both "./out/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl0.srcjar" and "./out/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl33.srcjar"
exit status 1
[ 86% 5583/6437] //frameworks/base:unisoc-hidden-api-stubs-docs metalava merged [common]
FAILED: out/soong/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/metalava/unisoc-hidden-api-stubs-docs-stubs.srcjar out/soong/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/metalava/unisoc-hidden-api-stubs-docs_annotations.zip out/soong/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/metalava/unisoc-hidden-api-stubs-docs_api.txt out/soong/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/metalava/unisoc-hidden-api-stubs-docs_removed.txt
out/host/linux-x86/bin/sbox --sandbox-path out/soong/.temp --output-dir out/soong/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/metalava --manifest out/soong/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/metalava.sbox.textproto --write-if-changed
The failing command was run inside an sbox sandbox in temporary directory
out/soong/.temp/sbox/164f7555885930b9e4f261c6b397cbac83635fbd
The failing command line can be found in
out/soong/.temp/sbox/164f7555885930b9e4f261c6b397cbac83635fbd/sbox_command.0.bash
2025/03/25 09:18:57 "android/app/IFlyscaleManager.java" found in both "./out/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/gen/aidl/aidl0.srcjar" and "./out/.intermediates/frameworks/base/unisoc-hidden-api-stubs-docs/android_common/gen/aidl/aidl33.srcjar"
exit status 1
[ 86% 5584/6437] //frameworks/base:test-api-stubs-docs-non-updatable metalava merged [common]
FAILED: out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava/api_lint.timestamp out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava/api_lint_baseline.txt out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava/api_lint_report.txt out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava/test-api-stubs-docs-non-updatable-stubs.srcjar out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava/test-api-stubs-docs-non-updatable_annotations.zip out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava/test-api-stubs-docs-non-updatable_api.txt out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava/test-api-stubs-docs-non-updatable_removed.txt
out/host/linux-x86/bin/sbox --sandbox-path out/soong/.temp --output-dir out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava --manifest out/soong/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/metalava.sbox.textproto --write-if-changed
The failing command was run inside an sbox sandbox in temporary directory
out/soong/.temp/sbox/527f07ce76765305ed063facf37e64a41e780f43
The failing command line can be found in
out/soong/.temp/sbox/527f07ce76765305ed063facf37e64a41e780f43/sbox_command.0.bash
2025/03/25 09:18:57 "android/app/IFlyscaleManager.java" found in both "./out/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl0.srcjar" and "./out/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl33.srcjar"
exit status 1
09:18:57 ninja failed with: exit status 1
#### failed to build some targets (06:31 (mm:ss)) ####
===============BUILD TIME ANALYSIS===============
[ninja regen reason]
1: status: out/build-ums9158_1h10_native-package.ninja is missing, regenerating...
2: status: out/build-ums9158_1h10_native-cleanspec.ninja is missing, regenerating...
3: status: out/build-ums9158_1h10_native.ninja is missing, regenerating...
[total build time 0:07:11 (hh:mm:ss)]
bsp build time: 0:00:41(9.50%)
android build time: 0:06:30(90.50%)
[android build]regen: 0:06:30(100.00%)
[android build]real build: 0:00:00(0.00%)
[android build time details]
startup: 40.54ms(0.01%)
find modules: 74.64ms(0.02%)
[total]path: 236.89ms(0.05%)
[total]dumpvars: 11,517.25ms(2.67%)
[total][soong]blueprint bootstrap: 95.45ms(0.02%)
[total][soong]environment check: 0.02ms(0.00%)
[total][soong]bpglob: 172.94ms(0.04%)
[total][soong]bootstrap: 84,758.80ms(19.65%)
[total]soong: 85,027.84ms(19.71%)
[total]kati cleanspec: 11,111.67ms(2.58%)
[total][kati build]clean copy headers: 0.05ms(0.00%)
[total][kati build]clean old installed files: 0.04ms(0.00%)
[total]kati build: 106,825.22ms(24.76%)
[total]kati package: 58.72ms(0.01%)
[total]ninja: 175,507.98ms(40.68%)
[total]dist: 0.01ms(0.00%)
total: 390,286.33ms(90.46%)
upload_metrics: 0.01ms(0.00%)
[build command]
build/soong/soong_ui.bash --make-mode update-api
===============BUILD TIME ANALYSIS===============
以上日志中,有如下关键信息
The failing command line can be found in
out/soong/.temp/sbox/527f07ce76765305ed063facf37e64a41e780f43/sbox_command.0.bash
2025/03/25 09:18:57 "android/app/IFlyscaleManager.java" found in both "./out/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl0.srcjar" and "./out/.intermediates/frameworks/base/test-api-stubs-docs-non-updatable/android_common/gen/aidl/aidl33.srcjar"
exit status 1
aidl生成的类在两个地方出现,也是失败的
以上两个现象分析,说明系统默认是编译了新增的aidl文件,但是自己的类找不到,如果显示增加编译那就重复。接下来怎么办呢?
四编译问题的解决:
参考其他系统服务的编译规则:
1)在aidl同目录下增加Android.bp文件
package {
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "frameworks_base_license"
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
default_applicable_licenses: ["frameworks_base_license"],
}
filegroup {
name: "framework-flyscale-sources",
srcs: [
"**/*.java",
"**/*.aidl",
],
visibility: ["//frameworks/base"],
}
如上,将java 和aidl文件都包含进去,记住上面的名字framework-flyscale-sources 后面我们会用到
2)删除系统默认编译:
//framework/base/core/java/Android.bp
package {
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "frameworks_base_license"
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
// SPDX-license-identifier-BSD
// legacy_unencumbered
default_applicable_licenses: ["frameworks_base_license"],
}
filegroup {
name: "framework-core-sources",
srcs: [
"**/*.java",
"**/*.aidl",
],
exclude_srcs: [
// Remove election toolbar code from build time
"android/service/selectiontoolbar/*.aidl",
"android/service/selectiontoolbar/*.java",
"android/view/selectiontoolbar/*.aidl",
+"android/flyscale/*.java",
+"android/flyscale/*.aidl",
"android/view/selectiontoolbar/*.java",
"com/android/internal/widget/floatingtoolbar/RemoteFloatingToolbarPopup.java",
],
visibility: ["//frameworks/base"],
}
filegroup {
name: "IKeyAttestationApplicationIdProvider.aidl",
srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"],
}
。。。。。。省略
3)我们不让系统默认编译新增的文件,那么我们要显示的加入到编译中,修改如下:
framework/base/Android.bp下
//............hulue
filegroup {
name: "framework-non-updatable-sources",
srcs: [
// Java/AIDL sources under frameworks/base
":framework-annotations",
":framework-blobstore-sources",
":framework-core-sources",
":framework-drm-sources",
":framework-graphics-nonupdatable-sources",
":framework-jobscheduler-sources", // jobscheduler is not a module for R
":framework-keystore-sources",
":framework-identity-sources",
":framework-location-sources",
+ ":framework-flyscale-sources",
":framework-lowpan-sources",
":framework-mca-effect-sources",
":framework-mca-filterfw-sources",
":framework-mca-filterpacks-sources",
":framework-media-non-updatable-sources",
":framework-mms-sources",
":framework-omapi-sources",
":framework-opengl-sources",
":framework-rs-sources",
":framework-sax-sources",
":framework-telecomm-sources",
":framework-telephony-common-sources",
":framework-telephony-sources",
":framework-vcn-util-sources",
":framework-wifi-annotations",
":framework-wifi-non-updatable-sources",
":PacProcessor-aidl-sources",
":ProxyHandler-aidl-sources",
":net-utils-framework-common-srcs",
//.....................hulue
现在可以笑了。重新编译记得clean 这样就编译通过了!
亲测可用~
在坑里爬了好久,在此记录~