0%

高通平台Android源码bootloader分析之sbl1(一)
高通平台Android源码bootloader分析之sbl1(二)
高通平台Android源码bootloader分析之sbl1(三)

前两篇博文分析了启动流程、代码流程、cdt,接下来就分析另外几个需要格外关注的部分。

log系统

sbl1中的log系统也是sbl1部分调试会经常接触得部分高通平台在sbl中做的log系统并不是很强大, 但是对于我们调试已经远远足够了。
###sbl1_boot_logger_init
sbl1_boot_logger_init是log系统的初始化函数,被sbl1_main_ctl函数调用(详细参考:高通平台Android源码bootloader分析之sbl1(一)),其源码如下:

Read more »

高通平台Android源码bootloader分析之sbl1(一)
高通平台Android源码bootloader分析之sbl1(二)
高通平台Android源码bootloader分析之sbl1(三)

在上一篇博文中主要描述了启动流程,及代码执行流程,并重点介绍了一下我重点关注的部分。这个sbl部分也算有点庞大,我们没有精力也没有必要去分析全部,所以接下来就来分析一下sbl1中另外几个需要格外关注的部分:

  • CDT :主要提供平台设备数据
  • log system:log日志系统,当然没有kernel里面那么强大了
  • download:代码下载烧写实现
  • ramdump:异常信息dump
     
    本篇博文就先来分析一下CDT, 其他部分后面再分析。
    Read more »

高通平台Android源码bootloader分析之sbl1(一)
高通平台Android源码bootloader分析之sbl1(二)
高通平台Android源码bootloader分析之sbl1(三)

高通8k平台的boot过程搞得比较复杂, 我也是前段时间遇到一些问题深入研究了一下才搞明白。不过虽然弄得很复杂,我们需要动的东西其实很少,modem侧基本就sbl1(全称:Secondary boot loader)的代码需要动一下,ap侧就APPSBL代码需要动(对此部分不了解,可参照:bootable 源码解析),其他的都是高通搞好了的,甚至有些我们看不到代码。今天就要分析一下开机前几秒钟起着关键作用的sbl1, 这套代码在modem侧的boot_images\中。

启动流程

首先来看一下高通的bootloader流程框图,主要由ap、RPM及modem三部分构成,由于我工作主要涉及到ap侧,所以对RPM和modem侧代码不了解,以后有空时间的话到可以研究一下,框图如下:

Read more »

记得当初学Linux时候,bootloader 代码相对来说还比较简单,主要几个汇编文件加上几个C文件,编译一个uboot就ok了。做Android驱动后,发现Android专门做了一个目录bootable来实现boot等相关功能。功能也比较多,所以就准备来研究一下这一部分。今天就先研究一下LK,LK全称为Little Kernel,是AP模块bootloader中实现的一个微型系统。

boot架构

Read more »

  昨天写Android日志系统相关博客时发觉自己对adb命令认知十分不够,所以特意去http://developer.android.com/tools/help/adb.html学习了一下,今天准备按照自己的理解加以修改总结并整理出一篇博文。

概览

  adb是Android Debug Bridge的简写,按字面意思理解就是在开发者和Android之间搭建的一个debug桥。adb是一个连接仿真实例或者Android设备的命令行工具,是一个客服端-服务器模式的程序,包括如下三部分:
 
  1. 一个运行在开发用的Android手机或者仿真器上面的client,我们可以通过adb命令调用client。其他像ADT插件和DDMS也会创建client。
 
  2. 一个运行在开发用的Android手机或者仿真器后台的server,这个server负责管理本设备上运行的client和daemon(守护进程)。
 
  3. 一个在每个仿真器或者Android设备后台运行的daemon。

adb tool 可以再/platform-tools/中找到 

Read more »

  Android日志系统详解
  How to debug with Android logging
  怎么抓取Android日志文件

  前两篇blog分别介绍了Android logging系统及编程时怎么应用,关于kernel中的log系统,前面只是大概提及了一下,下次再详细分析。相信大家都知道调试时需要打开USB调试模式,接下来就分析一下怎么抓取日志文件。

logcat命令详解

  logcat是最常用的命令之一,其语法如下;

Read more »

  Android日志系统详解
  How to debug with Android logging
  怎么抓取Android日志文件

  Android logging system为logging系统提供了一个Java类android.util.Log,也提供了一个c/c++的log库,在kernel中有四个设备节点,详细见:Android日志系统详解。其系统架构如下:
   image by simon

此图与4.0以上的系统有些差异,新版Android增加了log_system

Read more »

  Android日志系统详解
  How to debug with Android logging
  怎么抓取Android日志文件

  不管是做Android应用还是做Android中间层和底层,Logging系统都是必须要了解的;因为Android不像单片机程序UCOS那么简单,可以很方便的单步调试。所以,就准备用一篇blog来分析一下logging system。

##概览
  Android提供了一个灵活的logging系统,允许应用程序和系统组件等整个系统记录logging信息,它是独立于Linux Kernel的一个logging系统,kernel是通过”pr_info”、”printk”等存储,通过“dmesg”或“cat /proc/kmsg”获取。不过,Android logging 系统也是将信息存在内核缓存区。其结构如下: 
 
    image by Tetsuyuki Kobabayshi

Read more »

  Android编译过程详解之一
  Android编译过程详解之二
  Android编译过程详解之三
  Android.mk解析

  前两个篇基本完全涉及到了整个编译过程,接下来着重分析一下和公司产品相关的mk文件。有两个路径前面没有怎么提到过,如下:

1
2
build/target/product # 当前产品配置的mk文件,如:需要包含哪些apk在此产品中
build/target/board # 硬件芯片配置的mk文件,如:GPU、是否支持浮点运算等

  除以上两个路径外,对产品定义的文件通常位于device目录下,还可以定义在vender目录下(不过Google已不建议如此做了),device目录下根据公司名和产品名分为两级目录,这个上文已经介绍过。通常一个产品定义如下四个文件:

  • AndroidProducts.mk
  • 产品版本定义文件(一般针对不同应用环境存在多个,如:msm8916_32.mk)
  • BoardConfig.mk
  • verndorsetup.sh

AndroidProducts.mk

Read more »

  Android编译过程详解之一
  Android编译过程详解之二
  Android编译过程详解之三
  Android.mk解析
 
  配置好环境变量后,接下来要做的就是build了。为了提高编译速度,我们自定义了一个go.sh的脚本文件,详细下面解释。另,编译的时候一般会在后面加一个-j8来实现多线程编译,如:

1
   ./go.sh -j8 or make -j8/--jobs  

参数“-j“ 和”–jobs ”指定了同时编译的线程数量,通常是编译主机 CPU 支持的并发线程总数的 1 倍或 2 倍(如:在一个 4 核,每个核支持两个线程的 CPU 上,可以使用 make -j8 或 make -j16)。在调用 make 命令时,如果没有指定任何目标,则将编译默认目标“droid”(下面详解),然后将会编译出完整的 Android 系统镜像。

build系统分类

  整个build系统的Make文件可以分为三类:

  1. build系统核心文件:定义整个build系统的框架,其他所有make文件都是在这个框架的基础上写出来的。
  2. 产品的make文件:位于device目录,通常以公司名和产品名分为两级目录,如:\device\qcom\msm8916_32。
  3. 模块的make文件:每个模块专用的make文件,kernel中统一名字为Makefile,其他为Android.mk。 

build结果

所有的编译产物都将位于 /out 目录下,该目录下主要有以下几个子目录:

  • /out/host/:该目录下包含了针对主机的 Android 开发工具的产物。即 SDK 中的各种工具,例如:emulator,adb,aapt 等。
  • /out/target/common/:该目录下包含了针对设备的共通的编译产物,主要是 Java 应用代码和 Java 库。
  • /out/target/product//:包含了针对特定设备的编译结果以及平台相关的 C/C++ 库和二进制文件。其中,是具体目标设备的名称。
  • /out/dist/:包含了为多种分发而准备的包,通过“make disttarget”将文件拷贝到该目录,默认的编译目标不会产生该目录。
    Read more »