1.crash流程详解(完结撒花)
2.安卓系统的手机_最接近原生安卓系统的手机
3.å¦ä½è°è¯Android Framework
4.Android对内核有什么要求吗?还是随便是个Linux kernel都可以跑Android?
5.使用Google Pixel5手机调试AOSP(代码下载、编译、刷机、调试)详细攻略
crash流程详解(完结撒花)
终于,我用上了珍藏的Nexus 4和Nexus 5x,因为想体验Android 7的gbk源码转换更新,选择从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和不同设备的wap江湖传说源码内存布局使得相同的漏洞在不同环境下的表现千差万别。重现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融入了大自然的声音、色彩、光影,车型源码是什么回归自然的沉浸式设计。
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中可能不如原生系统美观,但此不足不会影响调试代码的主要目的。