和Android源代码一起工作 | 海豚浏览器 胡继堂

35
Android DevCamp Produced by CSDN Website: http://devcamp.csdn.net/ Weibo: http://weibo.com/cmdnclub/

description

资深程序员多年代码实践总结:《和Android源代码一起工作》 | Android DevCamp 话题简介:本演讲将结合讲师多年的代码实践经验,主要介绍Android源代码以及相关内容,让应用开发者了解到如何利用Android源代码来提高自己对Android系统的理解,以及通过一些高级技巧来定位和分析产品中的问题,充分利用Android的各种特性,从而改进和增强自己的应用。演讲内容将分为分中级篇和高级篇。中级篇内容包含:下载和同步Android源代码,Android源代码目录结构分析,Android源代码和Eclipse的整合和浏览。高级篇内容包含:Android源代码编译,系统编译,模块编译,Android源代码Java代码调试,Android源代码Native代码调试。演讲中也将穿插一些实践案例进行分析。 讲师介绍:胡继堂,原微软亚洲工程院软件开发工程师,目前在百纳信息担任研发主管,负责海豚浏览器Android版的开发工作。2010年开始从事Android平台上的开发,熟悉Android应用开发的各种技术,并喜欢分析Android系统框架和底层机制。自工作以来的方向一直都在移动设备的系统和软件开发上,对移动互联网有很大的热情。

Transcript of 和Android源代码一起工作 | 海豚浏览器 胡继堂

Page 1: 和Android源代码一起工作 | 海豚浏览器 胡继堂

Android  DevCamp  Produced  by  CSDN    Website:    http://devcamp.csdn.net/  Weibo:    http://weibo.com/cmdnclub/      

Page 2: 和Android源代码一起工作 | 海豚浏览器 胡继堂

和Android源代码⼀一起工作 胡继堂 海豚浏览器开发主管

Page 3: 和Android源代码一起工作 | 海豚浏览器 胡继堂

问题  0 为什么Touch  Event没有收到?  0 为什么界面上某些View的位置和大小和我预想的不一样?  

0 怎么知道我的UI动画有多流畅?  

Page 4: 和Android源代码一起工作 | 海豚浏览器 胡继堂

Agenda  0 下载与浏览

0 调试与编译

0 源代码利用示例

0 Q&A

Page 5: 和Android源代码一起工作 | 海豚浏览器 胡继堂

下载与浏览  

Page 6: 和Android源代码一起工作 | 海豚浏览器 胡继堂

准备环境 (仅同步代码)

操作系统

系统工具

Page 7: 和Android源代码一起工作 | 海豚浏览器 胡继堂

准备足够的空间

0 2.3源代码需要10G空间

0 4.0源代码需要20G空间

Page 8: 和Android源代码一起工作 | 海豚浏览器 胡继堂

用repo同步代码 0  repo: 管理多个GIT项目的工具。 0 下载repo

0  https://dl-ssl.google.com/dl/googlesource/git-repo/repo

0 初始化,选择代码版本 0 新建⼀一个目录存放源代码 (假设为$srcroot) 0  repo  init  -­‐u  https://android.googlesource.com/platform/manifest  -­‐b  <branch  or  tag>  

0  Branch or tag = froyo, gingerbread, android-4.0.1_r1…

0 参考 0  http://source.android.com/source/downloading.html

Page 9: 和Android源代码一起工作 | 海豚浏览器 胡继堂

开始同步

0  进入源代码目录  

repo  sync  [-­‐jn]  

Page 10: 和Android源代码一起工作 | 海豚浏览器 胡继堂

用Eclipse来浏览源代码(Java)

拷贝$srcroot/development/ide/eclipse/.classpath 到代码根目录 $srcroot

用Eclipse创建⼀一个空的Java工程

将工程的代码位置设为$srcroot

Done

假设Android源代码放在$srcroot

Page 11: 和Android源代码一起工作 | 海豚浏览器 胡继堂

Tips 设置eclipse.ini,防止Out Of Memory

-Xms128m -Xmx512m -XX:MaxPermSize=256m

常用快捷键

Ctrl+shift+T 查看类型 Ctrl+shift+R 查看资源 Ctrl+o 查看类里的成员 Ctrl+T 查看类的继承关系

http://source.android.com/source/using-eclipse.html

Page 12: 和Android源代码一起工作 | 海豚浏览器 胡继堂

Android代码组织 $srcroot/packages/  $srcroot/framework/base  $srcroot/dalvik/  $srcroot/libcore/  

Page 13: 和Android源代码一起工作 | 海豚浏览器 胡继堂

Android代码组织 $srcroot/external/<project>  $srcroot/bionic/libc  

Page 14: 和Android源代码一起工作 | 海豚浏览器 胡继堂

调试与编译  

Page 15: 和Android源代码一起工作 | 海豚浏览器 胡继堂

用Eclipse调试Java代码

0 前提一:需将Android源代码加入Eclipse  0 前提二:Device或模拟器的代码能和同步的代码匹配  

0 模拟器:基本上都能找到对应的代码  0 Device:需用官方的ROM,推荐Nexus  One(2.1-­‐2.3)  Nexus  S(2.3-­‐4.1)和Galaxy  Nexus(4.0-­‐4.1)  

Page 16: 和Android源代码一起工作 | 海豚浏览器 胡继堂

•  选中callstack上要查看的方法

•  右键选择Edit Source Lookup

•  将Android代码工程加到Source Lookup里去

查看callstack上的代码

Page 17: 和Android源代码一起工作 | 海豚浏览器 胡继堂

在Android源代码里设断点

就直接在Android源代码里设断点。。。

Page 18: 和Android源代码一起工作 | 海豚浏览器 胡继堂

调试Native代码?  0 等等,我们还差点东西-­‐-­‐symbol  

Page 19: 和Android源代码一起工作 | 海豚浏览器 胡继堂

Android系统编译

0 目的  0 生成调试Native代码需要的symbol  0 打开系统里的一些调试选项,方便调试  0 修改系统代码,添加Log,分析系统行为  0 定制Android的一些功能  

Page 20: 和Android源代码一起工作 | 海豚浏览器 胡继堂

系统准备  

更多内容:    http://source.android.com/source/initializing.html  

Ubuntu  10.04  –  12.04  

•  10.5  (Leopard)  or  10.6  (Snow  Leopard)  •  MacOS  10.5  SDK  

Page 21: 和Android源代码一起工作 | 海豚浏览器 胡继堂

0 Google的Nexus系列  0 解锁方便 [fastboot  oem  unlock]  0 驱动获取方便  0 源代码里直接有预设的编译目标  

0 模拟器  

设备选择  

Nexus  One   Nexus  S   Galaxy  Nexus  

Page 22: 和Android源代码一起工作 | 海豚浏览器 胡继堂

准备编译  1.  cd  $srcroot  2.  source  build/envsetup.sh  3.  lunch  

Page 23: 和Android源代码一起工作 | 海豚浏览器 胡继堂

编译目标解释  0 常见格式:full_[code  name]-­‐[build  type]  0 常见code  name  

0 Nexus  One    -­‐  passion  0 Nexus  S      -­‐  crespo  0 Galaxy  Nexus    -­‐  maguro  0 没有code  name表示编译成emulator  

0 Build  type  0 user  0 userdebug  0  eng  [eng=engineering  开发目的优先选择它]  

Page 24: 和Android源代码一起工作 | 海豚浏览器 胡继堂

开始编译  

make  [-­‐jn]    

0 你还有更多选择  0 make  systemimage  0 make  bootimage  0 make  recovery  

Page 25: 和Android源代码一起工作 | 海豚浏览器 胡继堂

System  Image  Android核心功能  

Boot  Image  内核与驱动  

Boot  Loader  相当于BIOS  

Recovery  升级/刷机  

类似PC的WinPE  

Page 26: 和Android源代码一起工作 | 海豚浏览器 胡继堂

调试native代码

0 工具:gdb  +  gdbserver  

Page 27: 和Android源代码一起工作 | 海豚浏览器 胡继堂

用GDB调试native代码 $  #将system分区设为可写  $  adb  remount        $  #把gdbserver放到手机或者模拟器上  $  adb  push  $out/system/bin/gdbserver  /system/bin/  #    $  #进入源代码根目录  $  cd  $srcroot    $  #  获取要debug的程序名(package  name)  $  pid  app_name  xxxxx    $  #开始调试  $  gdbclient  :  :  xxxxx  

Page 28: 和Android源代码一起工作 | 海豚浏览器 胡继堂

0 下载与浏览

0 调试与编译

0 源代码利用示例

0 Q&A

Page 29: 和Android源代码一起工作 | 海豚浏览器 胡继堂

查看FPS 0 FPS:  Frame  per  second  0 决定UI的流畅度,越高越流畅  

Page 30: 和Android源代码一起工作 | 海豚浏览器 胡继堂

2.3(或以下) 0  frameworks/base/core/java/android/view/ViewRoot.java 0 在“private void draw(boolean fullRedrawNeeded)”找到下面的代码(两处),做修改

Page 31: 和Android源代码一起工作 | 海豚浏览器 胡继堂

缺点

0 没有log输出,不便于自动化测试统计 0 通过Canvas把FPS始终显示在屏幕的左下角,不在

Canvas的无效区域以内时,FPS值无法重绘

Page 32: 和Android源代码一起工作 | 海豚浏览器 胡继堂

4.0 (或以上)

0 frameworks/base/core/java/android/view/ViewRootImpl.java  

0 将DEBUG_FPS常量设为true  0 FPS通过log输出  

Page 33: 和Android源代码一起工作 | 海豚浏览器 胡继堂
Page 34: 和Android源代码一起工作 | 海豚浏览器 胡继堂

0 下载与浏览

0 调试与编译

0 源代码利用示例

0 Q&A

Page 35: 和Android源代码一起工作 | 海豚浏览器 胡继堂

谢谢  [email protected]