Android Framework-服务-自定义服务

907 阅读6分钟

自定义服务

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 不加会报错

WX20230717-185639@2x.png

  • 导入是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 找不到

WX20230720-111030@2x.png

代码
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;
​

WX20230808-164637@2x.png 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

WX20230808-174816@2x.png

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;

WX20230808-174952@2x.png

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

image-20230809162422635.png

WX20230809-162517@2x.png

代码测试
val leoManger: LeoManger =
    getSystemService(Context.LEO_SERVICE) as LeoManger
val leoResult=  leoManger.request("leo test")
Log.e("leoResult", "onCreate: ${leoResult}" )

WX20230809-162611@2x.png

服务的生命周期

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_READYAMS准备就绪阶段:在启动阶段后,service就可以发送广播了
PHASE_THIRD_PARTY_APPS_CAN_START启动第三方应用阶段:在启动阶段后,服务就可以启动/绑定第三方应用程序App就可以。并在此时调用Binder服务
PHASE_BOOT_COMPLETEDPHASE_BOOT_COMPLETED 启动结束阶段:在此阶段,此时服务可以运行用户与设备进行交互。当启动完成后Home应用程序会在此阶段启动。系统服务可能会监听这个阶段,而不是注册ACTION_BOOT_COMPLETED的广播接收器来减少整体延迟

资料

www.jianshu.com/p/13541de33…