
做App压力测试、自动化测试等时,前提是要准备好包名和activity,那么如何获取呢?
0、找开发要 (最快捷 (๑•̀ㅂ•́)و✧)
1、需要先打开apk后,再敲入命令
adb shell dumpsys window w |findstr \/ |findstr name=
//(查看所有包名:adb shell pm list packages [-f])
2、uiautomation
3、testin云
41、反编译,比如apktool,打开AndroidManifestxml即可
42 反编译2
adb install d:\xxxxapk
aapt dump badging d:\xxxxapk 然后打印出第一行就包含包名
5、通过adb shell进入到手机data/data目录下,查看包名(需要root)
adb shell
cd data/data
ls
6、通过使用adb shell的dumpsys的另一个命令,查看包名(不需要root)
adb shell dumpsys activity> c:\logtxt#需要先打开apk后,再敲入命令
输入命令之后,cmd里没有任何提示,不过C盘目录下,会多一个logtxt文件。
打开logtxt文件,搜索 Stack #1,然后寻找cmp=
7、通过使用grep,查看包名(不需要root)
adb shell1|shell@RM-1057:/ $logcat | grep START#需要先打开apk后,再敲入命令
查看最下面
接下来,不论打开哪个APK,cmd命令会自动显示出包名和activity的名字,比如我又打开了相册~
可以看出相册的包名是comandroidgallery3d,activity名字是appGallery
1 adb shell dumpsys activity|findstr Focuse
2 adb shell dumpsys activity top
3 uiautomation
1在有root 权限并且开启了view server 的前提下,使用sdk/tools目录下hierarchyviewerbat 工具可以获得
2在sdk/build-tools目录下有个aapt工具,使用aapt dump badging apk可以获得
3在CMD窗口中执行adb logcat -v time -s ActivityManager,然后点击应用进入,如点击系统设置,进入后会有相应的日志信息打印出来,在信息中查找 cmp=comandroidsettings/Settings
在你的android—IDE中找到D:\Softwave_Ghost\技术软件\IDE\adt_android_eclipse\adt-bundle-windows-x86-20130219\sdk\platform-tools 目录下有adbexe cd到这个目录下然后可以进行adb *** 作
或者设置环境变量
我的电脑->属性->高级系统设置->环境变量->path编辑将上面那个目录复制到里面
或者管理员身份打开cmd在其中 setpath=上面的路径
试一试adb看看出没出来他的使用方法
在模拟器中安装apk
1 启动和关闭ADB服务(adb start-server和adb kill-server)
经作者测试,模拟器在运行一段时间后,adb服务有可能(在Windows进程中可找到这个服务,该服务用来为模拟器或通过USB数据线连接的真机服务)会出现异常。这时需要重新对adb服务关闭和重启。当然,重启Eclipse可能会解决问题。但那比较麻烦。如果想手工关闭adb服务,可以使用下面的命令。
adb kill-server
在关闭adb服务后,要使用如下的命令启动adb服务。
adb start-server
2 查询当前模拟器/设备的实例(adb devices)
有时需要启动多个模拟器实例,或启动模拟器的同时通过USB数据线连接了真机。在这种情况下就需要使用如下的命令查询当前有多少模拟器或真机在线。
adb devices
如果在运行Android程序时有多个模拟器或真机在线,那么会出现一个选择对话框。如果选择在真机运行,ADT会直接将程序安装在手机上。
3 安装、卸载和运行程序(adb install、adb uninstall和am)
在Eclipse中运行Android程序必须得有Android源码工程。那如果只有apk文件(Android应用程序的发行包,相当于Windows中的exe文件)该如何安装和运行呢?答案就是adb命令。假设我们要安装一个ebookapk文件,可以使用如下的命令。
adb install ebookapk
假设ebookapk中的package是netblogjavamobileebook,可以使用如下的命令卸载这个应用程序。
adb uninstall netblogjavamobileebook
关于package的概念在以后的学习中会逐渐体会到。现在只要知道package是Android应用程序的唯一标识即可。如果在安装程序之前,该程序已经在模拟器或真机上存在了,需要先使用上面的命令卸载这个应用程序,然后再安装。或使用下面的命令重新安装。
adb install -r ebookapk
在卸载应用程序时可以加上-k命令行参数保留数据和缓冲目录,只卸载应用程序。命令如下所示。
adb uninstall -k netblogjavamobileebook
如果机器上有多个模拟器或真机实例,需要使用-s命令行参数指定具体的模拟器或真机。例如,下面的命令分别在模拟器和真机上安装、重新安装和卸载应用程序。
在emulator-5554模拟器上安装ebookapk
adb -s emulator-5554 install ebookapk
在真机上安装ebookapk
adb -s HT9BYL904399 install ebookapk
在emulator-5554模拟器上重新安装ebookapk
adb -s emulator-5554 install -r ebookapk
在真机上重新安装ebookapk
adb -s HT9BYL904399 install -r ebookapk
在emulator-5554模拟器上卸载ebookapk(不保留数据和缓冲目录)
adb -s emulator-5554 uninstall netblogjavamobileebook
在真机上卸载ebookapk(保留数据和缓冲目录)
adb -s HT9BYL904399 uninstall -k netblogjavamobileebook
如果想在模拟器或真机上运行已安装的应用程序,除了直接在模拟器或真机上 *** 作外,还可以使用如下的命令直接运行程序。
在emulator-5554模拟器上运行ebookapk
adb -s emulator-5554 shell am start -n netblogjavamobileebook/netblogjavamobileebookMain
在真机上运行ebookapk
adb -s HT9BYL904399 shell am start -n netblogjavamobileebook/netblogjavamobileebookMain
其中Main是ebookapk的主Activity。相当于Windows应用程序的主窗体或Web应用程序的主页面。am是shell命令。
动态dex *** 作主apkactivity需要通过反射机制加载指定的类,并调用其中的方法。首先要获取DexClassLoader加载器,然后使用ClassforName(className) 加载Class对象来调用指定类的方法。
MIDP20的低级界面支持按键事件keyPressed()keyRepeated()keyReleased()点设备(触摸)事件pointerPressed()pointerDragged()pointerReleased()命令按键事件setCommandListener这几种方式的交互
本文将对Activity的工作过程进行分析。
主要学习以下内容:
(1)系统内部是如何启动一个Activity的
(2)新Activity的对象是何时创建的
(3)Activity的各个生命周日是被系统何时回调的
Activity启动流程分两种,一种是启动正在运行的app的Activity,即启动子Activity。如无特殊声明默认和启动该activity的activity处于同一进程。如果有声明在一个新的进程中,则处于两个进程。另一种是打开新的app,即为Launcher启动新的Activity。后边启动Activity的流程是一样的,区别是前边判断进程是否存在的那部分。
Activity的启动流程整体如下:
一Activity启动阶段
(一)涉及到的概念
进程:Android系统为每个APP分配至少一个进程
IPC:跨进程通信,Android中采用Binder机制。
(二)涉及到的类
ActivityStack:Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
ActivitySupervisor:管理 activity 任务栈
ActivityThread:ActivityThread 运行在UI线程(主线程),App的真正入口。
ApplicationThread:用来实现AMS和ActivityThread之间的交互。
ApplicationThreadProxy:ApplicationThread 在服务端的代理。AMS就是通过该代理与ActivityThread进行通信的。
IActivityManager:继承与IInterface接口,抽象出跨进程通信需要实现的功能
AMN:运行在server端(SystemServer进程)。实现了Binder类,具体功能由子类AMS实现。
AMS:AMN的子类,负责管理四大组件和进程,包括生命周期和状态切换。AMS因为要和ui交互,所以极其复杂,涉及window。
AMP:AMS的client端代理(app进程)。了解Binder知识可以比较容易理解server端的stub和client端的proxy。AMP和AMS通过Binder通信。
Instrumentation:仪表盘,负责调用Activity和Application生命周期。测试用到这个类比较多。
(三)涉及到的进程
(1)Launcher所在的进程
(2)AMS所在的SystemServer进程
(3)要启动的Activity所在的app进程
如果是启动根Activity,就涉及上述三个进程。
如果是启动子Activity,那么就只涉及AMS进程和app所在进程。
(四)具体流程
Launcher:Launcher通知AMS要启动activity。
startActivitySafely->startActivity->InstrumentationexecStartActivity()(AMPstartActivity)->AMSstartActivity
AMS:PMS的resoveIntent验证要启动activity是否匹配。如果匹配,通过ApplicationThread发消息给Launcher所在的主线程,暂停当前Activity(即Launcher)。
暂停完,在该activity还不可见时,通知AMS,根据要启动的Activity配置ActivityStack。然后判断要启动的Activity进程是否存在
存在:发送消息LAUNCH_ACTIVITY给需要启动的Activity主线程,执行handleLaunchActivity
不存在:通过socket向zygote请求创建进程。进程启动后,ActivityThreadattach
判断Application是否存在,若不存在,通过LoadApkmakeApplication创建一个。在主线程中通过threadattach方法来关联ApplicationThread。
在通过ActivityStackSupervisor来获取当前需要显示的ActivityStack。
继续通过ApplicationThread来发送消息给主线程的Handler来启动Activity (handleLaunchActivity)。
handleLauchActivity:调用了performLauchActivity,里边Instrumentation生成了新的activity对象,继续调用activity生命周期。
IPC过程:
双方都是通过对方的代理对象来进行通信。
1app和AMS通信:app通过本进程的AMP和AMS进行Binder通信
2AMS和新app通信:通过ApplicationThreadProxy来通信,并不直接和ActivityThread通信
(五)参考函数流程
Activity启动流程(从Launcher开始):
第一阶段: Launcher通知AMS要启动新的Activity(在Launcher所在的进程执行)
第二阶段:AMS先校验一下Activity的正确性,如果正确的话,会暂存一下Activity的信息。然后,AMS会通知Launcher程序pause Activity(在AMS所在进程执行)
第三阶段:pause Launcher的Activity,并通知AMS已经paused(在Launcher所在进程执行)
第四阶段:检查activity所在进程是否存在,如果存在,就直接通知这个进程,在该进程中启动Activity;不存在的话,会调用Processstart创建一个新进程(执行在AMS进程)
第五阶段: 创建ActivityThread实例,执行一些初始化 *** 作,并绑定Application。如果Application不存在,会调用LoadedApkmakeApplication创建一个新的Application对象。之后进入Loop循环。(执行在新创建的app进程)
第六阶段:处理新的应用进程发出的创建进程完成的通信请求,并通知新应用程序进程启动目标Activity组件(执行在AMS进程)
第七阶段: 加载MainActivity类,调用onCreate声明周期方法(执行在新启动的app进程)
从另一个角度下图来概括:
下面简要介绍一下启动的过程:
Step 1 无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerServicestartActivity接口;
Step 2 ActivityManagerService调用ActivityStackstartActivityMayWait来做准备要启动的Activity的相关信息;
Step 3 ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerServicestartActivity接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是Launcher了,而对于通过在Activity内部调用startActivity的情景来说,这个进程就是这个Activity所在的进程了;
Step 4 ApplicationThread不执行真正的启动 *** 作,它通过调用ActivityManagerServiceactivityPaused接口进入到ActivityManagerService进程中,看看是否需要创建新的进程来启动Activity;
Step 5 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程,而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动;
Step 6 ActivityManagerServic调用ApplicationThreadscheduleLaunchActivity接口,通知相应的进程执行启动Activity的 *** 作;
Step 7 ApplicationThread把这个启动Activity的 *** 作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。
在“手机页面之间的跳转”一文中我介绍了如何运用setContentView()方法切换布局文件Layout的方式进行手机页面间的跳转, 这种适合更改背景,文字颜色,文字内容,但是始终是一个Activity,如果要把主控权移交给另外一个Activity,切换布局文件Layout的方式就办不到了。
如何把主控权移交给另外一个Activity呢?原理:通过Intent对象和startActivity()方法配合来实现。在主程序里使用startActivity()方法调用另外一个Activity,但是最主要的不是这个startActivity()方法,而是Intent对象,Intent在英文中是“意图”的意思,在主Activity当中,告诉程序自己是什么,并想要前往哪里,这就是Intent对象要做的事情了。在主Activity(ActivityOne)里放置一个按钮,当单击这个按钮的时候,告诉主Activity(ActivityOne)前往ActivityTwo,并在ActivityTwo里放置一个回到主Activity(ActivityOne)的一个按钮。
实现步骤
一:布局文件编写
11:第一个布局文件mainxml
<xml version="10" encoding="utf-8">
<LinearLayout xmlns:android=">
Android开发过程中我们有时需要使用第三方apk资源,而启动第三方apk在某些情况下需要指定相应的包名和启动的Activity名,这个时候就需要获取这两个名称,我们可以使用如下三种方法:
1、使用aapt //aapt是sdk自带的一个工具,在你安装的Eclipse路径下的sdk\build-tools\中,如我的是D:\Eclipse\androidTools\sdk\build-tools\android-442,如果你下载有apk反编译工具,也可以直接使用里面的aapt
以“GO备份apk”为例,先进入cmd命令行窗口,然后运行:D: -> Eclipse\androidTools\sdk\build-tools\android-442
-> aapt dump badging C:\Users\Administrator\Desktop\GO备份apk,即可获取到AndroidManifestxml中我们需要的内容,如
package: name='comjiubanggobackupex'
launchable-activity: name='comjiubanggobackupproStartupPageActivity'
2、查看AndroidManifestxml
同样是查看AndroidManifestxml,这里我们可以采用反编译方法来获取信息,同样是打开cmd命令行窗口,然后运行:E:
-> apk反编译工具\apktool\apktool -> apktoolbat d -f C:\Users\Administrator\Desktop\GO备份apk GO备份,然后打开“GO备份”文件夹,打开droidManifestxml文件,找到manifest节点的package属性值package="comjiubanggobackupex"语句即为包名,查找androidintentactionMAIN和androidintentcategoryLAUNCHER对应的activity,该activity对应的android:name属性即为入口activity名称,如<activity
android:name="comjiubanggobackupproStartupPageActivity"。
3、使用uiautomatorviewer
可以直接在命令行输入uiautomatorviewer,打开获取屏幕截图工具,连接手机,打开所要获取包名的应用,然后获取其截图,根据截图查看package即可,uiautomatorviewer的使用这里就不做介绍了。使用这个需要注意的是,该app必须是有界面的,否则无法获取。
另外,
androidintentactionMAIN 属性决定应用程序最先启动的Activity
androidintentcategoryLAUNCHER属性决定应用程序是否显示在程序列表里
以上就是关于快速获取App的packageName、Activity小结全部的内容,包括:快速获取App的packageName、Activity小结、如何用adb shell 指令获得android当前的activity、怎么使用adb命令开启允许安装第三方软件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)