自定义服务
Step1(定义AIDL)
路径
frameworks/base/core/java/android/app
注意点
创建aidl 注意添加@hide
代码
package android.app;
/** {@hide} */
interface ILeoManger {
String request(String msg);
}
Step2(Contenxt 添加字段)
路径
frameworks/base/core/java/android/content/Context.java
添加自定义字段
public static final String ACTIVITY_SERVICE = "activity";
public static final String LEO_SERVICE = "leo";//自定义的字段
代码
/** @hide */
@StringDef(suffix = { "_SERVICE" }, value = {
POWER_SERVICE,
//@hide: POWER_STATS_SERVICE,
WINDOW_SERVICE,
LAYOUT_INFLATER_SERVICE,
ACCOUNT_SERVICE,
ACTIVITY_SERVICE,
LEO_SERVICE,//自定义的添加
ALARM_SERVICE,
NOTIFICATION_SERVICE,
ACCESSIBILITY_SERVICE,
CAPTIONING_SERVICE,
KEYGUARD_SERVICE,
LOCATION_SERVICE,
//@hide: COUNTRY_DETECTOR,
SEARCH_SERVICE,
SENSOR_SERVICE,
SENSOR_PRIVACY_SERVICE,
STORAGE_SERVICE,
STORAGE_STATS_SERVICE,
WALLPAPER_SERVICE,
TIME_ZONE_RULES_MANAGER_SERVICE,
VIBRATOR_MANAGER_SERVICE,
VIBRATOR_SERVICE,
//@hide: STATUS_BAR_SERVICE,
CONNECTIVITY_SERVICE,
PAC_PROXY_SERVICE,
VCN_MANAGEMENT_SERVICE,
//@hide: IP_MEMORY_STORE_SERVICE,
IPSEC_SERVICE,
VPN_MANAGEMENT_SERVICE,
TEST_NETWORK_SERVICE,
//@hide: UPDATE_LOCK_SERVICE,
//@hide: NETWORKMANAGEMENT_SERVICE,
NETWORK_STATS_SERVICE,
//@hide: NETWORK_POLICY_SERVICE,
WIFI_SERVICE,
WIFI_AWARE_SERVICE,
WIFI_P2P_SERVICE,
WIFI_SCANNING_SERVICE,
//@hide: LOWPAN_SERVICE,
//@hide: WIFI_RTT_SERVICE,
//@hide: ETHERNET_SERVICE,
WIFI_RTT_RANGING_SERVICE,
NSD_SERVICE,
AUDIO_SERVICE,
AUTH_SERVICE,
FINGERPRINT_SERVICE,
//@hide: FACE_SERVICE,
BIOMETRIC_SERVICE,
MEDIA_ROUTER_SERVICE,
TELEPHONY_SERVICE,
TELEPHONY_SUBSCRIPTION_SERVICE,
CARRIER_CONFIG_SERVICE,
EUICC_SERVICE,
//@hide: MMS_SERVICE,
TELECOM_SERVICE,
CLIPBOARD_SERVICE,
INPUT_METHOD_SERVICE,
TEXT_SERVICES_MANAGER_SERVICE,
TEXT_CLASSIFICATION_SERVICE,
APPWIDGET_SERVICE,
//@hide: VOICE_INTERACTION_MANAGER_SERVICE,
//@hide: BACKUP_SERVICE,
REBOOT_READINESS_SERVICE,
ROLLBACK_SERVICE,
DROPBOX_SERVICE,
//@hide: DEVICE_IDLE_CONTROLLER,
//@hide: POWER_WHITELIST_MANAGER,
DEVICE_POLICY_SERVICE,
UI_MODE_SERVICE,
DOWNLOAD_SERVICE,
NFC_SERVICE,
BLUETOOTH_SERVICE,
//@hide: SIP_SERVICE,
USB_SERVICE,
LAUNCHER_APPS_SERVICE,
//@hide: SERIAL_SERVICE,
//@hide: HDMI_CONTROL_SERVICE,
INPUT_SERVICE,
DISPLAY_SERVICE,
//@hide COLOR_DISPLAY_SERVICE,
USER_SERVICE,
RESTRICTIONS_SERVICE,
APP_OPS_SERVICE,
ROLE_SERVICE,
//@hide ROLE_CONTROLLER_SERVICE,
CAMERA_SERVICE,
//@hide: PLATFORM_COMPAT_SERVICE,
//@hide: PLATFORM_COMPAT_NATIVE_SERVICE,
PRINT_SERVICE,
CONSUMER_IR_SERVICE,
//@hide: TRUST_SERVICE,
TV_INPUT_SERVICE,
//@hide: TV_TUNER_RESOURCE_MGR_SERVICE,
//@hide: NETWORK_SCORE_SERVICE,
USAGE_STATS_SERVICE,
MEDIA_SESSION_SERVICE,
MEDIA_COMMUNICATION_SERVICE,
BATTERY_SERVICE,
JOB_SCHEDULER_SERVICE,
//@hide: PERSISTENT_DATA_BLOCK_SERVICE,
//@hide: OEM_LOCK_SERVICE,
MEDIA_PROJECTION_SERVICE,
MIDI_SERVICE,
RADIO_SERVICE,
HARDWARE_PROPERTIES_SERVICE,
//@hide: SOUND_TRIGGER_SERVICE,
SHORTCUT_SERVICE,
//@hide: CONTEXTHUB_SERVICE,
SYSTEM_HEALTH_SERVICE,
//@hide: INCIDENT_SERVICE,
//@hide: INCIDENT_COMPANION_SERVICE,
//@hide: STATS_COMPANION_SERVICE,
COMPANION_DEVICE_SERVICE,
CROSS_PROFILE_APPS_SERVICE,
//@hide: SYSTEM_UPDATE_SERVICE,
//@hide: TIME_DETECTOR_SERVICE,
//@hide: TIME_ZONE_DETECTOR_SERVICE,
PERMISSION_SERVICE,
LIGHTS_SERVICE,
//@hide: PEOPLE_SERVICE,
//@hide: DEVICE_STATE_SERVICE,
//@hide: SPEECH_RECOGNITION_SERVICE,
UWB_SERVICE,
MEDIA_METRICS_SERVICE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceName {}
Step3(创建自定义Manger)
路径
frameworks/base/core/java/android/app
代码
注意点
-
构造函数添加{@hide}
-
getService 添加{@hide}
-
request方法上方 添加 @Nullable 方法上添加 @Nullable 不加会报错
-
导入是annotation的Nullable 不是androidx
-
ILeoMangerSingleton 添加@UnsupportedAppUsage
package android.app;
import android.annotation.Nullable;
import android.annotation.SystemService;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Singleton;
@SystemService(Context.LEO_SERVICE)
public class LeoManger {
private Context mContext;
/**
* {@hide}
*/
public LeoManger() {
}
/**
* {@hide}
*/
public static ILeoManger getService() {
return ILeoMangerSingleton.get();
}
@Nullable
public String request(@Nullable String msg) {
try {
return getService().request(msg);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
@UnsupportedAppUsage
private static final Singleton<ILeoManger> ILeoMangerSingleton = new Singleton<ILeoManger>() {
@Override
protected ILeoManger create() {
final IBinder service = ServiceManager.getService(Context.LEO_SERVICE);
final ILeoManger m = ILeoManger.Stub.asInterface(service);
return m;
}
};
}
Step4(创建自定义Service)
路径
frameworks/base/services/core/java/com/android/service/
注意点
- 新建包名leo
- 一定要导入 import android.app.ILeoManger; 不然会提示Stub 找不到
代码
package com.android.server.leo;
import android.os.RemoteException;
import android.app.ILeoManger;
import android.annotation.Nullable;
public class LeoMangerService extends ILeoManger.Stub {
@Override
public String request(String msg) throws RemoteException {
return "LeoMangerService 收到数据-->" + msg;
}
}
小技巧
新建项目 ,建同级包名,android/app ,直接引入AIDL ,避免写的痛苦
Step5(自定义ServiceManager注册)
路径
frameworks/base/services/java/com/android/server/SystemServer.java
代码
import com.android.server.leo.LeoMangerService;
private void startOtherServices(@NonNull TimingsTraceAndSlog t){
...
//添加自定义service
ServiceManager.addService(Context.LEO_SERVICE,new LeoMangerService());
}
Step6 (SystemServiceRegistry注册Manger)
路径
frameworks/base/core/java/android/app/SystemServiceRegistry
//静态代码块里添加
static {
//添加自定义service Leo
registerService(Context.LEO_SERVICE, LeoManger.class, new CachedServiceFetcher<LeoManger>() {
@Override
public LeoManger createService(ContextImpl ctx) throws ServiceNotFoundException {
return new LeoManger();
}
});
//CHECKSTYLE:OFF IndentationCheck
registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
new CachedServiceFetcher<AccessibilityManager>() {
@Override
public AccessibilityManager createService(ContextImpl ctx) {
return AccessibilityManager.getInstance(ctx);
}
});
.....
}
Step7 (SElinux配置)
路径
system/sepolicy/prebuilts/api/31.0/private/
system/sepolicy/private
注意点
两个文件要一模一样
修改文件
service.te
service_contexts
untrusted_app_all.te
修改
service.te--->
#配置自定义服务类型
type leo_service, app_api_service,ephemeral_app_api_service,system_server_service,service_manager_type;
service_contexts
accessibility u:object_r:accessibility_service:s0
account u:object_r:account_service:s0
activity u:object_r:activity_service:s0
#配置自定义服务selinux角色
leo u:object_r:leo_service:s0
untrusted_app_all.te
# Allow signalling simpleperf domain, which is the domain that the simpleperf
# profiler runs as when executed by the app. The signals are used to control
# the profiler (which would be profiling the app that is sending the signal).
allow untrusted_app_all simpleperf:process signal;
#允许所有app 使用自定义服务
allow untrusted_app_all leo_service:service_manager find;
Step8 (编译更新)
make update-api
m
刷入系统
Other
检查服务是否添加成功
adb shell service list | grep xxx
配置sdk
命令
make sdk
步骤
复制android.jar
- 在 SDK/platforms 复制 android-31 文件夹 命名为android_31_car
aosp目录下 /out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates
- 复制 classes-header.jar到android_31_car 命名为android.jar 替换原有的android.jar
修改 source.properties
#指定自定义平台标识为311(可以是任意数字,但为了与原生标识区分,请使用三位数)
Pkg.Desc=Android SDK Platform 311#改
Pkg.UserSrc=false
Platform.Version=311#改
Platform.CodeName=
Pkg.Revision=1
AndroidVersion.ApiLevel=311#改
Layoutlib.Api=15
Layoutlib.Revision=1
Platform.MinToolsRev=22
修改 package.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:repository xmlns:ns2="http://schemas.android.com/repository/android/common/02" xmlns:ns3="http://schemas.android.com/repository/android/common/01" xmlns:ns4="http://schemas.android.com/repository/android/generic/01" xmlns:ns5="http://schemas.android.com/repository/android/generic/02" xmlns:ns6="http://schemas.android.com/sdk/android/repo/addon2/01" xmlns:ns7="http://schemas.android.com/sdk/android/repo/addon2/02" xmlns:ns8="http://schemas.android.com/sdk/android/repo/repository2/01" xmlns:ns9="http://schemas.android.com/sdk/android/repo/repository2/02" xmlns:ns10="http://schemas.android.com/sdk/android/repo/sys-img2/02" xmlns:ns11="http://schemas.android.com/sdk/android/repo/sys-img2/01"><license id="android-sdk-license" type="text">Terms and Conditions
#修改下面311部分
</license><localPackage path="platforms;android-311" obsolete="false"><type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns9:platformDetailsType"><api-level>311</api-level><codename></codename><layoutlib api="15"/></type-details><revision><major>1</major></revision><display-name>Android SDK Platform 311</display-name><uses-license ref="android-sdk-license"/></localPackage></ns2:repository>
android studio 配置(记得重启一下)
File->Project Structure
代码测试
val leoManger: LeoManger =
getSystemService(Context.LEO_SERVICE) as LeoManger
val leoResult= leoManger.request("leo test")
Log.e("leoResult", "onCreate: ${leoResult}" )
服务的生命周期
mSystemServiceManager 启动ActivityTaskManagerService 是调用其内部的Lifecycle
原因是因为java 是单继承 ,AMS已经继承了Aidl ,没办法继承SystemService ,搞了个内部类来实现生命周期。
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mWindowManagerGlobalLock = atm.getGlobalLock();
SystemService
//AMS
@Override
public void onStart() {
mService.start();
}
@Override
public void onBootPhase(int phase) {
mService.mBootPhase = phase;
if (phase == PHASE_SYSTEM_SERVICES_READY) {
mService.mBatteryStatsService.systemServicesReady();
mService.mServices.systemServicesReady();
} else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
mService.startBroadcastObservers();
} else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
mService.mPackageWatchdog.onPackagesReady();
}
}
调用带有context的构造函数,用于初始化系统的服务
调用onStart()方法,来启动服务运行,该服务应该在此处调用publishBinderService(String,IBinder)方法来发布其绑定的接口。当然它也可能发布额外的本地接口,系统服务器内的其他服务可以调用这些本地服务来访问其内部
多次调用onBootPhase,直到PHASE_BOOT_COMPLETED被发送,这是最后一次启动阶段的标志。每个阶段都要进行特定的工作。例如获取可选的服务依赖关系、查看是否启动了SafeMode、或者注册一个依赖该服务启动后的服务
所有生命周期的方法都是从系统服务的主循环线程调用的
| TAG | 状态 |
|---|---|
| PHASE_WAIT_FOR_DEFAULT_DISPLAY | 等待显示阶段 |
| PHASE_LOCK_SETTINGS_READY | 锁定阶段:在此阶段,service就可以获得锁定的设置数据 |
| PHASE_SYSTEM_SERVICES_READY | 系统服务准备就绪阶段:在此阶段,service可以安心的调用核心系统服务,比如PowerManager或者PackageManager |
| PHASE_ACTIVITY_MANAGER_READY | AMS准备就绪阶段:在启动阶段后,service就可以发送广播了 |
| PHASE_THIRD_PARTY_APPS_CAN_START | 启动第三方应用阶段:在启动阶段后,服务就可以启动/绑定第三方应用程序App就可以。并在此时调用Binder服务 |
| PHASE_BOOT_COMPLETED | PHASE_BOOT_COMPLETED 启动结束阶段:在此阶段,此时服务可以运行用户与设备进行交互。当启动完成后Home应用程序会在此阶段启动。系统服务可能会监听这个阶段,而不是注册ACTION_BOOT_COMPLETED的广播接收器来减少整体延迟 |