专栏首页代码GG之家android am 命令简单讲解(一)

android am 命令简单讲解(一)

讲完了 dumpsys ,这节我们看下 am 命令,这个不同于 dumpsys的可执行文件, am 是个脚本文件。 具体来看,先从android.mk来阅读下。很多时候,我不做太多强调,重复的去写一些流程,一些跟踪逻辑,这个是要掌握的关键,比如这里的android.mk

从这个文件,可以看到,编译出来的主要有两个文件,一个am.jar(BUILD_JAVA_LIBRARY指定编译结果),同时还有一个am脚本(BUILD_PREBUILT 指定此文件已经是最终文件),最终放置在/system/bin目录,打开这个文件,可以看到:

从第一行的#!/system/bin/sh可以看到,是个sh脚本,具体含义等会讲解。 am.jar是将当前目录下的src目录和proto目录,编译成am.jar包,放置在system/framework下面。 然后我们使用的时候,命令如下:(举个例子,更详细的直接am -h) am start -n com.android.camera/com.android.camera.Camera 我们知道,这个am命令,系统是在system/bin目录,关于在adb shell环境下,系统如何找的文件,可以通过查看PATH看到系统搜索的路径: echo $PATH 输出结果:

/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

那么我们现在看下这里的am文件:

我们直接看else的这部分, base=/system export CLASSPATH=$base/framework/am.jar exec app_process $base/bin com.android.commands.am.Am "$@" 这里可以看到就是几条 shell 命令,第一行定义一个变量,第二行导出一个类的搜索路径 第三行使用exec创建一个app_process进程,然后找到里面的com.android.commands.am.Am类,调用里面的main方法

$@ 是我们传入的参数。

比如这里am start -n com.android.camera/com.android.camera.Camera $@就是start -n com.android.camera/com.android.camera.Camera

关于 exec 可执行文件,我们当前不讲,因为牵扯了进程切换,可以百度linux exec找到答案。同时 app_process 也不详细讲解,今天主要顺下am的执行过程。 am 运行使用 exec 创建一个 app_process 进程,然后找到里面的com.android.commands.am.Am类,调用里面的main方法 $@ 是我们传入的参数, 我们这里就来看下app_process 如何加载这个类,同时执行Am.java里面的main方法。 app_process 可执行文件,是 app_main.cpp 编译而成的,于是我们找下这个文件,看下里面的main方法。

new 一个 runtime 实例,将参数设置进来。 这里参数是shell脚本里面带来的,即/system/bin 和 com.android.commands.am.Am,以及我们代入的其他参数 (比如:am start -n com.android.camera/com.android.camera.Camera 这里的start -n com.android.camera/com.android.camera.Camera 也会作为参数带入) 当找到 className 的时候,就会跳出循环,不解析后面的参数,然后将 className 以及后面的参数,通过runtime.setClassNameAndArgs设置到 runtime 里面,然后启动 runtime.start("com.android.internal.os.RuntimeInit", args, zygote);

继续运行。

关于start方法的执行过程,下节继续讲解。

本文分享自微信公众号 - 代码GG之家(code_gg_home),作者:陆晓明

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 搭建安卓系统源代码编译环境

    今天分享下月亮大神整理的,android源码环境搭建,让开始学习android的同学,可以少走弯路,快速上手。 安卓源码编译环境搭建教程: 1.打造自己的And...

    用户1263308
  • SDL系列讲解(八) SDL_ttf教程

    关于游戏开发,当前还在调试,一款移植的随后先推出,自己开发的需要稍等几周,近期比较忙,时间不充裕,大家谅解。同时,对于android开发中的任意问题,可以留言,...

    用户1263308
  • android 游戏移植 (二) | SDL2.0适配 西游释厄传

    SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 SDL是什么,能干什么,为什么我们要学习它? SDL系列讲解(四)...

    用户1263308
  • 安卓开发ScrollView嵌套ListView只显示一行

    听着music睡
  • 1. 从系统架构到Hello World

    Android起源与发展:   Android操作系统最初在2003年的时候由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。20...

    SecondWorld
  • 设计模式实战-适配器模式,承上启下

    适配器,其实很好理解,生活中也随处可见,比如电源适配器、usb 适配器等等,那么适配器模式,也被称为Wrapper 模式。

    架构师修炼
  • 适配器模式(Adapter Pattern)- 最易懂的设计模式解析

    把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。

    Carson.Ho
  • “推特”启用20万元的双拼域名tuite.com

    Twitter(非官方汉语通称推特)是一家美国社交网络及微博客服务的网站,是全球互联网上访问量最大的十个网站之一。是微博客的典型应用。Twitter...

    躲在树上的域小名
  • Android上GNSS Hal服务解析

    源码路径:hardware/libhardware/include/hardware/gps.h

    李小白是一只喵
  • 图解ByteBuffer

    概述 ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuf...

    ImportSource

扫码关注云+社区

领取腾讯云代金券