androidsvc
『壹』 androidmigsvc是什麼
svc命令,位置在/system/bin目錄下,用來管理電源控制,無線數據,WIFI。
# svc
svc
Available commands:
help Show information about the subcommands
power Control the power manager
data Control mobile data connectivity
wifi Control the Wi-Fi manager
# svc power
svc power
Control the power manager
usage: svc power stayon [true|false|usb|ac]
Set the 'keep awake while plugged in' setting.//設置屏幕的常亮,true保持常亮,false不保持,usb當插入usb時常亮,ac當插入電源時常亮
# svc data
svc data
Control mobile data connectivity
usage: svc data [enable|disable]
Turn mobile data on or off.//設置移動網路的數據是否啟用
svc data prefer
Set mobile as the preferred data network//設置移動網路的數據優先於WIFI
# svc wifi
svc wifi
Control the Wi-Fi manager
usage: svc wifi [enable|disable]
Turn Wi-Fi on or off.//設置WIFI是否啟用
svc wifi prefer
Set Wi-Fi as the preferred data network//設置WIFI優先於移動網路的數據,一般應設置成這樣,除非你刻意使用移動網路數據傳輸
『貳』 android系統在啟動的過程中什麼時候會調用systempropertys
System Properties是怎麼一回事,又是如何實現的呢?
屬性系統是android的一個重要特性。它作為一個服務運行,管理系統配置和狀態。所有這些配置和狀態都是屬性。
每個屬性是一個鍵值對(key/value pair),其類型都是字元串。
這些屬性可能是有些資源的使用狀態,進程的執行狀態,系統的特有屬性……
可以通過命令adb shell :
getprop查看手機上所有屬性狀態值。
或者 getprop init.svc.bootanim制定查看某個屬性狀態
使用setprop init.svc.bootanim start 設置某個屬性的狀態
特別屬性 :
如果屬性名稱以「ro.」開頭,那麼這個屬性被視為只讀屬性。一旦設置,屬性值不能改變。
如果屬性名稱以「persist.」開頭,當設置這個屬性時,其值也將寫入/data/property。
如果屬性名稱以「net.」開頭,當設置這個屬性時,「net.change」屬性將會自動設置,以加入到最後修改的屬性名。
(這是很巧妙的。 netresolve模塊的使用這個屬性來追蹤在net.*屬性上的任何變化。)
屬性「 ctrl.start 」和「 ctrl.stop 」是用來啟動和停止服務。每一項服務必須在/init.rc中定義.系統啟動時,與init守護
進程將解析init.rc和啟動屬**。一旦收到設置「 ctrl.start 」屬性的請求,屬**將使用該屬性值作為服務
名找到該服務,啟動該服務。這項服務的啟動結果將會放入「 init.svc.<服務名>「屬性中。客戶端應用程序可以輪詢那個屬性值,以確定結果。
『叄』 這個開機啟動項可以禁止嗎XCAndroidSvc
1、在菜單欄中找到運行。
2、打開對話框後,輸入msconfig命令,點擊確定。
3、這樣就可以看到可以選擇禁止或者開啟的修改項。
這是服務裡面的程序,可以禁止的
『肆』 android servicemanager 怎麼實現service管理
ServiceManager是android中比較重要的一個進程,它是在init進程啟動之後啟動,從名字上就可以看出來它是用來管理系統中的service。比如:InputMethodService、ActivityManagerService等。在ServiceManager中有兩個比較重要的方法:add_service、check_service。系統的service需要通過add_service把自己的信息注冊到ServiceManager中,當需要使用時,通過check_service檢查該service是否存在。
主函數(anrdroid4.0/frameworks/base/cmds/servicemanager/service_manager.c)
從它的主函數代碼開始:
int main(int argc, char **argv)
{
struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;
bs = binder_open(128*1024);
if (binder_become_context_manager(bs)) {
LOGE("cannot become context manager (%s) ", strerror(errno));
return -1;
}
svcmgr_handle = svcmgr;
binder_loop(bs, svcmgr_handler);
return 0;
}
從main函數中可以看出,它主要做了三件事情:
打開/dev/binder設備,並在內存中映射128K的空間。
通知Binder設備,把自己變成context_manager
進入循環,不停的去讀Binder設備,看是否有對service的請求,如果有的話,就去調用svcmgr_handler函數回調處理請求。
服務注冊
再來看看ServiceManager中是怎麼樣去注冊服務的。先來看先,當有對service的請求時,調用的回調函數svcmgr_handler:
int svcmgr_handler(struct binder_state *bs,
struct binder_txn *txn,
struct binder_io *msg,
struct binder_io *reply)
{
struct svcinfo *si;
uint16_t *s;
unsigned len;
void *ptr;
uint32_t strict_policy;
// LOGI("target=%p code=%d pid=%d uid=%d ",
// txn->target, txn->code, txn->sender_pid, txn->sender_euid);
if (txn->target != svcmgr_handle)
return -1;
// Equivalent to Parcel::enforceInterface(), reading the RPC
// header with the strict mode policy mask and the interface name.
// Note that we ignore the strict_policy and don't propagate it
// further (since we do no outbound RPCs anyway).
strict_policy = bio_get_uint32(msg);
s = bio_get_string16(msg, &len);
if ((len != (sizeof(svcmgr_id) / 2)) ||
memcmp(svcmgr_id, s, sizeof(svcmgr_id))) {
fprintf(stderr,"invalid id %s ", str8(s));
return -1;
}
switch(txn->code) {
case SVC_MGR_GET_SERVICE:
case SVC_MGR_CHECK_SERVICE:
s = bio_get_string16(msg, &len);
ptr = do_find_service(bs, s, len);
if (!ptr)
break;
bio_put_ref(reply, ptr);
return 0;
case SVC_MGR_ADD_SERVICE:
s = bio_get_string16(msg, &len);
ptr = bio_get_ref(msg);
if (do_add_service(bs, s, len, ptr, txn->sender_euid))
return -1;
break;
case SVC_MGR_LIST_SERVICES: {
unsigned n = bio_get_uint32(msg);
si = svclist;
while ((n-- > 0) && si)
si = si->next;
if (si) {
bio_put_string16(reply, si->name);
return 0;
}
return -1;
}
default:
LOGE("unknown code %d ", txn->code);
return -1;
}
bio_put_uint32(reply, 0);
return 0;
}
在該回調函數中會判斷Service有什麼需要,如果是請求注冊service,那麼久執行:
case SVC_MGR_ADD_SERVICE:
s = bio_get_string16(msg, &len);
ptr = bio_get_ref(msg);
if (do_add_service(bs, s, len, ptr, txn->sender_euid))
return -1;
break;
我們再來看看do_add_service中做了什麼事情:
int do_add_service(struct binder_state *bs,
uint16_t *s, unsigned len,
void *ptr, unsigned uid)
{
struct svcinfo *si;
// LOGI("add_service('%s',%p) uid=%d ", str8(s), ptr, uid);
if (!ptr || (len == 0) || (len > 127))
return -1;
if (!svc_can_register(uid, s)) {
LOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED ",
str8(s), ptr, uid);
return -1;
}
si = find_svc(s, len);
if (si) {
if (si->ptr) {
LOGE("add_service('%s',%p) uid=%d - ALREADY REGISTERED ",
str8(s), ptr, uid);
return -1;
}
si->ptr = ptr;
} else {
si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t));
if (!si) {
LOGE("add_service('%s',%p) uid=%d - OUT OF MEMORY ",
str8(s), ptr, uid);
return -1;
}
si->ptr = ptr;
si->len = len;
memcpy(si->name, s, (len + 1) * sizeof(uint16_t));
si->name[len] = '