1.Android Adb 源码分析(一)
2.linuxä¸å
³äºadbå½ä»¤çä¸äºç¥è¯
3.升级安卓4.2.2版本后,源码手机无法连接电脑的源码问题怎么解决?
4.å¦ä½è°è¯Android Framework
Android Adb 源码分析(一)
面对Android项目的调试困境,我们的源码团队在项目临近量产阶段,将userdebug版本切换为了user版本,源码并对selinux权限进行了调整。源码然而,源码accessibilityservice源码这一转变却带来了大量的源码bug,日志文件在/data/logs/目录下,源码因为权限问题无法正常pull出来,源码导致问题定位变得异常困难。源码面对这一挑战,源码我们尝试了两种解决方案。源码
首先,源码我们尝试修改data目录的源码权限,使之成为system用户,源码以期绕过权限限制,然而数据目录下的flyme_n源码logs文件仍保留了root权限,因此获取日志依然需要root权限,这并未解决问题。随后,我们找到了一个相对安全的解决办法——通过adb命令的后门机制,将获取root权限的命令修改为adb aaa.bbb.ccc.root。这一做法在一定程度上增加了后门的隐蔽性,避免了被窃取,同时对日常开发的java麻将源码下载影响也降至最低。
在解决这一问题的过程中,我们对Android ADB的相关知识有了更深入的理解。ADB是Android系统中用于调试的工具,它主要由三部分构成:adb client、adb service和adb daemon。其中,adb client运行于主机端,提供了命令接口;adb service作为一个后台进程,敲鼓游戏源码位于主机端;adb daemon则是运行于设备端(实际机器或模拟器)的守护进程。这三个组件共同构成了ADB工具的完整框架,且它们的代码主要来源于system/core/adb目录,用户可以在此目录下找到adb及adbd的源代码。
为了实现解决方案二,我们对adb的代码进行了修改,并通过Android SDK进行编译。具体步骤包括在Windows环境下编译生成adb.exe,php打赏源码以及在设备端编译adbd服务。需要注意的是,在进行编译前,需要先建立Android的编译环境。经过对ADB各部分关系及源代码结构的梳理,我们对ADB有了更深入的理解。
在后续的开发过程中,我们将继续深入研究ADB代码,尤其是关于如何实现root权限的功能。如果大家觉得我们的分享有价值,欢迎关注我们的微信公众号“嵌入式Linux”,一起探索更多关于Android调试的技巧与知识。
linuxä¸å ³äºadbå½ä»¤çä¸äºç¥è¯
Android Debug Bridgeï¼ä¸è¬ç®ç§°ä¸ºadbï¼ä¸»è¦åæ¾å¨sdkå®è£ ç®å½ä¸çplatform-toolsæ件夹ä¸ï¼å®æ¯ä¸ä¸ªé常强大çå½ä»¤è¡å·¥å ·ï¼éè¿è¿ä¸ªå·¥å ·ä½ è½å¤ä¸ä½ çandroid设å¤è¿è¡äº¤äºãåæ¶è¿æ¯ä¸ä¸ªå å«äºä»¥ä¸ä¸é¨åçcs模å¼çç¨åºï¼
1) adb client
ããä»å¾ä¸ï¼æ们ç¥éclientæ¯è¿è¡å¨PC端çï¼æ¯å½æ们åèµ·ä¸ä¸ªadbå½ä»¤çæ¶åï¼å°±ä¼å¼å¯ä¸ä¸ªclientç¨åºãå½ç¶ï¼å½æ们å¼å¯DDMSæè ADTçæ¶åï¼ä¹ä¼èªå¨å建clientã
ããå½æ们å¼å¯ä¸ä¸ªclientçæ¶åï¼å®é¦å ä¼å»æ£æµåå°æ¯å¦å·²ç»æä¸ä¸ªserverç¨åºå¨è¿è¡çï¼å¦åä¼å¼å¯ä¸ä¸ªadb-serverè¿ç¨ã
ããææçclienté½æ¯éè¿ç«¯å£ä¸adb-serverè¿è¡éä¿¡çã
2ï¼adb daemonï¼adbdï¼
ããä»å¾ä¸ï¼æ们ç¥édaemonæ¯ä½ä¸ºä¸ä¸ªåå°è¿ç¨è¿è¡å¨æ¨¡æå¨/çå®Android设å¤ä¸çã
ããdaemon使ç¨ç«¯å£çèå´æ¯-ï¼æ¯ä¸ªæ¨¡æå¨/设å¤è¿æ¥å°PC端æ¶ï¼æ»ä¼å¼å¯è¿ä¹ä¸ä¸ªåå°è¿ç¨ï¼å¹¶ä¸ä¸ºå ¶åé äºä¸¤ä¸ªè¿ç»ç端å£ï¼æ¯å¦ï¼
ããããEmulator 1, console:
ããããEmulator 1, adb:
ããä¹æ£å 为æ¯ä¸ªè®¾å¤é½åä¸ç»ä¸¤ä¸ªç«¯å£ï¼ä¹å·²adbè¿æ¥ææºçæ大æ°é为ã
ãã说å端å£çä½ç¨ï¼å¨è¿ä¸¤ä¸ªç«¯å£ä¸ï¼å ¶ä¸å¶æ°ç«¯å£æ¯ç¨äºserver ä¸è®¾å¤è¿è¡äº¤äºçï¼å¯ä»¥è®©serverç´æ¥ä»è®¾å¤ä¸è¯»åæ°æ®ï¼èå¥æ°ç«¯å£æ¯ç¨æ¥ä¸è®¾å¤çadbdè¿è¡è¿æ¥éä¿¡çã
2) adb server
ããä»å¾ä¸ï¼æ们åæ ·å¯ä»¥ç¥éï¼serverä¹æ¯ä½ä¸ºä¸ä¸ªåå°çç¨åºè¿è¡å¨PC端çï¼ä»è´è´£ç®¡çclientè¿ç¨ä»¥åadb daemonä¹é´çéä¿¡ã
ããå½ä¸ä¸ªserverå¼å¯çæ¶åï¼ä»ä¼èªå¨ç»å®å¹¶ä¸çå¬ç«¯å£ï¼æ¥æ¶clientéè¿è¯¥ç«¯å£åéè¿æ¥çå½ä»¤ãåæ¶serverè¿ä¼å¯¹-é´çå¥æ°ç«¯å£è¿è¡æ«æï¼è¿è¡å¯¹å·²è¿æ¥è®¾å¤çå®ä½ã
1.2 常ç¨çadbå½ä»¤
é¦å æ们å æ¥ä»ç»ä¸ä¸ï¼adbå½ä»¤ç使ç¨æ ¼å¼å§ï¼
adb [-d|-e|-s ]
adbæ¯å¿ é¡»çï¼æ¥ä¸æ¥æ¹æ¬å·[]éé¢çå 容ä¸æ¯å¿ é¡»çï¼æåææ¯æ们éè¦æ§è¡çå½ä»¤æä½ï¼ä¾å¦ adb -s emulator- install UCBrowser.apk (è¿æ¯å®è£ UCæµè§å¨çææ)
ä¸é¢å ä»ç»ä¸ï¼åé¢å 个åæ°çå«ä¹å§ï¼
ãã-d: 让å¯ä¸è¿æ¥å°è¯¥PC端ççå®å®å设å¤æ§è¡å½ä»¤ï¼å¦æåç°USBä¸è¿æ¥æå¤é¨è®¾å¤ï¼å°ä¼æ¥é
ãã-e: 让å¯ä¸è¿æ¥å°è¯¥PC端ç模æå¨æ§è¡å½ä»¤ï¼å¦æåç°å¼å¯äºå¤ä¸ªæ¨¡æå¨ï¼å°ä¼æ¥é
ãã-sï¼éè¿è®¾å¤çåºåå·è¿è¡æå®è®¾å¤æ§è¡å½ä»¤
å¦æ设å¤åªè¿æ¥æä¸ä¸ªè®¾å¤æè ä¸ä¸ªæ¨¡æå¨çæ¶åï¼å¯ä»¥ä¸ç¨å£°æè¿ä¸ä¸ªåæ°ï¼adbé»è®¤ä¼è®©è¿é¨å¯ä¸è¿æ¥å°ç设å¤è¿è¡å½ä»¤æ§è¡ã
okï¼ä¸é¢å¼å§è®²è§£å¸¸ç¨çå½ä»¤å§ï¼
1) æ¥çå½åPC端è¿æ¥æå¤å°è®¾å¤ï¼
adb devices
ç»ç«¯ä¸çæ§è¡ç»æ为ï¼
ä»ä¸å¾ä¸ï¼æ们çå°äºè®¾å¤æç两ç§ç¶æï¼å ¶å®æ§è¡è¯¥å½ä»¤ï¼å¯è½è¿åçç¶ææä¸ç§ï¼
ããI. device 设å¤å·²ç»æåè¿æ¥å°äºadb-server
ã II. offline 设å¤å¹¶æ²¡æè¿æ¥å°adbæè 没æååº
ã III. no device 并没æ设å¤/模æå¨è¿æ¥
2) æ¥çadbççæ¬
adbãversion
ç»ç«¯ä¸çæ§è¡ç»æ为ï¼
3) ç»è®¾å¤è¿è¡è½¯ä»¶çå®è£
adb -s install
eg:
adb -s eba9 install D://Test.apk
ç»ç«¯ä¸çæ§è¡ç»æ为:
é¤äºä¸é¢è¿ç§æ¹æ³ï¼æ们è¿æå¦å¤ä¸ä¸ªå½ä»¤ï¼
adb -s shell pm install [options]
å ¶ä¸[options]ä¸æ常ç¨çé项æ¯-rï¼ä»£è¡¨çæ¬æ¬¡å®è£ æ¯éæ°å®è£ ï¼ä¼ä¿çç¨æ·æ°æ®ã
4) å¸è½½è®¾å¤ä¸å·²ç»å®è£ ç软件
adb -s uninstall
eg:
adb -s eba9 uninstall cn.uc.test
ç»ç«¯ä¸çæ§è¡ç»æ为:
é¤äºä¸é¢è¿ç§æ¹æ³ï¼æ们è¿æå¦å¤ä¸ä¸ªå½ä»¤ï¼
adb -s uninstall [options]
è¿éçoptionsæ¯-kï¼å ä¸è¯¥åæ°è¡¨æå¸è½½è½¯ä»¶åä¾æ§ä¿çç¨æ·æ°æ®
5) å°æ°æ®ä»è®¾å¤å¤å¶å°PCä¸
adb -s pull
eg:
adb -s eba9 pull /sdcard/stericson-ls D://
ç»ç«¯çæ§è¡ç»æï¼
å¨Dï¼//çä¸æ们ä¹å¯ä»¥åç°stericson-lsæ件
6) 讲æ°æ®ä»PC端å¤å¶å°è®¾å¤ä¸
adb -s push
eg:
adb -s eba9 push d://stericson-ls /sdcard/
ç»ç«¯çæ§è¡ç»æï¼
7) è·åè¿æ¥å°çææºçåºåå·
adb get-serialno
ç»ç«¯çæ§è¡ç»æï¼
8)è·å设å¤çè¿æ¥ç¶æ
adb -s get-state
eg:
adb -s eba9 get-stat
ç»ç«¯çæ§è¡ç»æï¼
9) çå¾ è®¾å¤è¿æ¥æå
adb wait-for-device
该å½ä»¤å°ä¼é»å¡ä¸ç´å°é»è®¤è¿æ¥çé£é¨æºå¨ç¶æå为deviceï¼ä¹å°±æ¯è¿æ¥æåã
) adb-server çå¼å¯ä¸å ³é
adb kill-server
adb start-server
ç»ç«¯çæ§è¡ç»æï¼
ææ¶åæ们å¼å¯serverä¼å¤±è´¥ï¼è¿æ¯å 为æä»¬è£ äºçææºå©æï¼è±è±èæè å ¶ä»è½¯ä»¶èªå¸¦æèªå·±çadbï¼å¯¼è´ç«¯å£å²çªå¼å¯å¤±è´¥ã主è¦å ³æé£äºè½¯ä»¶å¹¶ä¸ææé£äºè½¯ä»¶èªå¸¦çadbè¿ç¨éæ¥å³å¯ã
1.2 ææºæ§è¡Shellå½ä»¤
ä¼æå¨ç¥ï¼Androidçå æ ¸æ¬èº«å°±æ¯Linuxï¼æ以Androidæ¬èº«ä¹æ¯æLinuxå½ä»¤ï¼ä½æ¯å 为æ¯ææºç³»ç»ï¼æ以è¿è¡äºä¸å®çå åï¼é¨åå½ä»¤ä¸æ¯æï¼èä¸æ¯æçé¨åï¼æ们å¯ä»¥éè¿å®è£ busyboxè¿ä¸ªè½¯ä»¶è¿è¡
å¡«è¡¥ã
ä¸é¢æ们讲解ä¸å¦ä½å¨ææºä¸æ§è¡Shellå½ä»¤ï¼
1) æ¯æ¬¡é½å ä¸adb shellæ¥è¿è¡å½ä»¤çåéä¸æ§è¡
adb shell
2) å éè¿adb shellè¿å ¥ææºShellæ§è¡ç¶æï¼ç¶åç´æ¥è¾å ¥Linuxå½ä»¤ï¼å¦å¾ï¼
ãã
1.3 Activity Manager 常ç¨å½ä»¤ä¸åæ°è¯´æ
ä¸è¬æ åµä¸ï¼æ们æ常ç¨å®æ¥è¿è¡appçå¼å¯ï¼å¹¶ä¸ä¼ éä¸å®çåæ°è¿å»,æ¯å¦ï¼
adb shell am start -a android.intent.action.VIEW -n cn.uc.test/.MainActivity -d
å¨è¿éå°±ä¸å太è¿è¯¦ç»åéå¤ç说æäº
1.4 Package Manager 常ç¨å½ä»¤ä¸åæ°è¯´æ
1) 使ä¸ä¸ªapkå¤äºç¦ç¨ç¶æï¼ç¸å½äºå¸è½½äºï¼
disable
å ¶ä¸ PACKAGE_OR_COMPONENTçæ ¼å¼æ¯ package/classï¼ å¦ com.UCMobile/.main.UCMobile
eg:
adb shell su disable com.UCMobile/.main.UCMobile
ç»ç«¯æ§è¡ç»æï¼
åæ¶æ们å¨ææºä¸åç°ï¼UCæµè§å¨çå¾æ ä¸è§äº
2) 让ä¸ä¸ªapkä»ç¦ç¨ç¶ææ¢å¤è¿æ¥
enable
å ¶ä¸ PACKAGE_OR_COMPONENTçæ ¼å¼æ¯ package/classï¼ å¦ com.UCMobile/.main.UCMobile
eg:
adb shell su enable com.UCMobile/.main.UCMobile
ç»ç«¯æ§è¡ç»æï¼
åæ¶æ们ä»ææºä¸åç°ï¼UCæµè§å¨çå¾æ ååæ¥å¦ã
3) æ¥çä¸ä¸ªapkæå¨çè·¯å¾
pm path
eg:
adb shell pm path com.UCMobile
ç»ç«¯æ§è¡ç»æï¼
4) æ¥çææºä¸è£ çææçå
pm list packages
å次ä¸åè¿å¤ç说æ
1.5å ¶ä»å¸¸ç¨çadbå½ä»¤
1) å±å¹å½å
ä¾å¦ï¼å±å¹å¼å§å½å并ä¸å¨åå°/sdcardä¸ï¼åæ¶åå为demo.mp4
adb shell screenrecord /sdcard/demo.mp4
2) å ³é设å¤è¯·æ±ï¼å¼å¯è®¾å¤
adb shell stop
adb shell start
3)设å¤å ³æºä»¥åéå¯
adb reboot
adb shutdown
升级安卓4.2.2版本后,手机无法连接电脑的问题怎么解决?
第一 手机设置里面,把usb调试打开,再连接电脑,手机会自动安装驱动。
第二 对应你手机的型号,在网上搜索连接电脑需要的驱动,可以在你手机的官网上下载。
第三 可能是找的ROM包有问题,可以尝试换一个4.的。
最后,如果你的手机配置不再三星note的配置以上的话,不推荐刷4.0以上版本:1.耗电高 2.内存占用偏大 3.手机配置跟不上用上很卡。
(以上为我本人观点,供楼主参考) 回答完毕,收工,求最佳!
å¦ä½è°è¯Android Framework
å ¶å®æ´ä¸ªè°è¯è¿ç¨é常ç®åï¼
å¨ä½ è¦è°è¯è¿ç¨çåéä½ç½®æä¸æç¹
è·è¸ªä»£ç (Step in/out/overçç)
å¨å±å¼è®²è¿°è¿ä¸¤æ¹é¢ä¹åï¼æå¿ è¦å ç®åäºè§£ä¸è°è¯çåºç¡ç¥è¯ãJavaå¹³å°çè°è¯æ¯æä¸ä¸ªè§èåçæ åçï¼é£å°±æ¯JPDA(Java Platform Debugger Architecture);éè¿ JPDA æä¾ç APIï¼å¼å人åå¯ä»¥æ¹ä¾¿çµæ´»çæ建 Java è°è¯åºç¨ç¨åºã JPDA 主è¦ç±ä¸ä¸ªé¨åç»æï¼Java èææºå·¥å ·æ¥å£(JVMTI)ï¼Java è°è¯çº¿åè®®(JDWP)ï¼ä»¥å Java è°è¯æ¥å£(JDI)ã
Javaç¨åºçè°è¯æ éå°±æ¯éè¿ä¸ä¸ªè°è¯å¨(debugger)è·å对åºJavaèææºçä¿¡æ¯ï¼ä¸ææè¿°çJDWPå°±æ¯è°è¯å¨ä¸èææºéä¿¡çæ¡¥æ¢ãå¨dalvikèææºå é¨æä¸ä¸ªä¸é¨çjdwp线ç¨ï¼Androidç³»ç»çadbdè¿ç¨éè¿socketä¸å个èææºçjdwp线ç¨è¿è¡éä¿¡ï¼å¤é¨è°è¯å¨éè¿adbå·¥å ·ä¸adbdéä¿¡è¿èå®æä¸jdwpçéä¿¡ãæ们é常æ说çãattach debuggerãæçå°±æ¯è¿ä¸ªææââè¿æ¥å°æå®çéè¦è°è¯çè¿ç¨ã
è°è¯å¨å·¥ä½åç
å¦ä½å¨æ£ç¡®çå°æ¹ä¸æç¹
ãæ£ç¡®çå°æ¹ãå å«ä¸¤ä¸ªå«ä¹ï¼é¦å ï¼è°è¯æ¯ä»¥è¿ç¨ä¸ºåä½è¿è¡çï¼å¦æä½ éè¦è°è¯è¿è¡å¨è¿ç¨A ä¸ç代ç ï¼å´ædebugger attachå°äºBè¿ç¨ï¼é£ä¹è¿ä¸ªæç¹åæ ¹å¿å°±æ¯ç头ä¸å¯¹é©¬å´;å¦å¤å¢ï¼æ¯å¦ä½ æ³è°è¯Androidçå¤åªä½æ¡æ¶ï¼ä½ å¾ç¥émediaç¸å ³çç±»å¨åªå§ï¼ä¹å°±æ¯è¯´éè¦å¨æ£ç¡®çå½æ°éé¢ä¸æç¹ã
å¦ä½å¨åéçè¿ç¨ä¸æç¹?
å¦ææ¯è°è¯æ们èªå·±åçAppï¼å¨Android Studioéé¢é常ç®åï¼å¨Runèådeæåé¢æä¸ä¸ªattach debugger to android process çé项ï¼ç¹å»ä¹åä¼åºç°ä¸ä¸ªèåï¼éæ©èªå·±éè¦è°è¯çè¿ç¨å³å¯;ä½æ¯ï¼å¦æéè¦è°è¯Android Frameworkå±ç代ç ï¼è¿æ ·åæ¯è¾¾ä¸å°ç®ççââFrameworkå±ç代ç é常è¿è¡å¨å«çè¿ç¨(æ¯å¦ActivityManagerServiceè¿è¡å¨system_serverè¿ç¨)ï¼èè¿äºè¿ç¨é常æ åµä¸æ¯ä¸å¯è°è¯çï¼ä¹å°±æ¯è¯´å¨attach debugger to android process çé£ä¸ªèåéé¢ä¸ä¼æç³»ç»çè¿ç¨ï¼å¦ä¸å¾ï¼
æ®éçæ æ³è°è¯çAndroid设å¤
为ä»ä¹ä¸å¯è°è¯å¢?ä¸ææ们ç®è¦è®²è¿°äºè°è¯å¨çå·¥ä½åçï¼æ们ç¥éæ¯ä¸ä¸ªèææºæä¸ä¸ªjdwp线ç¨ï¼å¦æè¿ä¸ªçº¿ç¨æç»è¿æ¥å°è°è¯å¨ï¼ä½ ä¹å°±æ²¡åæ³å¯¹è¿ä¸ªè¿ç¨è¿è¡è°è¯äºãAndroidçææAppè¿ç¨é½æ¯éè¿Zygoteè¿ç¨forkåºæ¥çï¼æ们å¨android.os.Processè¿ä¸ªç±»éé¢å¯ä»¥çå°androidè¿ç¨çå¯å¨è¿ç¨æè¿ä¹ä¸å¥ï¼
if ((debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) != 0) {
argsForZygote.add("--enable-debugger");
}
ä¹å°±æ¯è¯´ï¼ä¸ä¸ªè¿ç¨æ¯å¦å¯ä»¥è°è¯æ¯ç±è¿ç¨å¯å¨æ¶åçåæ°å³å®ç;æ®éçAppè¿ç¨å¦ææ¯debug keystoreé»è®¤æ¯å¯ä»¥è°è¯çï¼ææè ä½ å¨AndroidManifestéé¢æå®debuggable为trueä¹æ¯å¯ä»¥è°è¯çã对系ç»è¿ç¨ï¼æ们åªæéåç³»ç»çº§å«çæ段ï¼è®©æ´ä¸ªç³»ç»å¯ä»¥è°è¯ââdebugçæè ç¼è¯åæ°debuggable为1çç³»ç»ã
解å³è¿ä¸ªåæ³å¾ç®åï¼ä½¿ç¨æ¨¡æå¨(çæºä¹è¡ï¼éNexusç³»åå·åçAndroidç³»ç»ï¼æç³»ç»å¯å¨çdebuggableåæ°ä¿®æ¹ä¸º1)ï¼æçNexus 5 å¯ä»¥è°è¯çè¿ç¨å¦ä¸ï¼
å¯è°è¯ä»»æè¿ç¨ç设å¤
è¿æ ·ï¼ç³»ç»ä¸ææçAndroidè¿ç¨é½å¯ä»¥è°è¯äº;è¿ä¸ç¹å¾éè¦ï¼æ¯å¦ä½ è¦åæActivityçå¯å¨æµç¨ï¼ç¸å½å¤ä¸é¨å代ç æ¯å¨ActivityManagerServiceæå¨çè¿ç¨system_serveræ§è¡çï¼å¦æä½ ææç¹æå¨å«çè¿ç¨ï¼å°±ä¼äº§çè·ä¸¢äºçæ åµãå¨æ¯å¦ï¼ä½ è¦è°è¯ActivityThreadçmainå½æ°ï¼å¨mainå½æ°éé¢æ§è¡äºä¸å¥attachï¼æç»è°ç¨AMSçattachApplicationçæ¶åï¼ä»£ç å°±éè¿Binder IPCè°ç¨å°äºAMSçsystem_serverè¿ç¨ã
æç½ä½ è¦æ§è¡ç代ç è¿è¡å¨åªä¸ä¸ªè¿ç¨ç¸å½éè¦ï¼å¨Androidä¸ï¼ç±äºBinderéä¿¡æºå¶çåå¨ï¼ãè¿ç¨è¿ç§»ã使ç¨çé常é常é¢ç¹ï¼å æ¤éè¦å¯¹binderæºå¶æä¸å®çäºè§£;详ç»çè¯å¯ä»¥åèæçå客ï¼Binderå¦ä¹ æå
å¦ä½å¨å¯¹åºç代ç å¤ä¸æç¹?
å设æ们ç°å¨ædebugger attachå°äºæ£ç¡®çè¿ç¨ï¼é£ä¹æç¹åºè¯¥ä¸å¨åªéå¢?ç´è§æ¥è®²ï¼å°±æ¯è¯´æéè¦å¯¼å ¥ææçAndroidæºç å?å¦æä¸æ¯åºè¯¥å¯¼å ¥åªäºä»£ç ï¼æä¹å¯¼å ¥?
é¦å ï¼å¦æä½ éè¦è°è¯çç±»å¨sdkéé¢å¯¼åºäºï¼ä½ åæ ¹å¿å°±ä¸éè¦åå¯¼å ¥æºç ï¼Android Studioèªå¨å¸®ä½ å ³èäºè¿é¨å代ç (åææ¯ä½ ç¨SDK Managerä¸è½½äºsdkçæºç ï¼å¦ä¸å¾ï¼
SDK managerä¸è½½æºç
æ¯å¦ä½ è¦è°è¯ActivityManagerServceç±»çattachApplicationæ¹æ³ï¼é£ä¹å¾ç®å;å建ä¸ä¸ªç©ºçAndroid项ç®ï¼SDKçæ¬éæ©ä¸ä½ è¦è°è¯ç模æå¨/çæº çandroidç¸å(è¿å¾éè¦ï¼ä¸æä¼è®²è¿°);ç¶åattrach å°system_serverè¿ç¨ï¼ç´æ¥å¨attach_applicationä¸é¢æä¸æç¹;é便å¯å¨ä¸ä¸ªappï¼å¯ä»¥çå°æ们çæçè°è¯çé¢ï¼
è°è¯attachApplication
å¦æè¿é¨åç±»å¨sdkä¸æ²¡æå¯¼å ¥(æ¯å¦@hide)çï¼åæè åæ ¹å¿ä¸æ¯SDKçç±»ï¼(æ¯å¦ç³»ç»appçæºç )é£åºè¯¥æä¹åå¢?ç´æ¥å¯¼å ¥è¿é¨å代ç å³å¯ãä¸éè¦æ¯Android项ç®ï¼æ®éçJava项ç®å³å¯;举个ä¾åï¼åè®¾ä½ æ³è°è¯åçAndroidç³»ç»çãç³»ç»è®¾ç½®ãè¿ä¸ªç¨åºï¼è¯¥å¦ä½åå¢?
æ ¹æ®ä¸é¢çåæï¼æ们é¦å å¾ç¥éãç³»ç»è®¾ç½®˜ãè¿è¡å¨åªä¸ä¸ªè¿ç¨ï¼é常æ åµä¸è¿ç¨ååå°±æ¯å å;æ们æ¥åºè®¾ç½®çå åå³å¯ï¼èå åæ¯å¨æºç çAndroidManifeistä¸å£°æçï¼å æ¤ï¼æ们æ¾å°ãç³»ç»è®¾ç½®ãè¿ä¸ªç¨åºçæºç å³å¯;æºç å¨ / ï¼ç³»ç»Appçæºç å¨/packagesè¿ä¸ªåç®å½ä¸é¢ï¼æ们ä¸ä¸ªä¸ªæ¾ï¼æç»å¯ä»¥ç¡®å®ãç³»ç»è®¾ç½®ãçæºç å¨/platform/packages/apps/Settings/ ;ç¶åæ们æè¿é¨å代ç git cloneä¸æ¥ï¼å¯¼å ¥Android Studioï¼
è°è¯Settings
æ们å»AndroidManifestä¸æ¥å°ï¼ãç³»ç»è®¾ç½®ãçå å为ï¼com.android.settingsï¼è¿æ ·æ们attachå°è¿ä¸ªè¿ç¨ ï¼
attach settingè¿ç¨
ç¶åï¼æ们é便æ个æç¹ç©ä¸ç©ï¼æ¯å¦è¿å ¥è®¾ç½®ä¸»çé¢çæ¶åï¼æä¸æ¥;æ们å¨AndroidManifestä¸æ¥å°è®¾ç½®ç¨åºçå ¥å£çé¢ä¸ºï¼Settingsï¼æ们å¨è¿ä¸ªç±»çonCreateéé¢æä¸ä¸ªæç¹ï¼ç¶åè¿å ¥è®¾ç½®ç¨åºï¼åç°å®ç¾æ»´æä¸æ¥äºï¼
å¨settingä¸æç¹æå
OKï¼å°è¿é;åºè¯¥å¦ä¼å¦ä½å¨æ£ç¡®çä½ç½®ææç¹äºï¼æ£ç¡®çè¿ç¨ï¼æ£ç¡®çä½ç½®ãæ¥ä¸æ¥ï¼è¦å®æè°è¯ï¼è¿éè¦ä¸äºæå·§ã
å¦ä½è·è¸ªä»£ç ?
æè®¸ä½ ä¼è¯´ï¼è·è¸ªä»£ç ä¸å°±æ¯step in/out/overä¹ï¼è¿æä»ä¹é¾ç?ä½å ¶å®äºæ 并没æä½ æ³è±¡çé£ä¹ç®åï¼è¦ä¼é æ»´è°è¯ï¼è¿æ¯éè¦ä¸äºå§¿å¿çã
è¡å·å¯¹åº
è·è¸ªä»£ç ä¸ä¸ªé¦è¦çé®é¢æ¯è¡å·å¯¹åºãå¦æä½ å¨æ£ç¡®ä½ç½®ä¸äºæç¹ï¼ä½æ¯è·è¸ªçæ¶åï¼åæ¥è°è¯ï¼åç°è¿è¡ç代ç åAndroid Studioéé¢ç代ç 对ä¸ä¸å·ï¼é£ä¹å°±å¾èç¼;è¦ä½¿å¾è°è¯å¨çè¡å·è½å¤å¯¹åºï¼å¿ é¡»ä¿è¯è®¾å¤ä¸ç代ç åè°è¯å¨ç代ç æ¯åä¸ä»½;ç®åæ¥è¯´ï¼éè¦ä½¿ç¨Androidçåçç³»ç»(模æå¨ï¼Nexusç³»åçæº)ï¼ç¶åè°è¯å¨éé¢ä½¿ç¨çSDKçæ¬ï¼å¿ é¡»å设å¤çç³»ç»çæ¬ä¸è´ã
è¡å·ä¸å¯¹åºæä¹å?
ä¸å®è¦æ³¨æè¡å·å¯¹åºè¿ä¸ç¹ï¼è¿ä¼ä½¿è°è¯è¿ç¨ç®åå¾å¤;å¦æ没æåæ³ï¼è¡å·å¯¹ä¸ä¸ï¼é£è¯¥å¦ä½è°è¯å¢?
è¡å·ä¸å¯¹åºå¸¦æ¥çä¸ä¸ªé¦è¦é®é¢å°±æ¯ï¼ä¸æç¹çæ¶åé½æå¯è½åºç°é®é¢;æ¯å¦ä½ å¨TestClassç第è¡ä¸äºä¸ä¸ªæç¹ï¼ä½æ¯ç±äºè¡å·ä¸å¯¹åºï¼æå¯è½çæ£æ§è¡ç代ç 第è¡æ¯æ²¡ææä¹ç空è¡æè æ¯å¨ä¸ä¸ä¸ªå½æ°éé¢ï¼è¿æ ·æç¹å°±æ²¡æèµ·å°åºæçä½ç¨äºã
è¦è§£å³è¡å¥½å¯¹åºçé®é¢ï¼å¿ 须使ç¨æ¹æ³æç¹;æ们ç´æ¥å¨æ个å½æ°çå ¥å£è®¾ç½®æç¹ï¼è¿æ ·å³ä½¿è¡å·å¯¹ä¸ä¸ï¼ä¹è½å¨æ£ç¡®çå ¥å£åºæä¸æ¥ï¼è¿ä¸ç¹é常éè¦ã
解å³äºå¦ä½ä¸æç¹çé®é¢ï¼é£ä¹è¡å·ä¸å¯¹åºï¼æä¹ç¥éæ§è¡å°åªäºï¼æä¹æ¥çå±é¨åé?
è§å¯æ æ¡¢
å¨Android Studioçè°è¯å¨ç左边ï¼æ¾ç¤ºäºæ¯ä¸ä¸ªçº¿ç¨æ§è¡çæ æ¡¢ï¼æ æ¡¢éé¢å å«äºå½å线ç¨ä¸°å¯çä¿¡æ¯ï¼
çå°æ²¡ï¼çæ£è¿è¡ç代ç å¨åªä¸è¡ï¼å½åè¿è¡çæ¯ä»ä¹å½æ°ä¸ç®äºç¶;æ¥ä¸æ¥ä½ å¨step into/outçæ¶åï¼ä¸è½ä»¥æºä»£ç çè¡æ°ä¸ºåï¼èåºè¯¥ä»¥è¿ä¸ªæ æ¡¢ææ¾ç¤ºç代ç è¡æ°ä¸ºåã
çç»ä½¿ç¨æç¹
OKï¼ç°å¨ä¸è®ºè¡å·æ¯å¦è½å¯¹åºï¼æ们é½è½æ£ç¡®æ»´ä¸æç¹è°è¯äºãæç¹æå¾å¤ç§ç±»åï¼æ¹æ³æç¹ï¼watch pointï¼æ¡ä»¶æç¹é½è½å¤å¾å¥½æ»´è¾ å©æ们è°è¯;å¦æä½ è¿è¿å 个åè¯é½æ²¡æå¬è¯´è¿ï¼ä¸å®è¦æ¶è¡¥ä¸ä¸;å¯ä»¥åé æçå客ï¼Android Studioä½ ä¸ç¥éçè°è¯æå·§;æå°±ä¸åå¤è¿°äºãæé纳ï¼è°¢è°¢ã