美文网首页Android进阶之路Android技术知识Android开发经验谈
把断点打到Framework!编译系统、烧录固件和调试系统源码三

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

作者: InKenKa | 来源:发表于2017-01-12 21:33 被阅读287次

    有什么用

    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

    相关文章

      网友评论

        本文标题:把断点打到Framework!编译系统、烧录固件和调试系统源码三

        本文链接:https://www.haomeiwen.com/subject/kwdjbttx.html