想第一時間擷取我的最新文章,請關注公衆号: 技術特工隊
在整機系統開發中,一般系統預設的adb開發是打開的,那麼在對外釋出的系統中,肯定是不希望預設打開adb的,但是在開發的過程中,肯定希望能夠通過某種操作打開adb,便于調試,這就需要在系統的某個部位做一個開關了。那麼這篇文章就是說說這邊是如何做到在系統中增加一個adb開關。
- 在系統中有一個usb deubg的開關,此開關是打開usb調試的對adb 但是通過預設設定的開發者模式都可以将其打開。
- adb 啟動肯定會啟動了一個
服務,那麼手動将該服務kill掉就可以關閉adb服務了.當然這樣是在adbd啟動後可以這麼做,但是還是直接預設就不啟動服務吧,需要的時候在打開吧。adbd
開啟
adbd
服務實際是再系統啟動中
init.rc
檔案中啟動的,裡面有很很多部分有調用
start adbd
或者
restart adbd
這部分是Android啟動流程中zygote(受精卵)啟動的,這部分涉及整個安卓的啟動流程,以及
init.rc
檔案的定義和使用大家可以檢視網上資料。
首先要将所有系統中
start adbd
和
restart adbd
的部分将其注釋掉,不使用系統預設啟動方式。一般都是在
init.rc
檔案中,在使用
find . -iname "init*.rc" | xargs grep "adbd"
将系統中所有有關adbd服務的都将其搜尋出來,避免遺漏。
再開看看
init.rc
檔案中的adbd服務是怎麼定義的:
1 2 3 4 5 6 | # adbd is controlled via property triggers in init.<platform>.usb.rc service adbd /sbin/adbd class core socket adbd stream 660 system system disabled seclabel u:r:adbd:s0 |
實際上它是定義了一個
sbin/adbd
檔案為adbd服務,在
init.rc
檔案中定義服務,那我們就使用
init.rc
檔案中的觸發器來控制adbd服務的打開與關閉。定義一個屬性
persist.sys.adbd.on
來标記adb的開關狀态,定義觸發器内容如下:
on property:persist.sys.adbd.on=1 start adbd on property:persist.sys.adbd.on=0 stop adbd |
看字面上的意思也可以大緻看出來當property系統屬性
persist.sys.adbd.on
改變的時候在init.rc中能夠收到改變的消息。且當屬性值為1的時候,則會調用
start adbd
,當為0的時候則會調用
stop adbd
,因為adbd是一個服務,通過start和stop即可控制,這樣通過程式中設定property屬性即可切換adb的狀态了。
大緻的實作過程就是這樣了,口才文采不行,表達不好,見諒。
這裡面需要了解一些Android啟動過程,以及init檔案定義等。
提示:要設定系統屬性需要系統權限才行,是以這種也隻是自己開發系統應用才起作用。