Android源码分析-am命令的实现

树莓派学习笔记(5):成功实现NAS家庭服务器(流媒体播放、文件共享及下载机)... 转载请注明:@小五义http://www.cnblogs.com/xiaowuyi  QQ群:64770604   一、家庭服务器实现的主要功能 1、流媒体播放服务:利用DLNA实现电视、手机、电脑播放其上面的媒体文件。 2、文件共享:利用samba实现手机、电脑等终端与服务器的文件共享。 3、自动下载:利用aria2c实现自动下载。 先上几张效果图: 用orico的包装盒做了个机箱... 阅读详情

 在Android系统中,可以用am命令来启动一个组件。例如,可以用下面的命令启动Camera:

# am start -n com.android.camera/com.android.camera.Camera

传送门:

Android开发-使用am命令启动Activity,Service等组件,以及发送广播等操作

Android源码分析-ActivityManagerService(AMS)源码分析

am是client端:

从代码实现上来说,在Android系统中,Android Framework层的各个service作为服务端,而使用者通过RPC(远程过程调用)调用这些服务,使用者就是Client端。

从进程间通信角度来说,Android Framework层的各个service作为服务端,提供具体的功能;同时,应用程序为了访问这些service,需要通过binder机制与service进行通信,这些运行在app端的代码就是client端(诸如ActivityManagerProxy等各种服务代理)。

具体到今天分析的am来说,am作为client端,与Framework的server端的AMS通过binder进行交互;从而实现AMS提供的各种功能,如图:

am的编译:

# Copyright 2008 The Android Open Source Project
#
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := am
include $(BUILD_JAVA_LIBRARY)

include $(CLEAR_VARS)
ALL_PREBUILT += $(TARGET_OUT)/bin/am
$(TARGET_OUT)/bin/am : $(LOCAL_PATH)/am | $(ACP)
   $(transform-prebuilt-to-target)

NOTICE_FILE := NOTICE
files_noticed := bin/am

# Generate rules for a single file. The argument is the file path relative to
# the installation root
define make-notice-file

$(TARGET_OUT_NOTICE_FILES)/src/$(1).txt: $(LOCAL_PATH)/$(NOTICE_FILE)
   @echo Notice file: $$< -- $$@
   @mkdir -p $$(dir $$@)
   @cat $$< >> $$@

$(TARGET_OUT_NOTICE_FILES)/hash-timestamp: $(TARGET_OUT_NOTICE_FILES)/src/$(1).txt

endef

$(foreach file,$(files_noticed),$(eval $(call make-notice-file,$(file))))

Am类相关代码的分析:

Am类图如下: 

说明(主要对Am类进行说明):

1. Am类:即am命令的入口类,有main方法。Am是client端组件,拥有一个远程代理组建mAm;

2. 数据成员mAm:

mAm:Am类通过mAm来实现相关的功能,包括启动一个activity或service,发送一个广播等。

mAm的真正实体类型是AcitivtyManagerProxy类型,因为mActivityManager是一个接口,无法实例化,而继承自mActivityManager的AcitivtyManagerProxy可以实例化。

mArgs:即am命令的参数;

3. 方法:

runStartService:启动一个service;

sendBroadcast:发送一个广播;

其余相关组件,请参考:

Android源码分析-ActivityManagerService(AMS)源码分析

run方法的分析:

am是可执行程序,其对应的实现在Am.java中,当然有main方法。在main方法中,调用了run方法。

main方法调用run,代码如下:

public static void main(String[] args) {
        try {
            (new Am()).run(args);
        } 
        ......
}

而在run方法中,对命令行参数进行解析:

private void run(String[] args) throws Exception {
        if (args.length < 1) {
            showUsage();
            return;
        }

        mAm = ActivityManagerNative.getDefault();
        if (mAm == null) {
            System.err.println(NO_SYSTEM_ERROR_CODE);
            throw new AndroidException("Can't connect to activity manager; is the system running?");
        }

        mArgs = args;
        String op = args[0];
        mNextArg = 1;

        if (op.equals("start")) {
            runStart();
        } else if (op.equals("startservice")) {
            runStartService();
        } 
......
}

其中,

1. mAm = ActivityManagerNative.getDefault(); 通过rpc方式,返回了ActivityManagerProxy的一个实例;

2. showUsage:显示了am的用法;

3. runStart:当命令行参数的option是start时(例如,本篇文章最开始的 am start 命令),执行该方法;

4. runStartService:顾名思义,启动一个service。

我们主要分析runStart。

runStart方法的分析:

runStart的主要功能是根据输入的参数,来构建mAm的startActivity的参数。

我们知道,要strat 一个acitivty,从client的角度来看,需要通过ActivityManagerProxy调用到AMS的

startActivity方法中,

现在,mAm就是ActivityManagerProxy的实例。

过程如下:

(1)intent的构建:

Intent intent = makeIntent();

(2)停止当前的应用:

根据是否停止的标志来判断,

if (mStopOption) {

       ......   

  mAm.forceStopPackage(packageName);
  Thread.sleep(250);

}

(3)调用mAm的startActivity:

if (mWaitOption) {
    result = mAm.startActivityAndWait(null, intent, mimeType,
                null, null, 0, mStartFlags, mProfileFile, fd, null);
    res = result.result;
} else {
    res = mAm.startActivity(null, intent, mimeType,
            null, null, 0, mStartFlags, mProfileFile, fd, null);
}

这样,就调用到了mAm(即ActivityManagerProxy)的对应的startActivity方法中了。

关于startActivity的源码,可以参考:

Android源码分析-ActivityManagerService(AMS)源码分析


Android源码分析之Framework的MediaPlayer 在Android中MediaPlayer用来播放音频和视频文件,在这里分析下在Framework层中MediaPlayer是如何调用的,MediaPlayer的代码位于:./frameworks/base/media/java/android/media/MediaPlayer.java   下面用到的代码是基于Android 4.4 打开后有一个静态代码块是加载库文件的,只要这个类被创建就 阅读详情

相关推荐

Android 音频源码分析——audioserver启动

该源码分析基于android9.0  Android音频系统中,有两大service:AudioFlinger和AudioPolicy,这两个服务都运行在audioservr进程中。这里来整理以下audioserver启动流程。 一、 加载audioserver.rc Android系统启动:加载引导程序-》引导程序-》Linux内核启动-》启动init进程-》zygote进程-》SystemServer-》Launcher。 init进程对应main函数 system/core/init/init.cpp

奋斗的菜鸟ing 7058

Android系统am命令

在Android开发和测试中,am(Activity Manager)命令是一个非常强大的工具,它允许你从命令行或脚本中执行各种系统操作,如启动应用、发送广播、启动服务等。am命令通过adb shell在设备上执行。

至道无难,唯嫌拣择 1833

【Android】源码分析 - Activity启动流程,android社招面试

目前已经更新的部分资料:一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!V获取:vip204888 (备注Android)**[外链图片转存中…(img-1SNiqooY-1712683580112)][外链图片转存中…(img-shQXLeX5-1712683580112)]

2401_84102915的博客 1125

Android命令——am

am指令是 activity manager的缩写,可以启动Service、Broadcast,杀进程,监控等功能am命令实的实现方式在Am.java,最终几乎都是调用ActivityManagerService相应的方法来完成的。

ZX3249956424的博客 523

安卓10源码开发定制(30)screencap命令源码分析

一、screencap命令介绍 安卓系统中screencap命令是一个屏幕截图命令。以下是该命令的帮助说明: 在终端通过adb shell命令执行屏幕截图,可以将当前的屏幕保存为png图片。如下所示: 如果命令不带-p参数,会将屏幕的原始数据直接输出到终端。 二、screencap源码分析 1.screencap源码路径 screencap源码路径位于: //源码路径frameworks/base/cmds/screencap/...

xiaomaNo01的专栏 1511

Android Radio实战——切换FM/AM(十)

这里主要通过 AudioManager.setParameters() 下发 tuner_band=am/fm 设置音频管理器的参数。这里会设置 Source gain(源增益),用于描述调节音频或视频信号源的音量或增益级别。它表示对原始信号的放大或减小程度。然后通过 RadioTuner.setConfiguration 设置收音机调谐器配置的方法。这里的 sFmConfig 和 sAmConfig 是在 openSession 的时候,通过无线电模块获取的。

小旭的专栏 1748

Android am命令

介绍 am命令提供了操作activity,service,broadcast的方法,极大的方便了设备的调试。本文介绍了常用的基本操作。 使用说明 #am usage: am [subcommand] [options] usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>] [--sampling INTERVAL] [-R COUNT] [-S] [--opengl-tr

zhujm320的专栏 1174

深入了解Android开发:源码分析与应用实践

Android作为一个成熟的开源操作系统,其架构可大致分为四个层次:应用层、应用框架层、运行时库和系统库以及Linux内核。应用层包括所有的Android应用,例如电话、短信以及浏览器应用。应用框架层则为开发者提供了构建应用所需要的APIs。运行时库和系统库提供了关键性的功能,如Dalvik/ART虚拟机、SQLite数据库以及Webkit浏览器引擎等。而最底层的Linux内核负责硬件抽象层(HAL)以上的所有功能。HAL的设计理念基于两个核心原则:硬件无关性和模块化。

weixin_28949937的博客 885

Android am打开camera,Android Camera 调试常用调式命令

1、CameraService进程信息打印adb shell dumpsys media.camera可以获取设计的相机相关信息及状态CameraService Log等级修改adb shell dumpsys media.camera -v 1代码入口是:frameworks\native\cmds\dumpsys\main.cppint main(int argc, char* const a...

weixin_30197529的博客 1301

深入解析Dataloader中shuffle机制与随机种子对模型训练的影响

本文深入探讨了Dataloader中shuffle机制与随机种子对机器学习模型训练的影响。通过实际案例分析,详细解释了数据打乱顺序的必要性、随机种子的正确设置方法以及两者协同工作的原理,帮助开发者避免常见陷阱并提升模型训练效果。

weixin_29166013的博客 140

Multisim 14.0元件库下载权威指南:官方与社区资源

详解Multisim元件库下载的官方途径与可靠社区资源,帮助用户快速获取Multisim 14.0所需元件模型,提升电路仿真效率。

weixin_32925455的博客 747

Android12 am命令的使用及实现流程分析

在shell通过命令am,可以输出该命令的帮助信息,常用的命令如下 几大组件相关的命令,通过名字大概知道用途还有其他比较有用的命令:在命令行执行am命令 am使用示例 以dumpheap命令为例,其可以指定进程的名字或pid: 执行命令: 当adb shell 进入后直接执行 am dumpheap system_server, 会抛出上面一个异常,说找不到这个进程,不过换成 system 就可以。从错误的调用栈可以知道,这个命令是通过 Binder#shellCommand 来实现的,am具体的实现在Ac

pecuyu 3566

【020】基于51单片机智能路灯系统Proteus仿真与实物设计

【020】基于51单片机智能路灯系统Proteus仿真与实物设计

小邓子分享官的博客 1878

Android9.0 Activity启动流程分析(一)

一、am命令 我们将利用am命令启动一个Activity,来分析Activity的启动流程。 am start -W -n com.android.settings/com.android.settings.Settings -W:表示等待目标activity启动的返回结果 -n :后接component name用于指定启动的Activity 在shell中输入如上命令之后会得到如下返回结果...

Cai Yu的博客 6847

SAR成像专栏目录

为方便大家阅读,我做了一个专栏目录,蓝色字有超链接,可以直接打开。 本专栏默认读者已具备雷达系统的基本知识或者已阅读过雷达导论专栏中的文章。 1. 概述 SAR成像概述 星载SAR的各项指标解读(史上最全) SAR成像算法的实现途径与算力分析 2. SAR成像原理与SAR系统简介 雷达与分辨率 SAR成像原理与方法 SAR图像的形成和处理 SAR系统设计 3. 点目标仿真 点目标仿真(一)—— 数学模型 点目标仿真(二)—— Matlab仿真 4. 成像算法 更新中 雷达导论专

7453

【2025国赛A题】A题烟幕干扰弹的投放策略思路+代码+论文

【2025国赛A题】A题烟幕干扰弹的投放策略思路+代码+论文

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 866

Lsn19_AM命令源码分析

NDK开发汇总 一 360手机助手之卸载监听 Android系统下列监听方式 监听系统卸载广播:只能监听到其他应用的卸载广播,无法监听到自己是否被卸载。 ACTION_PACKAGE_REMOVED ACTION_PACKAGE_REMOVED 皮之不存毛将焉附 内存 --》 监听 别人 卸载 系统log (正在被安装的包程序不能接收到这个广播), 监听自身 Java线...

baopengjian的专栏 954

SeaTunnel 实战:Apache SeaTunnel Web 安装与部署

复制引擎服务中配置文件到 Web 配置目录下面。就是上述 application.yml 文件中配置的端口号。默认是从 mvvm 下载,可能下载速度很慢,我这边安装了 Maven 并且配置了阿里云仓库,因此将脚本中的。如果环境变量有冲突需要改下环境变量的名字以及 init_sql.sh 中的环境变量的名字,可以加上前缀。初始化数据库有两种方式,一是使用官方提供的初始化脚本,二是直接运行初始化 SQL。初始化数据库的脚本,使用之前需要修改。

SmartSi 3907

debug:am trace-ipc源码分析

如果您有 binder 事务,则可以使用以下adb命令捕获其调用堆栈: $ adb shell am trace-ipc start … use the app - scroll/animate ... $ adb shell am trace-ipc stop --dump-file /data/local/tmp/ipc-trace.txt $ adb pull /data/local/tmp/ipc-trace.txt 命令提示 :/ # am Act..

lesive_1421的博客 634

硬核干货|C#+EtherCAT协议:高精度多轴伺服运动控制通信实战

本文摘要: 文章聚焦工业自动化领域多轴伺服运动控制的高精度与实时性需求,基于C#与EtherCAT协议实现完整解决方案。EtherCAT凭借微秒级同步、分布式架构等优势成为首选,而C#通过优化GC策略和实时线程可满足工业控制要求。文章从工程落地角度,详细拆解EtherCAT的PDO/SDO通信机制与多轴同步控制逻辑,提供完整的C#代码实现(主站初始化、伺服配置、运动控制等),所有代码均通过汇川/松下伺服实测验证。核心亮点包括:纯C#原生开发、工业现场高频问题解决方案、硬件适配指南,帮助开发者快速掌握高精度多

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 575

《低功耗方法学》翻译——第一章:介绍

第一章:介绍

记录所学,分享知识,结识挚友 2067

Pytorch Mobile 之Android Demo源码分析

现如今,在边缘设备上运行机器学习/深度学习变得越来越流行,它需要更低的时延。 而从Pytorch 1.3开始,我们就可以使用Pytorch将模型部署到Android或者ios设备中。 Pytorch官方文档中提供两个关于Pytorch-mobile的Demo: Github地址 主要包含了两个APP应用,一个简单的在神经网络领域中的“hello world"项目,另一个就更复杂了一些,有图形识别...

karry_zzj的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android adb 命令源码解析

ShellCommand WindowManagerShellCommand PackageManagerShellCommand ActivityManagerShellCommand 关键地方是找shell 对应的名字在哪里写的。

男儿不展风云志,空有天生八尺躯 1286

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android源码分析-pm命令的实现,列出包名pm list package,列出系统库pm list libraries

pm,即package manager, 还记得Android Framework层的PackageManager吗?利用PackageManager,可以访问到PackageManagerService。

记录和分享程序人生的点点滴滴 5365

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android6.0源码分析之Activity启动过程

Activity最为android开发者最熟悉的组件,本文将分析Activity的启动过程,以及AMS对Activity的调度

yangzhihuiguming的专栏 4980

Android8 开机动画源码分析学习笔记(三)

那么在线程空闲的时候就会被调用。可以打印堆栈也可以直接用grep查询方法的调用,无论是哪种方法,都可以看到是frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java中调用了performEnableScreen方法。至此,可以总结开机动画结束的具体流程了。而WMS中的performEnableScreen方法会更改这个标志位,而这个方法是AMS调用的,调用时间为某一个Activity可用的时候。

g_i_a_o_giao的博客 844
上一篇: 编程工具-git 报错 “UNPROTECTED PRIVATE KEY FILE” 问题解决
下一篇: Android源码分析-pm命令的实现,列出包名pm list package,列出系统库pm list libraries
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

liranke

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

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

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

打赏作者

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

抵扣说明:

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

余额充值