Android adb 命令查询service相关介绍

Android adb 命令查询service相关介绍

文章目录

  • Android adb 命令查询service相关介绍
    • 一、前言
    • 二、adb命令控制service
      • 1、查询系统服务 service list
      • 2、查询四大组件的服务 dumpsys activity services
      • 3、杀死四大组件的服务 am stop-service 包名/.类名
      • 4、启动四大组件的服务:am start-service 包名/.类名
    • 三、其他
      • 1、service list 相关问题
        • (1)系统服务如何添加到 service
        • (2)为啥要添加到
        • (3)service list的实现
        • (4)Service接口类添加到service代码
          • (1)比如添加NetworkManagementService 添加到ServiceManager部分示例代码:
          • (2)另外一种形式添加系统服务到ServiceManager
      • 2、Java代码中拉起Service和停止Service
      • 3、四大组件service启动和停止 adb 命令的源码

一、前言

adb查询系统中的service用什么命令?
很多人会说是service list | grep XXXService
但是你会发现四大组件的service并不能这样查询到,
四大组件的Service查询,需要用dumpsys activity services | grep XXXService

两种Service查询有啥区别吗?需要什么命令可以杀死这个Service。
本文讲解一些adb查询和控制Service相关的知识;
这些知识不一定马上有用,但是分析问题有时候会用到,有兴趣的可以收藏看看。

二、adb命令控制service

1、查询系统服务 service list

127|console:/ # service list
Found 177 services:
0       DockObserver: []
1       SkgSystemUI: [com.debug.SystemUI.IMainService]
2       SurfaceFlinger: [android.ui.ISurfaceComposer]
3       accessibility: [android.view.accessibility.IAccessibilityManager]
4       account: [android.accounts.IAccountManager]
5       activity: [android.app.IActivityManager]
6       activity_task: [android.app.IActivityTaskManager]
7       adb: [android.debug.IAdbManager]
8       alarm: [android.app.IAlarmManager]
9       android.hardware.power.IPower/default: [android.hardware.power.IPower]
10      android.os.UpdateEngineService: [android.os.IUpdateEngine]
...

每行信息表示一个服务,其中:
第一个数字是服务的ID。
第二个字段是服务名称。
第三个字段是服务所属的应用类名。
这样你就可以看到设备上有哪些系统服务。

过滤某些wifi相关的系统Service示例:

console:/ # service list | grep wifi                                           
41      android.hardware.wifi.IWifi/default: [android.hardware.wifi.IWifi]
285     wifi: [android.net.wifi.IWifiManager]
286     wifinl80211: [android.net.wifi.nl80211.IWificond]
287     wifip2p: [android.net.wifi.p2p.IWifiP2pManager]
288     wifiscanner: [android.net.wifi.IWifiScanner]
console:/ # 

这些系统服务为什么要添加到里面?是哪里定义的?如何添加到service里面的? 后面有具体介绍。

2、查询四大组件的服务 dumpsys activity services

只能查询到正在运行中的服务
过滤蓝牙opp 相关Service示例:

console:/ # dumpsys activity services | grep -i bluetooth 
console:/ # //蓝牙相关服务太多了, 这里就不一一罗列了。
console:/ #dumpsys activity services | grep -i opp  
  * ServiceRecord{86cdea6 u0 com.android.bluetooth/.opp.BluetoothOppService}
    intent={cmp=com.android.bluetooth/.opp.BluetoothOppService}
    infoAllowStartForeground=[callingPackage: com.android.bluetooth; callingUid: 1002; uidState: PER ; uidBFSL: [BFSL]; 
    intent: Intent { cmp=com.android.bluetooth/.opp.BluetoothOppService (has extras) }; code:PROC_STATE_PERSISTENT; 
    tempAllowListReason:<9403dcc android.bluetooth.adapter.action.STATE_CHANGED/u-1,reasonCode:BLUETOOTH_BROADCAST,duration:10000,callingUid:1000>; 
    targetSdkVersion:34; callerTargetSdkVersion:34; startForegroundCount:0; bindFromPackage:null: isBindService:false]
console:/ # 
console:/ # 
console:/ # dumpsys activity services | grep -i wifi //wifi相关的服务不是以wifi命名的,所以无法查找到
1|console:/ # 

上面可以看到蓝牙传输相关的opp服务,只有蓝牙打开的情况才能查询到这个服务。
从上面的信息大致可以看到,这个服务的Java类的包名和具体服务类名。
还有个isBindService 信息,大部分的Service都是false,即使有的被绑定的Service也是有的显示false,还不清楚具体原因。
后续就可以通过包名+类型拉起这个服务或者停止这个服务。

3、杀死四大组件的服务 am stop-service 包名/.类名

系统服务是无法杀死的,她其实就是一种提供接口的形式。
而四大组件的服务如果是运行状态的,是可以杀死的。

console:/ # 
console:/ # am stop-server aa
Unknown command: stop-server
255|console:/ # am stop-service aa //(1)随便啥一个服务名,发现是错误的,提示该服务未运行
Stopping service: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=aa }
Service not stopped: was not running.
255|console:/ # 
255|console:/ # //(2)杀死蓝牙opp服务,提示Service stopped 表示成功
am stop-service com.android.bluetooth/.opp.BluetoothOppService  
Stopping service: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.bluetooth/.opp.BluetoothOppService }
Service stopped
255|console:/ # dumpsys activity services | grep -i opp  
1|console:/ # //(3)重新查询蓝牙opp服务,发现找不到了,说明已经停止了

4、启动四大组件的服务:am start-service 包名/.类名

console:/ # am start-service aa //(1)随便拉起啥一个服务名,提示该未发现该服务
Starting service: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] pkg=aa }
Error: Not found; no service started.
255|console:/ #  //(2)拉起蓝牙opp服务,提示Starting service:XXX 表示成功
1|console:/ #am start-service com.android.bluetooth/.opp.BluetoothOppService
Starting service: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.bluetooth/.opp.BluetoothOppService }
console:/ # //(3)重新查询蓝牙opp服务,有找到了,说明已经启动服务了
console:/ # dumpsys activity services | grep -i opp                            
  * ServiceRecord{730de10 u0 com.android.bluetooth/.opp.BluetoothOppService}
    intent={act=android.intent.action.MAIN
    cat=[android.intent.category.LAUNCHER] cmp=com.android.bluetooth/.opp.BluetoothOppService}...
console:/ # 

不暴露的Service也是可以使用 am start-service 拉起吗?
比如,下面的服务定义示例;

        <service android:name="com.debug.settings.service.ScheduleService"
            android:exported="false"/>

测试了一下,是可以使用am start-service 命令拉起的。
估计是adb拥有系统权限,系统类或者系统应用可以拉起未暴露的Service。
也有些系统服务做了限制,无法正常拉起的。一般是判断权限或者intent数据。

三、其他

1、service list 相关问题

(1)系统服务如何添加到 service

其实 service list 的 这些服务是ServiceManager手动添加的

ServiceManager.addService(SERVICE_XXXNAME, mBinder);

其中 SystemServer.java 就有很多系统服务是添加到 ServiceManager 管理的。
要调用addService方法,必须是系统类或者系统应用才有权限。

addService 具体实现是在底层代码实现的。

(2)为啥要添加到

这种系统服务无法并不是真正的四大组件的服务,而是一个基于AIDL的接口类。

class XXXManager extends IXXXService.Stub

获取到对应的 mBinder 后,就可以调用IXXXService里面的接口实现。

所以SystemServer添加Service就是为了被其他类以binder的形式进行调用。
binder 的调用不仅仅局限于Java代码,还可以用在cpp代码,虽然我不清楚cpp代码是如何调用binder的。

(3)service list的实现

service list 返回的数据实现是在cpp代码:

/frameworks/native/cmds/service/service.cpp

binder其实是底层逻辑,这里不展开介绍。

有兴趣的可以看看:

https://blog.csdn.net/a572423926/article/details/126551079

(4)Service接口类添加到service代码

SystemServer中的大部分系统服务都是以 XXXManager extends IXXXService.Stub的形式定义后,添加对应的binder(XXXManager 对象)到service中。

(1)比如添加NetworkManagementService 添加到ServiceManager部分示例代码:

frameworks/base/services/java/com/android/server/SystemServer.java


            t.traceBegin("StartNetworkManagementService");
            try {
                networkManagement = NetworkManagementService.create(context);
                ServiceManager.addService(Context.NETWORKMANAGEMENT_SERVICE, networkManagement);
            } catch (Throwable e) {
                reportWtf("starting NetworkManagement Service", e);
            }
            t.traceEnd();

NetworkManagementService 的部分代码:

public class NetworkManagementService extends INetworkManagementService.Stub {
        //静态方法,返回的是对象本身,是一个binder对象
        static NetworkManagementService create(Context context, Dependencies deps)
            throws InterruptedException {
        final NetworkManagementService service =
                new NetworkManagementService(context, deps);
        if (DBG) Slog.d(TAG, "Creating NetworkManagementService");
        if (DBG) Slog.d(TAG, "Connecting native netd service");
        service.connectNativeNetdService();
        if (DBG) Slog.d(TAG, "Connected");
        return service;
    }
    
}

但是也一些系统服务是非常规方式添加binder的:

(2)另外一种形式添加系统服务到ServiceManager
class TestManager {
    IMainService.Stub mBinder = new IMainService.Stub() {
        @Override
        public IBinder queryBinder(String binderType) throws RemoteException {
            IBinder binder = XXX...;
            return binder;
        }
    };
    
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {
            Log.d(TAG, "vivid-> onStartCommand..addService");
            ServiceManager.addService(MYDEBUG_SERVICE, mBinder);//添加该接口服务到service
    
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    
        return START_STICKY;
    }
}

一些自定义的系统服务类就是这样条件到ServiceManager的

2、Java代码中拉起Service和停止Service


// (1)创建一个Intent对象,指定要停止的Service
Intent intent = new Intent(context, YourService.class);
// 停止Service
context.stopService(intent);

// (2)创建一个Intent对象,指定要启动的Service
Intent intent = new Intent(context, YourService.class);
// 启动Service
context.startService(intent);


//(3)bindService 拉起Service
Context.bindService(Intent, ServiceConnection, int)

上面的代码普通应用就可以使用。

遍历系统中的Service,查找某个Service 的应用进行停止


    ActivityManager manager = (ActivityManager)getContext().getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if ("com.yourpackage.MyService".equals(service.service.getClassName())) {
            manager.killBackgroundProcesses(service.service.getPackageName());
            break;
        }
    }

停止需要权限:

 <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

这个权限只有系统应用才能申请到。

3、四大组件service启动和停止 adb 命令的源码

源码位置:

framework/base/services/core/java/com/android/server/am/ActivityManagerShellCommand.java

am 主要命令相关代码:

  @Override
    public int onCommand(String cmd) {
        if (cmd == null) {
            return handleDefaultCommands(cmd);
        }
        final PrintWriter pw = getOutPrintWriter();
        try {
            switch (cmd) {
                case "start":
                case "start-activity":
                    return runStartActivity(pw);
                case "startservice":
                case "start-service":
                    return runStartService(pw, false);
                case "startforegroundservice":
                case "startfgservice":
                case "start-foreground-service":
                case "start-fg-service":
                    return runStartService(pw, true);
                case "stopservice":
                case "stop-service":
                    return runStopService(pw);
                case "broadcast":
                    return runSendBroadcast(pw);
。。。

    final IActivityManager mInterface;

    //开启服务实现
    int runStartService(PrintWriter pw, boolean asForeground) throws RemoteException {
        final PrintWriter err = getErrPrintWriter();
        Intent intent;
        try {
            intent = makeIntent(UserHandle.USER_CURRENT);
        } catch (URISyntaxException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
        if (mUserId == UserHandle.USER_ALL) {
            err.println("Error: Can't start activity with user 'all'");
            return -1;
        }
        pw.println("Starting service: " + intent);
        pw.flush();
        
        //** startService **实现和返回情况
        ComponentName cn = mInterface.startService(null, intent, intent.getType(),
                asForeground, SHELL_PACKAGE_NAME, null, mUserId);
        if (cn == null) {
            err.println("Error: Not found; no service started.");
            return -1;
        } else if (cn.getPackageName().equals("!")) {
            err.println("Error: Requires permission " + cn.getClassName());
            return -1;
        } else if (cn.getPackageName().equals("!!")) {
            err.println("Error: " + cn.getClassName());
            return -1;
        } else if (cn.getPackageName().equals("?")) {
            err.println("Error: " + cn.getClassName());
            return -1;
        }
        return 0;
    }

通过上面的代码可以看到:
启动服务使用 startservice 和 start-service 都是可以的;
停止服务使用 stopservice 和 stop-service 都是可以的;
所以在不同文章看到这两种方式的命令启动或者停止服务不要大惊小怪。

从上面 onCommand 方法可以看到,服务启动,Activity启动,广播发送都是有adb命令控制的;

adb 命令的 am XXX 最终实现也是通过IActivityManager 接口类调用到具体实现的,和Java代码调拉起服务或者Activity后续实现是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot民宿预定信息管理系统-计算机毕业设计源码89828

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2研究背景 1.3论文结构与章节安排 2 民宿预定信息管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分…

Pytest日志收集器配置

前言 在pytest框架中&#xff0c;日志记录&#xff08;logging&#xff09;是一个强大的功能&#xff0c;它允许我们在测试期间记录信息、警告、错误等&#xff0c;从而帮助调试和监控测试进度。 pytest与Python标准库中的logging模块完美集成&#xff0c;因此你可以很容易地在…

Spring源码解析(35)之Spring全体系源码流程图

一、前言 画了一个spring全体系的流程图&#xff0c;spring容器创建过程&#xff0c;spring生命周期过程&#xff0c;AOP过程&#xff0c;Spring事务执行过程。 二、Spring体系源码图

【1024程序员节】之C++系列完结篇:Web编程

文章目录 一、Web编程1. 使用C标准库和第三方库2. 使用CWeb框架3. 使用C与JavaScript的集成4. 数据库交互5. 部署和运维 二、CppCMS框架构建Web应用1. 安装 CppCMS&#xff1a;2. 创建项目目录和文件3. 编写源代码4. 编译和运行5. 访问 Web 应用 三、HTTP介绍1. 请求头部字段&a…

Vue项目的创建

安装Vue工具 Vue CLI Vue CLI Vue.js 开发的标准工具&#xff0c;Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 npm install -g vue/cli安装之后&#xff0c;你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue&#xff0c;看看是否展示出了一份所有可用命令的…

qt QApplication详解

一、概述 QApplication是Qt应用程序的基础类&#xff0c;负责设置和管理应用的环境。它的主要功能包括&#xff1a;初始化应用程序、管理事件循环、处理命令行参数、提供全局设置&#xff08;如样式和调色板&#xff09;以及创建和管理主窗口。通常在main函数中创建QApplicati…

Netty简单应用

1.服务端构建 接收客户端请求&#xff0c;打印请求消息&#xff1b;消息采用内置String作为编码与解码器&#xff1b;开启信息输入监听线程&#xff0c;发送消息至客户端&#xff1b; 1.1 服务端消息处理类 import io.netty.channel.Channel; import io.netty.channel.Chann…

React实现购物车功能

今日学习React的useReducer&#xff0c;实现了一个购物车功能 文章目录 目录 效果展示 逻辑代码 CSS代码 效果展示 逻辑代码 import {useReducer} from "react"; import ./index.css; import { message} from antd;export function ShoppingCount(){// 初始化购…

去哪儿旅行携手 HarmonyOS SDK | 告别繁琐,常用信息秒级填充

背景 去哪儿旅行作为行业内领先的一站式在线旅游平台&#xff0c;多年来在日益加剧的市场竞争中积极寻求创新&#xff0c;凭借其优质的服务深受消费者青睐。2024年&#xff0c;去哪儿旅行适配HarmonyOS NEXT版本&#xff0c; 升级用户服务体验。 当前&#xff0c;去哪儿旅行应…

HTML+JavaScript 贪吃蛇游戏实现与详解

在网页开发的领域中&#xff0c;利用 HTML 和 JavaScript 能够创造出各种引人入胜的互动游戏。其中&#xff0c;贪吃蛇作为一款经典之作&#xff0c;以其简单易玩的特性和紧张刺激的挑战&#xff0c;一直深受玩家的喜爱。本文将详细阐述如何运用 HTML 和 JavaScript 来打造一个…

OPPO携手比亚迪共同探索手机与汽车互融新时代

10月23日&#xff0c;OPPO与比亚迪宣布签订战略合作协议&#xff0c;双方将共同推进手机与汽车的互融合作&#xff0c;这一合作也标志着两大行业巨头在技术创新和产业融合上迈出了重要一步&#xff0c;为手机与汽车的深度融合探索新的可能。 OPPO创始人兼首席执行官陈明永、OP…

鸿蒙网络编程系列3-TCP客户端通讯示例

1. TCP简介 TCP协议是传输层最重要的协议&#xff0c;提供了可靠、有序的数据传输&#xff0c;是多个广泛使用的表示层协议的运行基础&#xff0c;相对于UDP来说&#xff0c;TCP需要经过三次握手后才能建立连接&#xff0c;建立连接后才能进行数据传输&#xff0c;所以效率差了…

【PDF文件】默认被某种软件打开,如何进行修改?

当有时下载某种软件后&#xff0c;电脑中的PDF文件就默认由该种软件打开&#xff0c;每次需要右键选择打开方式才能选择需要的其他软件打开。如下图所示。 修改方法&#xff1a; &#xff08;1&#xff09;点击电脑的“设置”&#xff0c;选择应用 &#xff08;2&#xff09;…

Java一站式校园社区外卖系统小程序源码

一站式校园社区外卖系统&#xff0c;让校园生活更便捷&#xff01; &#x1f3eb; 开篇&#xff1a;校园生活的“新宠儿” 嘿&#xff0c;小伙伴们&#xff01;今天要和大家分享一个超级实用的校园生活神器——“一站式校园社区外卖系统”&#xff01;在这个快节奏的时代&…

一个开源可私有化部署的没有任何广告的网易云

优点 ✅ 使用 Vue.js 全家桶开发&#x1f534; 网易云账号登录&#xff08;扫码/手机/邮箱登录&#xff09;&#x1f4fa; 支持 MV 播放&#x1f4c3; 支持歌词显示&#x1f4fb; 支持私人 FM / 每日推荐歌曲&#x1f6ab;&#x1f91d; 无任何社交功能&#x1f30e;️ 海外用…

歌手如何建立抖音百科?塑造个人形象!

在抖音这个充满无限可能的舞台上&#xff0c;明星们以独特的魅力吸引着亿万粉丝的目光。而抖音百科&#xff0c;作为明星们展示自我、塑造形象的又一重要窗口&#xff0c;正逐渐成为连接明星与粉丝的桥梁。 创建明星人物抖音百科&#xff0c;不仅是对明星过往成就的总结与回顾&…

WRB Hidden Gap,WRB隐藏缺口,MetaTrader 免费公式!(指标教程)

WRB Hidden Gap MetaTrader 指标用于检测和标记宽范围的柱体&#xff08;非常长的柱体&#xff09;或宽范围的烛身&#xff08;具有非常长实体的阴阳烛&#xff09;。此指标可以识别WRB中的隐藏跳空&#xff0c;并区分显示已填补和未填补的隐藏跳空&#xff0c;方便用户一眼识别…

uniapp移动端优惠券! 附源码!!!!

本文为常见的移动端uniapp优惠券&#xff0c;共有6种优惠券样式&#xff08;参考了常见的优惠券&#xff09;&#xff0c;文本内容仅为示例&#xff0c;您可在此基础上调整为你想要的文本 预览效果 通过模拟数据&#xff0c;实现点击使用优惠券让其变为灰色的效果&#xff08;模…

使用Dask在多块AMD GPU上加速XGBoost

Accelerating XGBoost with Dask using multiple AMD GPUs — ROCm Blogs 2024年1月26日 由Clint Greene撰写。 XGBoost 是一个用于分布式梯度提升的优化库。它已经成为解决回归和分类问题的领先机器学习库。如果您想深入了解梯度提升的工作原理&#xff0c;推荐阅读 Introduc…

Maven入门到实践:从安装到项目构建与IDEA集成

目录 1. Maven的概念 1.1 什么是Maven 1.2 什么是依赖管理 1.3 什么是项目构建 1.4 Maven的应用场景 1.5 为什么使用Maven 1.6 Maven模型 2.初识Maven 2.1 Maven安装 2.1.1 安装准备 2.1.2 Maven安装目录分析 2.1.3 Maven的环境变量 2.2 Maven的第一个项目 2.2.1…