皮皮网
皮皮网

【突袭风暴源码】【idc系统php源码】【一言源码】nexus 5源码

来源:android仿京东源码 发表时间:2024-12-22 11:09:01

1.crash流程详解(完结撒花)
2.安卓系统的手机_最接近原生安卓系统的手机
3.如何调试Android Framework
4.Android对内核有什么要求吗?还是随便是个Linux kernel都可以跑Android?
5.使用Google Pixel5手机调试AOSP(代码下载、编译、刷机、调试)详细攻略

nexus 5源码

crash流程详解(完结撒花)

       终于,我用上了珍藏的Nexus 4和Nexus 5x,因为想体验Android 7的突袭风暴源码更新,选择从Nexus 5x开始刷机,过程非常简单易行。

       为了快速完成实验,我直接对AOSP源代码进行了修改,插入了一些关键点的插桩,主要关注于crash前后内存操作的部分。

       这里要讨论的是Android 5.X中MPEG4编码文件解析中的漏洞。在parseChunk函数中,stsc box的sampletoChunk size计算存在问题。原本右值使用的是int*int,而左值为int,大部分情况下不会导致溢出。然而,版本5.X中的关键结构myDataSource紧跟其后,其内存地址的分配可能会因溢出而受到影响,尽管通常只会引发crash而非严重覆盖。

       到了Android 7.X,我发现MPEG4的处理已修复了这个问题,通过调整内存分配顺序来防止覆盖。我巧妙地修改了malloc空间,人为制造了内存溢出,以重现crash。然而,实际操作中,我发现crash报告并未如预期地触发我设定的插桩点,这让我意识到一个关键问题:

       ASLR和不同设备的idc系统php源码内存布局使得相同的漏洞在不同环境下的表现千差万别。重现Tombstone所述的crash对程序员来说并非易事,因为crash可能由内存污染而非控制流篡改导致,这使得传统的变量追踪分析难以奏效。

       因此,我们需要将重点转向内存的分析。静态分析结合crash报告,虽然能大致还原Binder通信后的路径,但可能不包含错误行为。人工调试在ASLR保护下,难以定位到准确的代码行,特别是在内存泄露这类问题上,其随机性使得复现和定位变得困难。

       这就是当前业界在处理这类问题时所面临的挑战。

安卓系统的手机_最接近原生安卓系统的手机

       最接近原生安卓系统的手机

       使用原生安卓的手机包括:诺基亚、LG、索尼、Nexus、Google pixel的一些国外品牌,使用的手机系统都是原生安卓系统。 原生安卓是指没有经过修改的安卓系统,不包含任何个人或者团队后期制作并且添加的新功能。

       原生安卓系统手机推荐

       采用安卓原生系统的手机非常,例如:摩托罗拉Moto E、摩托罗拉Moto G(版)、谷歌Nexus 5、HTC One (M8)(Google Play版)等等。安卓原生android系统是指Google公司发布,没有经过第三方修改的安卓系统。

       安卓原生系统手机有哪些

       你好,一加pro使用的手机系统是oppo的coloros。所有国内的一言源码手机厂商使用的系统都是基于安卓系统的再次开发而来,从没有任何一家厂商使用过原生安卓,一加以前使用的也是基于安卓的研发的氢os,并不是原生安卓,希望能对你有所帮助。

       搭载原生安卓系统的手机

       不是所有的安卓手机都可以刷安卓的原生系统的,比如一些小米、魅族等,他们是在android系统的基础上修改了源代码进行重新编译,所以在系统架构上都会不一样,是不能刷原生的系统的,否则会导致无法运行。

       android系统因为是开源的,可以修改,所以版本很多。

       什么手机用的原生安卓系统

       安卓手机都可以刷原生安卓系统。

       安卓原生系统手机推荐

       原生安卓系统手机可以用谷歌,比如摩托罗拉

       有原生安卓系统的手机

       华为手机都是安卓系统,是华为官方定制的EMUI系统。Emotion UI是华为基于Android进行开发的情感化操作系统。拥有简化的用户界面、新的手势导航和HiVision的“AI”功能,系统在国内已经向部分机型推送更新,采用了自然极简的设计。EMUI9.0版本设置项精简%、全局统一化的设计、便捷的单手操作、全新的手势导航,提供了良好的交互体验,UX融入了大自然的声音、色彩、光影,jquery css 源码解释回归自然的沉浸式设计。

       1、合一桌面,将桌面和主菜单合一的Home减少了导航的步骤,针对入门用户提升易用性。Me Widget将媒体类和交流类的信息及功能整合在一。

       2、情景模式,在用户的许可情况下,手机可以利用自身配备的各种感应器以及相关技术来定位、跟踪时间和其它信息,当用户在健身房,在开车或是在一个会议中时,手机都可以智能的为其选择最适合当前场景的情景模式。

       3、语音助手,语音助手可以用于打电话,发短信,实时导航,切换情景模式等。

       搭载安卓原生系统的手机

       使用原生安卓的手机包括:诺基亚、LG、索尼、Nexus、Google pixel的一些国外品牌,使用的手机系统都是原生安卓系统。 原生安卓是指没有经过修改的安卓系统,不包含任何个人或者团队后期制作并且添加的新功能。

       最接近原生安卓系统的手机有哪些

       原生Android和定制安卓的一些明显的区别。

       系统自动管理后台vs 用户管理应用自启和唤醒

       国产定制安卓基本允许在免Root状态下,就能控制应用自启、智慧同城圈源码权限和相互唤醒等原本是取得Root权限之后才能实现的功能,甚至这一功能还在三星等部分国际大厂的系统中实现;而原生Android系统则无法对这些直接进行设置,只能Root后通过第三方应用进行管理,且目前并不是太稳定。

       众所周知,由于国内的安卓应用滥用唤醒权限和通知栏推送,因而经常会导致多条推送一起骚扰用户,让用户防不胜防,而这一功能实际上是不少国内用户所需要的。

       统一界面字体vs丰富的主题字体引擎

       原生Android的界面和字体都是完全统一的,系统内没有自带的主题引擎。注意,原生安卓不等于CM等支持主题引擎的第三方ROM。而定制安卓为了张扬用户的个性,基本都会内置专用的主题或字体引擎方便用户更换。

       原生安卓彩蛋 vs 没有彩蛋

       原生安卓多次点击版本号就会跳出安卓彩蛋,例如安卓7.0的就是N字母,之后还可以玩抓猫游戏。而部分国产定制的安卓系统就把这个菜单给砍掉了,不过也有一些保留了彩蛋的国产厂商,例如华为、一加等。

       内置谷歌全家桶 vs 残血阉割版系统

       原生系统的一大特点就是内置了丰富的谷歌全家桶,不仅包括谷歌服务、Play商店、环聊等常用应用,甚至还有谷歌Play音乐、**、图书、游戏等各种嫡系app。而因为众所周知且不可描述的原因,安卓系统到了国内这些全家桶基本要剔除。

       系统臃肿vs 极度精简

       由于加入了各种各样的定制功能,定制安卓的系统往往显得比较臃肿,即使另外不运行app,运存占用也是非常大的。而原生Android主打的则是极度精简,占用运存较小,即使是小运存手机,在管理好权限的基础上也不至于卡死。

       各种一键式设置 vs 最基本设置

       国产定制安卓在交互理念上有些像iOS,就是把所有的功能都给用户准备好了,这样用户只需要自己开关某些功能,即可充分实现自定义。

       而原生Android则不同,其设置菜单仅有一些最基本的选项,以满足用户使用。如果你动手能力较强的话,原生Android反而能提供更大的发挥空间让你充分的DIY。

       谷歌Play商店 vs 各厂商应用商店

       原生安卓内置的应用商店是安卓系统的官方商店,前身叫安卓市场(Android Market),现在叫作谷歌Play商店。其拥有最正规、权限最干净且更新速度最快的一手国内外安卓app资源,但同样因为不可描述原因无法直接访问。

       因此,国内各大厂商也在定制安卓中加入了自己的应用商店,很多都是挂靠在应用宝等第三方市场下,实现资源互通。国内应用市场的生态就比较乱,权限比较杂,各种广告弹窗,另外安全性也是个问题。

如何调试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你不知道的调试技巧;我就不再复述了。望采纳,谢谢。

Android对内核有什么要求吗?还是随便是个Linux kernel都可以跑Android?

       Android对内核的要求并非随意,而是与Linux kernel的兼容性和定制化紧密相关。作为操作系统的核心组件,Android内核并非所有Linux内核都能胜任,特别是对于驱动芯片、处理器启动和硬件设备的管理。以高通ARM手机芯片为例,其内核选择往往依据芯片特性和谷歌的需求。

       高版本的Linux kernel,如4.9.y,由于优化了代码结构,减少了核心体积,设计理念更先进,被高通采用作为longterm分支。比如,高通芯片就使用了这一版本,并结合了安卓通用内核android-4.9-x,作为其基础的板级支持包(BSP)。

       内核版本的选择通常由芯片厂商主导,Android通用内核与上游的longterm线有着密切的关系。高通在芯片研发初期就以最新的longterm版本作为基础,如caf系列,它们倾向于在芯片点亮后迅速整合安卓内核的源码。

       然而,Android内核并非单纯依赖Linux kernel,谷歌有自己的定制化需求,例如交互式CPufreq调节器,MTP/PTP功能等。这些功能由于特定原因不能直接提交到Linux kernel,因此在安卓内核中实现。另一方面,一些供应商和OEM特有的功能,如sdcardfs,也通过这种方式为Android设备提供支持。

       尽管理论上任何Linux内核理论上可以尝试运行在Android设备上,但对于专业内核开发者来说,这需要高度的适配和调试。例如,某开发者尝试将Nexus 5的内核升级到4.4内核版本,但这样的工作涉及到大量的补丁移植和调试,且需要对芯片架构有深入理解。

       Android内核版本号的重要性不言而喻,从3.4.x到 Pie的升级,内核主要驱动硬件设备,但新功能如FBE文件级加密、SELinux和EAS调度等,需要更高级别的内核版本才能实现。Oreo引入的sdcardfs文件系统,开发者们会将其从高版本内核移植到低版本,以优化旧设备的性能。

       安卓版本的特性与内核版本兼容性密切相关。例如,Android Pie要求的内核优化可能在旧设备上无法实现,如安全性和稳定性。随着AOSP的不断发展,设备树blob的处理方式也在变化,这进一步强调了内核版本的必要性。

       对于安全问题,Google非常重视,定期发布针对安卓内核的CVE分支,并在像Pixel这样的设备上启用CFI编译。随着内核版本的演进,4..y以下的内核已不再受安卓通用内核的支持,这意味着安全更新和新功能的兼容性要求更高。

       综上所述,Android对内核的需求并非随意选择,而是经过精心设计和定制,以确保兼容性、性能和安全性的完美结合。每个版本的Android都对应着特定的内核版本,以适应不断变化的技术需求和安全标准。

使用Google Pixel5手机调试AOSP(代码下载、编译、刷机、调试)详细攻略

       为了在真实设备上调试Android源代码,购买了Google Pixel 5手机,实现这一目标。

       下载AOSP代码,查阅相应教程以获取详细信息。为了适配Pixel 5,选择代码的特定分支、TAG和build ID。这些元素确保了能够下载与设备型号兼容的源代码。点击链接访问AOSP源代码页面,关注支持设备列表、标记和build ID,确保下载的代码能够与目标设备Pixel 5兼容。

       执行命令下载Pixel 5代码,使用特定build ID下载Nexus和Pixel设备的驱动二进制文件。下载后,解压shell脚本,执行脚本,接受协议并开始解压过程。解压后,即可开始代码编译。

       在编译时,选择合适的lunch选项。通过访问编译配置页面,找到并使用针对Pixel 5设备的编译选项。执行命令启动编译过程。

       刷机前,确保USB调试功能已打开,执行fastboot和adb命令。在根目录执行特定命令以刷入编译后的镜像,等待刷机完成并重启手机。

       为了在编译的Pixel 5设备上进行调试,使用userdebug版本,执行特定命令将修改后的应用推送到设备上。在Launcher中加入日志信息,验证修改效果,确保调试代码的正确性。

       值得注意的是,自编译的AOSP版本不包含Google移动服务(GMS)及其应用,需要自行内置。此外,系统应用在AOSP中可能不如原生系统美观,但此不足不会影响调试代码的主要目的。

相关栏目:百科