A. 怎么在应用运行adb命令
在android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am.
usage: am [subcommand] [options]
start an Activity: am start [-D]
-D: enable debugging
send a broadcast Intent: am broadcast
start an Instrumentation: am instrument [flags]
-r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
-e : set argument to
-p : write profiling data to
-w: wait for instrumentation to finish before returning
start profiling: am profile start
stop profiling: am profile stop
specifications include these flags:
[-a ] [-d ] [-t ]
[-c [-c ] ...]
[-e|--es ...]
[--ez ...]
[-e|--ei ...]
[-n ] [-f ] []
启动的方法为:
$ adb shell
$ am start -n {包(package)名}/{包名}.{活动(activity)名称}
B. 如何防止一个activity被am命令行打开
方法:
对于一个service,可以首先把它设为在前台运行:
public void MyService.onCreate() {
super.onCreate();
Notification notification = new Notification(android.R.drawable.my_service_icon,
"my_service_name",
System.currentTimeMillis());
PendingIntent p_intent = PendingIntent.getActivity(this, 0,
new Intent(this, MyMainActivity.class), 0);
notification.setLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification is Running!", p_intent);
Log.d(TAG, String.format("notification = %s", notification));
startForeground(0x1982, notification); // notification ID: 0x1982, you can name it as you will.
}
重要设置-------------------------------
相较于/data/app下的应用,放在/system/app下的应用享受更多的特权,比如若在其Manifest.xml文件中设置persistent属性为true,则可使其免受out-of-memory killer的影响。如应用程序'Phone'的AndroidManifest.xml文件:
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
设置后app提升为系统核心级别,任何情况下不会被kill掉, settings->applications里面也会屏蔽掉stop操作。
这样设置前的log: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)
# cat /proc/255/oom_adj
设置后的log: PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)
# cat /proc/155/oom_adj
-12 # 这是CORE_SERVER_ADJ
注:init进程的oom_adj为-16(即SYSTEM_ADJ): cat /proc/1/oom_adj
Android相关部分分析:
在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代码:
final ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);
if (app == null) {
app = newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName, info.uid, app);
updateLruProcessLocked(app, true, true);
}
if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ; // 这个常数值为-12。
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
startProcessLocked(app, "added application", app.processName);
}
return app;
}
可见要想成为core service (即app.maxAdj = CORE_SERVER_ADJ(-12)),应用程序需要FLAG_SYSTEM和FLAG_PERSISTENT两个标志,FLAG_SYSTEM指的是应用位于/system/app下,FLAG_PERSISTENT就是指persistent属性。
而对于frameworks/base/services/java/com/android/server/SystemServer.java,则调用
ActivityManagerService.setSystemProcess();
把自己的 app.maxAdj 设置成SYSTEM_ADJ,即-16。
原理:
Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。由此带来三个问题:
1) 回收规则: 什么时候回收与回收哪一个?
2) 避免误杀: 如何阻止被回收?
3) 数据恢复与保存: 被回收了怎么办?
Android将进程分为6个等级,它们按优先级顺序由高到低依次是:
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3. 次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)
C. adb shell pm 命令无效怎么办
am全称activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。当你在adb shell命令下执行am命令:
am <command>
你也可以在adb shell前执行am命令:
adb shell am start -a android.intent.action.VIEW
D. 华为交换机MAC地址绑定,am指令怎么用
是在SYSTEM VIEW后无线用am user-bind mac-addr..... ?如果是这样的话,就是交换机的软件需要升级、打H3C 800电话或者看下说明书,把交换机升级下就AM命令就能用了
麻烦采纳,谢谢!
E. adb shell am start -W -n 命令 在4.4系统上启动不了应用,是怎么回事
你的命令看起来没问题,启动一个Activity的确可以用
adb shell am start -W -n 包名/包名+Activity名来启动,例如:
adb shell am start -W -n com.android.systemui/com.android.systemui.usb.UsbStorageActivity
不知道你这边是否发生了什么错误,什么现象,有没有什么提示?
可以在调用命令的时候看下log,例如从这种LOG开始往下跟,ActivityManager( XXX): START u0 {flg=XXXX cmp=XXXX} from pid XXX。
F. 思科的交换机有am(access management) 命令
应该没有的,最起码在2960和36系列的交换机里面没有的,至于更高层的我也不大清楚
G. 在CAD里AM命令起什么作用啊
cad里面没有am,不过有个ma(MATCHPROP)是格式刷命令
H. 用adb shell am命令时候输入了adb shell am start -n JDRU.apk以后为啥提示Error:bad component name
bad component name,提示你参数不正确。想必你也看到这句话之前的一堆内容了,那些都是介绍shell am命令的,这里只讲重点。
$adbshellamstart
usage:am[subcommand][options]
usage:amstart[-D][-W][-P<FILE>][--start-profiler<FILE>]
[--samplingINTERVAL][-RCOUNT][-S][--opengl-trace]
[--user<USER_ID>|current]<INTENT>
那么咱们启动app使用的intenet,至于什么是intent,自己去了解下。再来看看intent的说明
<INTENT>:
[-a<ACTION>][-d<DATA_URI>][-t<MIME_TYPE>]
[-c<CATEGORY>[-c<CATEGORY>]...]
[-e|--es<EXTRA_KEY><EXTRA_STRING_VALUE>...]
[--el<EXTRA_KEY><EXTRA_LONG_VALUE>...]
[-n<COMPONENT>][-p<PACKAGE>][-f<FLAGS>]
........
(省略N多行)
只看重点 -n 这行,那么按照说明,启动一个app应该是这样的构造,当然后面可以加参数什么的
amstart-n{包(package)名}/{包名}.{活动(activity)名称}
包名以及启动的入口都可以从aapt中得到信息,分别为
package: name和launchable-activity
一个网上最简单的例子:
amstart-ncom.android.calculator2/com.android.calculator2.Calculator
自己多试试就会成功,找对包名类名和入口,没问题的
I. android 中用am命令在浏览器的原窗口打开新的url
你好:
呵呵,我可能明白你的意思,不过,我需要说的是,am 也就是activity manager 是可以用来开启应用的,你希望通过一条现成的命令来将URL 输入到地址栏中的话,我可能很负责任的告诉你,木有办法的啦,需要自己写instrumentationtestcase 才能实现