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 才能實現