1.AndroidFramework ä¹å¯å¨ ServiceManager
2.android.bp
3.ADBLib 在 android 中的源码使用
AndroidFramework ä¹å¯å¨ ServiceManager
æ¬ææºç åºäº Android ï¼æ¶åç¸å ³æºç å¦ä¸ãServiceManagaer æ¯ Binder çå®æ¤è¿ç¨ï¼å¨ Binder æºå¶ä¸èµ·çéè¦çä½ç¨ãæ¬æå°ä»æºç çè§åº¦å¯¹å ¶è¿è¡åæï¼æ´ä½æµç¨å¦ä¸ï¼
æ¶åºå¾å¦ä¸ã
å æ¥çç ServiceManager æ¯å¦ä½å¯å¨çï¼
å¨ Zygote ä¸æä¸è¯´è¿ï¼ init è¿ç¨å¯å¨ç第äºé¶æ®µä¼è§£æ init.rc æ件ã
å¨è¿ä¹åä¼è§¦å trigger init ã
ç»å init.rc çç action init åäºä»ä¹ã
å½è§¦å trigger init åï¼ä¼å¯å¨ servicemanager æå¡ï¼å ¶å£°æå¦ä¸ã
对åºçæ§è¡æ件为 /system/bin/servicemanager ï¼å¨ç¼è¯åä½äº frameworks/native/cmds/servicemanager ä¸ï¼æ¥çç Android.bp ã
å ¶å¯¹åºçæºç 为 service_manager.c å binder.c ï¼å ¥å£å½æ° main() ä½äº servicemanager.c ã
å¯å¨å® ServiceManager åä¼æå¼ Binder 驱å¨ã
å¨ main() ä¸é¦å è°ç¨ binder_open() ã
binder_open() 主è¦åäºå¦ä¸äºæ ï¼
ç»ç»æä½ binder_state åé å åã
ç³»ç»è°ç¨ open() æå¼ /dev/binder ï¼å¦ææå¼é©±å¨å¤±è´¥ï¼åæ§è¡ fail_open éæ¾å åã
ç®åç解éä¸ä¸ä»ä¹æ¯ç³»ç»è°ç¨ï¼
ç±äºéè¦éå¶ä¸åçç¨åºä¹é´ç访é®è½åï¼é²æ¢ç¨åºè·åå«çç¨åºçå åæ°æ®ï¼ CPU åååºä¸¤ä¸ªæéç级ï¼ç¨æ·æå å æ ¸æã
ææçç¨æ·ç¨åºé½æ¯è¿è¡å¨ç¨æ·æï¼ä½ææ¶éè¦åä¸äºå æ ¸æçäºæ ï¼èå¯ä¸å¯ä»¥åè¿äºäºæ çå°±æ¯æä½ç³»ç»ï¼æ以ç¨åºéè¦åæä½ç³»ç»å起请æ±ï¼ä»¥ç¨åºçååæ¥æ§è¡è¿äºæä½ãè¿æ¶å°±éè¦ä¸ä¸ªä»ç¨æ·æåæ¢å°å æ ¸æä½ä¸è½æ§å¶å æ ¸æä¸æ§è¡çæºå¶ï¼è¿ç§æºå¶å°±æ¯ ç³»ç»è°ç¨ã
ç³»ç»è°ç¨ ioctl() ä¼ å ¥ BINDER_VERSION å½ä»¤è·å Binder 驱å¨çæ¬ï¼å¯¹æ¯çæ¬æ¯å¦ä¸è´ï¼ä¸ä¸è´åæ§è¡ fail_open éæ¾å åã
ç³»ç»è°ç¨ mmap() æ å° kb çå å空é´ï¼å³æ Binder 驱å¨æ件ç kb æ å°å°å å空é´ä¾ ServiceManager 使ç¨ï¼å åæ å°å¤±è´¥åæ§è¡ fail_map ï¼å ³é fd 并éæ¾å åã
ServiceManager è¿ç¨ mmap çå å大å°å¯ä»¥éè¿ adb shell å½ä»¤æ¥çã
å¯ä»¥çå°å åæ å°å°å为 0xff ~ 0xf ï¼å·®ä¸º 0x å³åè¿å¶ç kb ã
æå¼ Binder 驱å¨åä¼å° ServiceManager 设置为ä¸ä¸æ管çè ã
è°ç¨ binder_become_context_manager() ã
android æ°å¢ BINDER_SET_CONTEXT_MGR_EXT å½ä»¤æ¥è®¾ç½®å®å ¨çä¸ä¸æ管çè ï¼å¦æ设置失败ï¼å使ç¨åæç BINDER_SET_CONTEXT_MGR å½ä»¤æ¥è®¾ç½®ä¸ä¸æ管çè ï¼ä¸¤è åºå«å¨äºæ¯å¦æºå¸¦åæ°ã
æåä¼è¿å ¥å¾ªç¯ï¼ä» Binder 驱å¨è¯»åå解ææ°æ®ã
è°ç¨ binder_loop() è¿å ¥å¾ªç¯ï¼ä¸æå°éè¿ç³»ç»è°ç¨ ioctl() ä» Binder 驱å¨è¯»åæ°æ®ï¼å¹¶éè¿ binder_parse() è¿è¡æ°æ®è§£æã
注æè¿éè°ç¨ binder_loop() ä¼ å ¥ç svcmgr_handler() ï¼åé¢ä¼ä½¿ç¨å°ã
binder_write() ä¼å°è£ struct binder_write_read ï¼å¹¶éè¿ç³»ç»è°ç¨ ioctl() å°å¯¹åºçå½ä»¤ä¼ éç» Binder 驱å¨ã
binder_parse() ç¨æ¥è§£æä» Binder 驱å¨è¯»åå°çæ°æ®ï¼ç¶åæ ¹æ®ä¸åçå½ä»¤æ§è¡å¯¹åºçæä½ã
å 为 cmd å½ä»¤å¯è½æå¤ä¸ªï¼æ以éè¿ while 循ç¯æ¯æ¬¡å¤çä¸ä¸ª cmd å½ä»¤ï¼å¤ cmd çç»æ大è´å¦ä¸å¾æ示ã
è¿ééç¹çä¸ BR_TRANSACTION å½ä»¤ã
BR_TRANSACTION æ¯ Binder 驱å¨å Server 端åé请æ±æ°æ®ã
binder_transaction_data çç»æå¦ä¸ï¼å ¶è¡¨æäº transcation ä¼ è¾çå ·ä½è¯ä¹ï¼è¯ä¹ç è®°å½å¨ code ä¸ï¼ä¸åè¯ä¹ç æºå¸¦çæ°æ®æ¯ä¸åçï¼è¿äºæ°æ®ç± data æå®ã
å¨è§£æå® binder_transaction_data çå ·ä½è¯ä¹åï¼ä¼è°ç¨åé¢ä¼ ç» binder_loop() ç svcmgr_handler() ï¼å ¶å®å°±æ¯ switch case è¯ä¹ç åä¸åçäºæ ã
ServiceManager çåè½å ¶å®å¾ç®åï¼
è³æ¤ ServiceManager å°±åæå®äºã
android.bp
å¼ç¨åæ
æ©æçAndroidç³»ç»é½æ¯éç¨Android.mkçé ç½®æ¥ç¼è¯æºç ï¼ä»Android 7.0å¼å§å¼å ¥Android.bpã
Android 7.0å¼å ¥ninjaåkati
Android 8.0使ç¨Android.bpæ¥æ¿æ¢Android.mkï¼å¼å ¥Soong
Android 9.0强å¶ä½¿ç¨Android.bp
1.1 模å
å®ä¹ä¸ä¸ªæ¨¡åä»æ¨¡åçç±»åå¼å§ï¼æ¨¡åæä¸åçç±»åï¼å¦åé¢ä¾åä¸çcc_library_sharedï¼å½ç¶ç±»åè¿æå¾å¤ç§ï¼è¬å¦cc_binary android_app cc_library_staticççã模åå å«ä¸äºå±æ§æ ¼å¼ä¸ºâproperty-name:property-valueâï¼å ¶ä¸nameå±æ§å¿ é¡»æå®ï¼å ¶å±æ§å¼å¿ é¡»æ¯å ¨å±å¯ä¸çã
srcs å±æ§ä»¥å符串å表çå½¢å¼æå®ç¨äºç¼è¯æ¨¡åçæºæ件ãæ¨å¯ä»¥ä½¿ç¨æ¨¡åå¼ç¨è¯æ³ â:â æ¥å¼ç¨çææºæ件çå ¶ä»æ¨¡åçè¾åºï¼å¦ genrule æ filegroupã
1.2 åé
åéèå´éå®ä¸ºå£°æå®ä»¬çæ件çå ¶ä½é¨åï¼å¯ä»¥ä½¿ç¨ â=â å·èµå¼ï¼ ä½æ¯ä¸è½ä½¿ç¨ âï¼=â èµå¼ãåéæ¯ä¸å¯åçï¼ä½æä¸ä¸ªä¾å¤å®ä»¬å¯ä»¥éä¸+= èµå¼ï¼ä½ä» å¨åé被å¼ç¨ä¹åã
1.3 注é
Android.bp使ç¨åè¡æ³¨é//åå¤è¡æ³¨é/* */两ç§æ¹å¼ã
1.4ç±»å
å ·ä½æ¯æ以ä¸å ç§ç±»åï¼
1.5 æä½ç¬¦
Stringç±»åãå符串å表类ååMapç±»åæ¯ææä½ç¬¦â+âã
1.6 æ¯æ模åç±»å
Android.bpå¯ä»¥æ¯æandroid_appãcc_binaryãcc_binary_hostçå¤ç§ç±»åï¼å ·ä½å®ä¹å¨Androidæºç çbuild/soong/androidmk/cmd/androidmk/android.go
1.7 æ¯æé¢ç¼è¯ç±»å
1.8 æ¡ä»¶å¼ç¼è¯
ADBLib 在 android 中的使用
ADBLib在Android中的使用 在Android中,我们利用代码执行adb命令,源码如: Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec(cmd); 但部分adb命令因权限不足被拒绝。源码特别是源码源码精灵账号自Android P版本后,权限控制更为严格,源码比如获取CPU信息时,源码支付免签接口源码因权限问题被拒绝执行。源码此时,源码需要使用更高权限执行adb命令,源码ADBLib则成为解决这一问题的源码利器。 尽管网上关于ADBLib资料较少,源码但其源码简单,源码可访问开源地址: /cgutman/AdbLib。源码易语言保存源码失败在Google Play上亦有应用提供ADBLib的源码apk源码。 使用步骤如下:将tcpip端口设置为
生成加密密钥
获取手机IP
使用socket连接手机IP+
编写并执行cmd命令,源码读取返回值
具体操作包括:手机USB连接电脑,刀塔传奇2源码执行命令adb tcpip
生成密钥代码,使用adbcli库中的Adbcrypto类
获取手机IP地址
使用socket连接并执行cmd命令
为确保操作成功,需要添加权限。WAP 企业官网源码 首先,设置tcpip端口;然后生成密钥;获取手机IP;通过socket连接手机IP+端口,并执行命令。 通过ADBLib,我们能实现与手机的稳定连接,执行adb命令,获取设备信息,提升开发效率。