有什么用
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