皮皮网

【htmldiv车源码】【扫码巡检源码】【极致打赏源码】adbd 源码

2024-11-19 01:27:30 来源:OnlinePlayer源码

1.升级安卓4.2.2版本后,源码手机无法连接电脑的源码问题怎么解决?
2.如何调试Android Framework
3.Android Adb 源码分析(一)
4.linux下关于adb命令的一些知识

adbd 源码

升级安卓4.2.2版本后,手机无法连接电脑的源码htmldiv车源码问题怎么解决?

       第一 手机设置里面,把usb调试打开,源码再连接电脑,源码扫码巡检源码手机会自动安装驱动。源码极致打赏源码

       第二 对应你手机的源码型号,在网上搜索连接电脑需要的源码驱动,可以在你手机的源码官网上下载。

       第三 可能是源码找的ROM包有问题,可以尝试换一个4.的源码。

       最后,源码如果你的源码spring企业项目源码手机配置不再三星note的配置以上的话,不推荐刷4.0以上版本:1.耗电高 2.内存占用偏大 3.手机配置跟不上用上很卡。源码

       (以上为我本人观点,源码征途2008版源码供楼主参考) 回答完毕,收工,求最佳!

如何调试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中声明的,因此,我们找到「系统设置」这个程序的源码即可;源码在 .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