把断点打到Framework!编译系统、烧录固件和调试系统源码三部曲

有什么用

1.由于能够修改源代码,从而进行调试,更方便学习系统源码

2.为了调试某些疑难杂症的Bug,可以在Framework里面加入自己的Log,让程序运行在此OS,方便调试

3.由于目前市面的手机大部分都是定制过的。定制过的系统代码与Android原生的系统代码肯定对不上,所以无法进行Framewordk层的调试。只有让自己的手机烧录自己编译的系统,才能让代码跑进自己系统层的代码。

下载谷歌原生源码

0.翻墙或者配谷歌的hosts

1.找出想要下载哪个分支:
https://android.googlesource.com/platform/manifest/+refs

2.开始repo
repo init -u https://android.googlesource.com/platform/manifest -b + 目标分支
repo sync -j8


编译系统

方法1.完整地编译
1)配置环境变量:source build/envsetup.sh
2)执行 lunch ,选择要编译哪个版本的固件
3)执行 make update-api
4)执行 make -j8 (-jn,n为并发线程数)

方法2.模块化编译
当第一次完整地系统编译成功后,以后可以使用模块化编译
1). build/envsetup.sh
2)lunch 中选择之前的版本号
3)执行mmm 或mm 命令开始编译。
mmm和mm效果是一样的,都是第一次编译完成后,用来进行模块化编译
mmm:在源码的根目录执行:mmm 模块路径
mm:切换到模块路径,执行mm


烧录固件

0.前提需要fastboot已经被解锁的手机。否则执行不了fastboot的刷机命令,提示权限不足
有些手机比如nexus5可以用命令解锁,有些则不可以。
解锁:
进入fastboot模式:adb reboot bootloader
解锁命令:fastboot oem unlock

方法1.整个固件刷机
1)进入源码编译生成的目录:out/target/product/xxxxxx/ ,方便传入system.img等
2)进入fastboot模式:adb reboot bootloader
3)清楚手机数据:fastboot -w -p flashall (假如fastboot没有权限,这一步就回卡住了)
4)刷boot:fastboot flash boot boot.img
5)刷recovery:fastboot flash recovery recovery.img
6)刷system:fastboot flash system system.img
7)刷userdata:fastboot flash userdata userdata.img

方法2.只替换framework层代码
framework层的代码会打包成各个jar文件,修改了framework代码后,不需要重新刷固件。只需要替换手机里面的/system/framework/里面对应的jar包即可。

比如修改了ActivityManagerService里面的函数
1)模块化编译:frameworks/base/sercices/ ,在out目录下生成对应的services.jar
2)替换手机的jar包
adb root
adb remount
adb push services.jar /system/framework/
adb reboot


调试系统源码

1.修改Android Studio(以下简称AS)的内存配置

因为在导入源码时需要消耗大量内存,所以先修改IDEA_HOME/bin/studio64.vmoptions(x86的机器修改studio.vmoptions)中-Xms和-Xmx的值。文档中使用的是748m, 可自行修改。

2.生成导入AS所需配置文件(*.ipr)

1)检查out/host/linux-x86/framework/目录下是否有idegen.jar
如果idegen.jar不存在,执行:
mmm development/tools/idegen/
在5.0.1的源码中会生成res.java的文件夹,导致idegen.jar运行时抛FileNotFoundException,这是idegen的代码不够严谨造成的。
2)执行:development/tools/idegen/idegen.sh
等待出现类似下面的结果:
Read excludes: 5ms
Traversed tree: 44078ms
这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件

Tips:
AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:

<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />

删除掉所有不需要的module-library项
这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.

3)在AS中打开源码根目录下新生成的android.ipr

3.解决源码中跳转错误问题

前提是手机或者虚拟机的固件的源码跟导入Android Studio的源码是同一份源码,这样代码才对得上。
1)为当前工程设置正确的SDK和JDK

2)设置'Modules'的依赖

先将所有依赖删掉,只留下上图'1'所指向的两个(注意:这里删除全部只是为了方便。如果确实用到了.jar,在将它们的路径添加进来就可以了.

如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar)

点击上图中'2'指向的'+'并选择上图'3'指向的'Jars or directories'选项,依次将frameworks和external文件夹添加进来.如:

3)去掉Android SDK的 classpath

上图有点出入,删除的不是JDK的classpath,而是project指定到的Android API对应的Classpath

4)其他
有可能会提示缺少AndroidManifest.xml文件
解决方法:只需在源码根目录加一个声明minSdkVersion的AndroidManifest.xml文件即可(分享了一个AndroidManifest.xml
如:
<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdkandroid:minSdkVersion="21"/></manifest>

4.开始调试

在代码中加断点,然后选择'Run'->'Attach debugger to Android process'或者直接点击下图所示的图标

在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.

可以在View.java随便一个函数里下断点,看能否有效。


错误解决

问题:
make:[out/target/common/obj/APPS/Calculator_intermediates/classes-full-debug.jar]错误41make:正在等待未完成的任务....

解决方法:
以上错误是由于编译系统文件时没安装所需要包,以下是整个过程中所需的所有包:
$sudo apt-get install git-core gnupg gperf libsdl-dev libesd0-dev
$sudo apt-get install libwxgtk2.6-dev zip curl minicom tftpd
$sudo apt-get install uboot-mkimage libx11-dev libncurses-dev
$sudo apt-get install expect bison build-essential flex zlib1g-dev


参考网站

http://www.cnblogs.com/Lefter/p/4176991.html
http://blog.csdn.net/leiming32/article/details/49658657

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容