当前位置:文档之家› Android编译系统介绍

Android编译系统介绍

Android编译系统介绍

张长青

adamzhang@https://www.doczj.com/doc/639745888.html,

目录CONTENTS

一、背景知识

二、设计思想

三、主要流程

四、关键模块

五、 APK编译过程

六、 Android.mk文件

七、使用示例

一、背景知识

本章主要介绍学习Android编译系统所需要具备的一些背景知识。

1、关于Make

?make 是一个命令行工具,它解释 Makefile 中的规则。

?在 Makefile 文件中描述了整个工程中所有文件的编译顺序、编译规则和编译命令。

?Makefile有自己的书写格式、关键字、函数,而且在

Makefile中可以使用系统 shell 所提供的任何命令来完成想要的工作。

1、关于Make

?Makefile 文件的规则包含了文件之间的依赖关系和更新此规则目标所需要的命令,例如:

目标: [依赖]

[命令]

?Makefile已经在绝大多数的 IDE 开发环境中都在使用,已经成为一种工程化的编译方法。

1、关于Make

在默认的方式下,在当前目录提示符下输入"make"命令,系统将自动完成以下操作。

(1)make工具会在当前目录下查找名为"Makefile"或"makefile"的文件,GNU Make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索makefile执行文件。

(2)如果找到,它会查找文件中的第一个目标去执行。如果目标文件不存在,或是目标所依赖的文件修改时间较晚,系统就会执行后面定义的命令来生成目标文件。

1、关于Make

(3)如果目标所依赖的文件不存在,make会继续查找依赖文件的生成规则,make会一层一层地去查找文件的依赖关系,直到最终编译出第一个目标文件。

在查找的过程中,如果出现错误,比如最后被依赖的文件没有找到,make就会直接退出并报错。

1、关于Make

Makefile 文件中主要包含了5项内容: 显式规则、隐晦规则、宏定义、文件指示和注释。

1、关于Make

(1)显式规则

显式规则说明如何生成一个或多个目标文件。这由makefile 的书写者明确指出,包括要生成的文件,生成目标文件需要的依赖文件,生成目标文件的命令。例如:

foo.o : foo.c defs.h # foo模块,目标和依赖之间使用分号分割cc -c -g foo.c

foo.o是目标,foo.c和defs.h是目标所依赖的源文件,命令为"cc -c -g foo.c"(此行一定要以Tab键开头)。这个规则包括以下两个主要内容:文件的依赖关系:foo.o依赖于foo.c和defs.h文件,如果foo.c和defs.h的文件日期要比foo.o新,或是foo.o不存在,那么依赖关系发生。cc命令说明了如何生成foo.o文件。

1、关于Make

(2)隐晦规则

由于make有自动推导的功能,它会根据依赖关系决定源文件是否要重新编译以及源文件之间的编译顺序,所以隐晦规则可以让程序员简单方便地书写makefile文件。

(3)宏(变量)的定义

在makefile中需要定义一系列的宏(变量),宏(变量)一般都是字符串,类似于C语言中的宏。当makefile被执行时,其中的变量都会被扩展到相应的引用位置上,这一内容在前一小节已经介绍。

1、关于Make

(4)文件指示

包括3个部分:一个makefile文件中引用另一个Makefile文件,就像C语言中的include一样;指根据某些情况指定makefile中的有效部分,就像C语言中的预编译#if一样;定义多行的命令。

(5)注释

makefile中只有行注释,和UNIX的Shell脚本一样,其注释用"#"字符开始,类似于C/C++中的"//"。如果要在makefile中使用"#"字符,需用反斜杠进行转义,如:"\#"。

2、关于Shell

Shell是一种具备特殊功能的程序, 它是介于使用者和 UNIX/Linux 操作系统之核心程序(kernel)间的一个接口。为了对用户屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核的周围建了一个外壳(shell)。用户向shell提出请求,shell解释并将请求传给内核。

使用较广的shell有标准的Bourne shell(sh)、Korn

Shell(ksh)、C shell(csh)、Bourne Again Shell(bash)等。查看当前环境所用shell:echo $SHELL

2、关于Shell

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。

本质上,shell 脚本是将命令行命令简单的组合到一个文件里面。Shell基本上是一个命令解释器,类似于DOS下的https://www.doczj.com/doc/639745888.html,。它接收用户命令,然后调用相应的应用程序去执行并返回结果。

2、关于Shell——我们为什么看不懂shell程序?Linux命令使用原则:经常使用、不会就查。

2、关于Shell——我们为什么看不懂shell程序?

变量

本地变量:用户自定义的变量。

环境变量:用于所有用户变量,用于用户进程前,必须用export命令导出。

位置变量:$0(脚本名),$1-$9:脚本参数。

系统变量:脚本运行时的一些相关信息。

备注:很多人看不懂脚本程序,一个很重要的原因就是看不懂变量从哪里来。其实很多的脚本语言都采用了“预先约定”的思想,像位置变量和系统变量都是预先定义含义的,你要按照它本身代表的含义去理解,才能逐步地看懂脚本程序。

2、关于Shell——我们为什么看不懂shell程序?控制结构

选择结构循环结构if语句: if then else提供条件测试

case 语句:允许匹配模式、单词或值

for:每次依次处理列表内的信息,直至循环耗尽。until:不常用。条件在循环末尾,至少执行一次。while:条件在循环头部。

2、关于Shell——我们为什么看不懂shell程序?if语句

?格式1 if [ 条件

]

then

命令fi

?格式2

if [ 条件 ] ;then

命令

fi

?格式3

if [ 条件 ] then

命令1 else

命令2 fi ?格式4

if [ 条件1 ]

then

命令1

elif[ 条件2 ]

then

命令2

else

命令3

fi

?示例

#!/bin/sh

#ifTest

#to show the method of if

echo -e "Enter the first integer:\c"

read FIRST

echo -n "Enter the second integer:"

read SECOND

if [ "$FIRST" -gt "$SECOND" ]

then

echo "$FIRST is greater than $SECOND"

elif [ "$FIRST" -gt "$SECOND" ]

then

echo "$FIRST is less than $SECOND"

else

echo "$FIRST is equal to $SECOND"

fi

Ubuntu下Android源码修改、编译及运行、launcher定制

环境 Linux 版本:Ubuntu 11.04 (可由10.10的版本进行升级)64位系统 GCC版本:gcc version 4.5.2 Java版本:java version "1.6.0_26" 下载android源码前注意: 1、保证Ubuntu系统中的容量在80G左右,以保证足够的空间来存放android源码以及编译后的相关文件。 2、保证Ubuntu系统进行Internet访问。 联网方法:采用拨号进行连接。相关操作步骤如下所示: 1、虚拟机→设置→硬件→网络适配器→网络连接→桥接 2、启动Ubuntu系统,打开终端(在普通用户下),输入相关命令如下: $ pppoeconf //打开后输入上网账号跟密码,确认保存 $ sudo pon dsl-provider //上网连接命令 经过这两个步骤后就可以进行上网了。 Android源码编译所依赖的tools 01.$ sudo apt-get update 02.$ sudo apt-get -y install git-core 03.$ sudo apt-get -y install gnupg 04.$ sudo apt-get -y install sun-java6-jdk flex 05.$ sudo apt-get -y install bison 06.$ sudo apt-get -y install gperf 07.$ sudo apt-get -y install libsdl-dev 08.$ sudo apt-get -y install libesd0-dev 09.$ sudo apt-get -y install libwxgtk2.6-dev 10.$ sudo apt-get -y install build-essential 11.$ sudo apt-get -y install zip 12.$ sudo apt-get -y install curl 13.$ sudo apt-get -y install libncurses5-dev 14.$ sudo apt-get -y install zlib1g-dev 15.$ sudo apt-get -y install valgrind 注意:(如果是32bit的系统的话,则要更改几个Android.mk文件) 01./external/clearsilver/cgi/Android.mk 02./external/clearsilver/java-jni/Android.mk 03./external/clearsilver/util/Android.mk 04./external/clearsilver/cs/Android.mk 用gedit打开,修改m64为m32即可 另外 将build/core/main.mk中的ifneq (64,$(findstring 64,$(build_arch)))修改为: ifneq (i686,$(findstring i686,$(build_arch)))

Android系统编译过程中常见问题汇总(2)

android源码编译常见问题 分类:android中级2013-03-09 16:20 397人阅读评论(2) 收藏举报编译过程: (在Ubuntu 11.04 64位机器上编译) 1. source build/envsetup.sh //初始化与环境envsetup.sh脚本 初始化完成,显示如下 including device/samsung/maguro/vendorsetup.sh including device/samsung/tuna/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash 2. lunch full-eng //选择的目标 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.0.1 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=ITL41D ============================================ //建立与一切使。GNU的make -JN参数可以并行处理任务,它是共同使用的任务数, //N的1倍和2倍之间是被用于建立计算机硬件线程数量。例如在E5520双机(2个CPU, //每个CPU 4核,每核心2线程),最快的构建与命令之间的J16和 -J32。 3. make -j4 编译完成

在Ubuntu上编译android

在Ubuntu7.10上编译android 1 概述 上个星期看到android开放源代码的消息,虽然觉得Google的这个动作会对业界产生很大影响,但没有时间仔细看,只浏览了Project layout。今天上午一个网友在mail中说已经编译、运行过android。我趁着中午休息时间,在一个Ubuntu7.10的虚拟机上编译、运行了一下。 我在这个虚拟机上编译过openmoko、poky。相对于这两个使用OpenEmbedded的平台,android的编译要简单一些,快一些。我在编译openmoko和poky时,将所有下载包都保存在一个目录中,将编译目录的sources子目录指向这个目录。这样做,一方面即使以后有些链接失效,也还可以编起来(其实编译时都不需要连接外网);另一方面在重新编译时,不用重新下载,可以加快编译速度。即使这样,完全编译一次poky也要一个晚上。编译android时,下载用了1个小时,编译也只需要1个小时。 2 编译中的两个小问题 2.1 python和JDK Google网站对编译过程的介绍还是很清晰的。不过在介绍其它软件包时,都给出了apt-get命令,却单独给出了python和JDK的链接地址,容易对读者产生误导,以为要手工安装这两个软件。其实这两个软件也应该通过apt-get安装。特别是python,如果从源代码安装,可能因为依赖其它软件,导致一些组件编译失败,影响android的编译。而且python 2.6的源代码包没有提供make uninstall,卸载也比较麻烦。其实我们只需要一个apt-get命令,就可以安装所有依赖的软件。 2.2 "fatal: git 1.5.4 or later required" 在Ubuntu7.10上执行repo init时,会出现"fatal: git 1.5.4 or later required"的错误提示。在Ubuntu8.04上编译没有这个问题。下面的流程里会介绍怎样解决这个问题。 3 在Ubuntu7.10上的编译流程

android4.1编译

Android 4.1.4 编译 1、下载源码: 我是在ics版本的基础上通过repo sync更新,发现有了an droid 4_1_r1的分支,等待更新完,repobranch切换分支,然后.Build/envsetup.she然后lunchi选择full-eng最后make,过一会报错。提示: build/core/product_config.mk:193:***_nic.PRODUCTS.[[build/target/product/v box_x 86.mk]]: "frameworks/native/build/phone-xhdpi-1024-dalvik-heap.mk" does not exist. Stop.** Don't have a product spec for: 'full' ** Do you have the right repo manifest? Google baidu bing 了大半天终于在an droid的bug单中找到了这条bug,解答是源码不全。愁了半天,repo sync都是最新的,愁了半天,最后再ics的repo 中重新下了个android 4.1.4的分支。 repoinit-uhttps: 4.1.1_r4 repo sync 下载3个小时,终于下载完成,本来下载源码需要很长时间5?10个小 时,由于再ics的基础上下载,只需要把patch下载就行了(repo会自动完成)。兴奋啊,赶紧. Build/envsetup.sh lunch 1 full-eng

/bin/bash: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi- 4.6/bin/arm-linux- androideabi-gcc: 无法执行二进制文件 /bin/bash: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi- 4.6/bin/arm-linux- androideabi-gcc: 无法执行二进制文件 /bin/bash: prebuilts/gcc/linux-x86/arm/arm-linux-androideabi- 4.6/bin/arm-linux- androideabi-gcc: 无法执行二进制文件 先没管它,继续机制行 make clean make -j8 过了几分钟提示错误:hostStaticLib: libhost(out/host/linux- x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a) ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc 2.7- 4.6/bin/x86_64-linux-ar only run on 64-bit linux make: ***[out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a] 错误 1 host C: emulator-target-i386 <= external/qemu/cpus.c host C: emulator-target-i386 <= external/qemu/arch_init.c host C: emulator-target-i386 <= external/qemu/os-posix.c host C:

android源代码下载和编译教程

Android源代码由两部分组成,其一是Android系统应用部分的代码,其次是Android 所使用的内核代码,如果针对Google Nexus S来开发ROM,就需要下载三星的内核代码Android 系统应用代码: https://https://www.doczj.com/doc/639745888.html,/platform/manifest Android内核代码: https://https://www.doczj.com/doc/639745888.html,/kernel/samsung.git 准备阶段:设置Linux编译环境(本人是Ubuntu 11.10 ,32位系统),一般你需要以下配置: Python 2.5 -- 2.7. GNU Make 3.81 -- 3.82,, JDK 6 (for Gingerbread or newer); JDK 5( for Froyo or older). Git 1.7 or newer. 1、安装一些必备的包。 Git是Linux Torvalds为了帮助管理Linux内核而开发的一个开放源码的分布式版本控制系统软件,它不同于SVN,CVS这样集中式的版本控制系统。在集中式版本控制系统中只有一个仓库(repository),许多个工作目录,而git这样的分布式控制系统中,每一个工作目录都包含一个完整仓库,它们支持离线工作,本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而收到影响? 因为Android是由kernel,Dalvik,Bionic,prebuild,build等多个Git项目组成, 所以Android项目编写了一个名为repo的python的脚本来统一管理这些项目的仓库,使得Git的使用更加简单。 $ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils xsltproc $ sudo apt-get install libx11-dev:i386 2、创建源代码目录 首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它加到PATH 环境变量中: $ mkdir ~/bin $ PATH=~/bin:$PATH 或者$export PATH=$PATH:~/bin 3、用curl下载repo脚本,并保存在~/bin/repo文件中: $ curl https://https://www.doczj.com/doc/639745888.html,/dl/googlesource/git-repo/repo > ~/bin/repo 为repo加上执行权限 $ chmod a+x ~/bin/repo 4、初始化版本库 首先建立一个目录,用来存放下载下来的东西 $mkdir MyAndroid $cd MyAndroid 以后,执行如下命令 $ repo init -u https://https://www.doczj.com/doc/639745888.html,/platform/manifest -b android-2.3.7_r1 我这里下载的是android2.3.7版本的,所用的参数是android-2.3.7_r1。由于最新的是android-4.0.3_r1,所以使用上面即可下载2.3.7的源代码 注意:如果要是把所有的版本都下载下来,那时间是需要很久很久的,需要耐心等待,但是如果仅仅是下载某一个版本的话,还是很快就可以了。 最后,如果看到repo initialized in /MyAnroid的提示,说明本地的版本库已经初始化成功了(期间需要你填写姓名和Gmail地址)。

Ubuntu下编译Android源码全过程

Ubuntu下编译Android源码全过程(转) 源码, 编译, Ubuntu, Android 一、获取Android源代码 Git是LinuxTorvalds(Linux之父)为了帮助管理Linux内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(Repository),许多个工作目录(WorkingCopy),而在Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNUArch、Bazaar、Darcs、SVK、Monotone等),每一个工作目录都包含一个完整仓库,它们支持离线工作,本地提交可以稍后提交到服务器上。 因为Android是由Kernel、Dalvik、Bionic、Prebuilt、build等多个项目组成,如果我们分别使用Git来逐个获取显得很麻烦,所以Android项目编写了一个名为Repo的Python 的脚本来统一管理这些项目的仓库,使得项目的获取更加简单。 在Ubuntu 8.04上安装Git只需要设定正确的更新源,然后使用apt-get就可以了,apt-get 是一条Linux命令,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或 操作系统。 apt-get命令一般需要root权限执行,所以一般跟着sudo命令。 sudo apt-get install git-core curl 这条命令会从互联网的软件仓库中安装git-core和curl。 其中curl是一个利用URL语法在命令行方式下工作的文件传输工具,它支持很多协议,包括FTP、FTPS、HTTP、HTTPS、TELENT等,我们需要安装它从网络上获取Repo脚本文件。 curl https://www.doczj.com/doc/639745888.html,/repo >~/bin/repo 这句命令会下载repo脚本文件到当前主目录的/bin目录下,并保存在文件repo中。 最后我们需要给repo文件可执行权限

Android ninja 编译启动过程分析

Android ninja编译启动过程分析 ---make是如何转换到到ninja编译的 1.首先你的得对make的工作机制有个大概的了解: 运行的命令在要编译的目录下运行make,或者make target_name a.分析处理保存阶段(没有实际编译动作):它首先对当前目录下的Makefile文件的做一次扫描,语法分析,还有处理,主要是变量的保存,目标依赖列表生成,目标下的action列表的生成,然后记住 b.然后按记住的目标执行action列表动作(有实际编译动作). 编译启动的入口方式还是运行make: 2开始make-jxxx方式进入.....(xxx是本机cpu的数量) make开始做进行第一次扫描.... 目前USE_NINJA还是没有定义,估计以后很久很久才能启用的了! BUILDING_WITH_NINJA开始也是没定义的 看make扫描入口文件: Makefile: include build/core/main.mk 在build/core/main.mk: 在ninia之前都有include help.mk和config.mk 97include$(BUILD_SYSTEM)/help.mk 98 99#Set up various standard variables based on configuration 100#and host information. 101include$(BUILD_SYSTEM)/config.mk 说明make help//显示make帮助make config//当前显示配置 103relaunch_with_ninja:= 104ifneq($(USE_NINJA),false) 105ifndef BUILDING_WITH_NINJA<==第二次扫描不会到这里了 106relaunch_with_ninja:=true 107endif 108endif 116ifeq($(relaunch_with_ninja),true)<===第一次扫描入这里了 117#Mark this is a ninja build. 118$(shell mkdir-p$(OUT_DIR)&&touch$(OUT_DIR)/ninja_build) 119include build/core/ninja.mk//---进入ninja.mk 第一次扫描到此为止就结束掉了,因为在当前ifeq else endif后面没有代码了 120else#///!relaunch_with_ninja<===第二次扫描入这里了

Android编译过程详解

本文使用Android版本为2.1,采用开发板为华清远见研发的FS_S5PC100 A8开发板。+--------------------------------------------------------------------------------------------------------------------+ 1. source build/envsetup.sh 这个命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去,我们来分析下它。envsetup.sh里的主要命令如下: ?

根据上面的内容,可以推测出,如果要想定义自己的产品编译项,简单的办法是直接在envset up.sh最后,添加上add_lunch_combo myProduct-eng,当然这么做,不太符合上面代码最后的本意,我们还是老实的在vendor目录下创建自己公司名字,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项 ? 这样,当我们在执行source build/envsetup.sh命令的时候,可以在shell上看到下面的信息: ?

2. 按照android官网的步骤,开始执行lunch full-eng 当然如果你按上述命令执行,它编译的还是通用的eng版本系统,不是我们个性系统,我们可以执行lunch命令,它会打印出一个选择菜单,列出可用的编译选项 如果你按照第一步中添加了vendorsetup.sh那么,你的选项中会出现: ? 其中第3项是我们自己添加的编译项。 lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。 我们一直没有说明前面的fs100-eng是什么意思,现在来说明下,fs100是我定义的产品的名字,eng是产品的编译类型,除了eng外,还有user, userdebug,分别表示: eng: 工程机, user:最终用户机 userdebug:调试测试机

Android应用程序资源的编译和打包过程分析

Android应用程序资源的编译和打包过程分析 作者:罗升阳 我们知道,在一个APK文件中,除了有代码文件之外,还有很多资源文件。这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的。在打包之前,大部分文本格式的XML资源文件还会被编译成二进制格式的XML 资源文件。在本文中,我们就详细分析XML资源文件的编译和打包过程,为后面深入了解Android系统的资源管理框架打下坚实的基础。 在前面Android资源管理框架(Asset Manager)简要介绍和学习计划一文中提到,只有那些类型为res/animator、res/anim、res/color、res/drawable (非Bitmap文件,即非.png、.9.png、.jpg、.gif文件)、res/layout、res/menu、res/values和res/xml的资源文件均会从文本格式的XML文件编译成二进制格式的XML文件,如图1所示: 这些XML资源文件之所要从文本格式编译成二进制格式,是因为: 1. 二进制格式的XML文件占用空间更小。这是由于所有XML元素的标签、属性名称、属性值和内容所涉及到的字符串都会被统一收集到一个字符串资源池中去,并且会去重。有了这个字符串资源池,原来使用字符串的地方就会被替换成一个索引到字符串资源池的整数值,从而可以减少文件的大小。 2. 二进制格式的XML文件解析速度更快。这是由于二进制格式的XML元素里面不再包含有字符串值,因此就避免了进行字符串解析,从而提高速度。

将XML资源文件从文本格式编译成二进制格式解决了空间占用以及解析效率的问题,但是对于Android资源管理框架来说,这只是完成了其中的一部分工作。Android资源管理框架的另外一个重要任务就是要根据资源ID来快速找到对应的资源。 在前面Android资源管理框架(Asset Manager)简要介绍和学习计划一文中提到,为了使得一个应用程序能够在运行时同时支持不同的大小和密度的屏幕,以及支持国际化,即支持不同的国家地区和语言,Android应用程序资源的组织方式有18个维度,每一个维度都代表一个配置信息,从而可以使得应用程序能够根据设备的当前配置信息来找到最匹配的资源来展现在UI上,从而提高用户体验。 由于Android应用程序资源的组织方式可以达到18个维度,因此就要求Android资源管理框架能够快速定位最匹配设备当前配置信息的资源来展现在UI上,否则的话,就会影响用户体验。为了支持Android资源管理框架快速定位最匹配资源,Android资源打包工具aapt在编译和打包资源的过程中,会执行以下两个额外的操作: 1. 赋予每一个非assets资源一个ID值,这些ID值以常量的形式定义在一个R.java 文件中。 2. 生成一个resources.arsc文件,用来描述那些具有ID值的资源的配置信息,它的内容就相当于是一个资源索引表。 有了资源ID以及资源索引表之后,Android资源管理框架就可以迅速将根据设备当 前配置信息来定位最匹配的资源了。接下来我们在分析Android应用程序资源的编译和打包过程中,就主要关注XML资源的编译过程、资源ID文件R.java的生成过程以及资源索引表文件resources.arsc的生成过程。 Android资源打包工具在编译应用程序资源之前,会创建一个资源表。这个资源表使用一个ResourceTable对象来描述,当应用程序资源编译完成之后,它就会包含所有资源 的信息。有了这个资源表之后, Android资源打包工具就可以根据它的内容来生成资源索引表文件resources.arsc了。 接下来,我们就通过ResourceTable类的实现来先大概了解资源表里面都有些什么东西,如图2所示:

利用mm命令编译Android模块

在Android开发过程中,当我们只需要编译某个修改过的模块时,使用mm命令可以使你不用编译整个Android项目,而只需单独编译该模块即可,这样速度是不是很快呢?具体的步骤如下: 1. 在Android源代码目录下: [c-sharp]view plaincopy 1cd mydroid 2source build/envsetup.sh 也可以将source ~/mydroid/build/envsetup.sh放到~/.bashrc中,这样每次打开shell时就会自动运行该脚本。 2. 在shell中使用help命令查看可以运行的命令 [c-sharp]view plaincopy 3# help 4Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: 5- croot: Changes directory to the top of the tree. 6- m: Makes from the top of the tree. 7- mm: Builds all of the modules in the current directory. 8- mmm: Builds all of the modules in the supplied directories. 9- cgrep: Greps on all local C/C++ files. 10- jgrep: Greps on all local Java files. 11- resgrep: Greps on all local res/*.xml files. 12- godir: Go to the directory containing a file. 13 14Look at the source to view more functions. The complete list is: 15add_lunch_combo cgrep check_product check_variant choosecombo chooseproduct choosetype choosevariant cproj croot findmakefile gdbclient get_abs_build_var getbugreports get_build_var getprebuilt gettop godir help isviewserverstarted jgrep

Android的编译系统

设为主页加入收藏帮助 | 留言交流 转藏到我的图书馆推荐给朋友举报

build/core/envsetup.mk generate dir config and so on build/target/product product config build/target/board board config build/core/combo build flags config 这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中,哪些APK在当前product中是不提供的。 config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。 配置部分主要完成以下几个工作: a) 基于Android 产品的配置(product config):选择构建安装的运行程序(user package) b) 设置 target 等相关变量TARGET_ARCH, TARGET_OS,TARGET_BUILD_TYPE, TARGET_PREBUILT_TAG c) 根据编译环境设置 host等相关变量HOST_OS, HOST_ARCH,HOST_BUILD_TYPE, HOST_PREBUILT_TAG d) 编译 target上运行程序所需的工具链及编译参数设置,如linux-arm-cc,cflag,include目录等。 e) 编译 host上运行程序所需的工具链及编译参数设置。 下图简要介绍了Android build system的配置部分的主要构成及相互关系。 流程-... 男性必吃的12种食 物!... 美食 哲理小品:最美妙 的人生 摄影基础技法

Ubuntu下Android源码修改、编译及运行、launcher定制

环境 Linux版本: Ubuntu 11.04(可由 10.10的版本进行升级)64位系统 GCC版本: gcc version 4.5.2 Java版本: java version " 1.6.0_26" 下载android源码前注意: 1、保证Ubuntu系统中的容量在80G左右,以保证足够的空间来存放android源码以及编译后的相关文件。 联网方法: 采用拨号进行连接。相关操作步骤如下所示: 1、虚拟机设置硬件网络适配器网络连接桥接 2、启动Ubuntu系统,打开终端(在普通用户下),输入相关命令如下: $ pppoeconf//打开后输入上网账号跟密码,确认保存 $ sudo pon dsl-provider//上网连接命令

经过这两个步骤后就可以进行上网了。 Android源码编译所依赖的tools 01.$ sudo apt-get update 02.$ sudo apt-get -y install git-core 03.$ sudo apt-get -y install gnupg 04.$ sudo apt-get -y install sun-java6-jdk flex 05.$ sudo apt-get -y install bison 06.$ sudo apt-get -y install gperf 07.$ sudo apt-get -y install libsdl-dev 08.$ sudo apt-get -y install libesd0-dev 09.$ sudo apt-get -y install libwxgtk 2.6-dev 10.$ sudo apt-get -y install build-essential 11.$ sudo apt-get -y install zip 12.$ sudo apt-get -y install curl 13.$ sudo apt-get -y install libncurses5-dev 14.$ sudo apt-get -y install zlib1g-dev 15.$ sudo apt-get -y install valgrind 注意: (如果是32bit的系统的话,则要更改几个Android.mk文件)01./external/clearsilver/cgi/Android.mk

Android 源码编译 流程

Android 源码编译调试流程 by mengke 1 编译流程 sudo apt-get install build-essential sudo apt-get install make sudo apt-get install gcc sudo apt-get install g++ sudo apt-get install libc6-dev sudo apt-get install patch sudo apt-get install texinfo sudo apt-get install libncurses-dev sudo apt-get install git-core gnupg sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl sudo apt-get install ncurses-dev sudo apt-get install zlib1g-dev sudo apt-get install valgrind sudo apt-get install python2.5 安装java环境 sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts sun-java6-jdk sudo apt-get install sun-java5-jdk (ubuntu 910 估计会有一些问题) (注:官方文档说如果用sun-java6-jdk可出问题,得要用sun-java5-jdk。经测试发现,如果仅仅make(make不包括make sdk),用sun-java6-jdk是没有问题的。而make sdk,就会有问题,严格来说是在make doc出问题,它需要的javadoc版本为1.5。 因此,我们安装完sun-java6-jdk后最好再安装sun-java5-jdk,或者只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装,并只修改javadoc.1.gz和javadoc。因为只有这两个是make sdk用到的。这样的话,除了javadoc工具是用1.5版本,其它均用1.6版本: sudo apt-get install sun-java5-jdk) cd /etc/alternatives sudo rm javadoc.1.gz sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz sudo rm javadoc sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc 假设源代码的目录为mydroid root@mk-desktop:~/mydroid# ls Makefile build development frameworks out sdk bionic cts device hardware packages system bootable dalvik external ndk prebuilt vendor

安卓系统源码编译

安卓源码编译 1、编译环境的搭建 操作系统推荐安装64位的ubuntu10.04,其他版本的ubuntu也可以安装,但是可能出现一些莫名其妙的Bug。 系统安装结束之后,还需要安装一些编译源码需要的工具和依赖包。具体内容如下:确认下列软件安装成功并且版本号正确: 1.1 gcc4.4,而不是gcc4.6,如果是4.6,需要安装gcc4.4,命令如下: sudo apt-get install gcc-4.4 sudo apt-get install g++-4.4 cd /usr/bin ls -l gcc* sudo mv gcc gcc.bak sudo ln -s gcc-4.4 gcc ls -l g++* sudo mv g++ g++.bak sudo ln -s g++-4.4 g++ gcc -v g++ -v 1.2 python 2.5-2.7,ubuntu10.04版本,默认的python版本是2.6。 1.3 JDK版本是1.6.0,而不是openJDK, 1.4 安装git sudo apt-get install git-core gnupg 1.5 一些依赖包的安装: Ubuntu系统版本不同,所需要安装的依赖包也不同,具体情况如下所述: u buntu 10.04(64位) $ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils xsltproc ubuntu 11.10(64位)

分布式编译Android

分布式编译Android – distcc 分布式编译: 是一种通过在局域网内的多个节点上运行编译进程来提高构建速度的途径(转自:分布式编译环境中的负载均衡). 可以合理多台主机的空闲资源, 缩短编译时间. 本文章主要介绍disctcc的配置和使用. 1.distcc简介和工作原理 distcc的介绍可以参考<<分布式编译环境中的负载均衡>>, distcc只支持c/c++. 这里只介绍其工作原理. 先介绍distcc的两个程序. 1.distcc: 替换原来的编译器(gcc/g++), 所以要编译android编译, 把原来的编译器 替换 2.distccd: distcc的服务. 运行在编译场内各个主机上的distcc 代理程序 工作过程: 我们会建立一堆g++, gcc, ar等链接到/usr/bin/distcc, 源码的编译就是要指定为那一堆链接. 所以编译时调用的是distcc, distcc会根据链接名在各个主机上找到对应的编译器进行编译工作.源码的共享是通过NFS实现的. 2.安装配置distcc 参考<>. 配置步骤比较多, 所以已经把需要的工具打包和需要配置的项做成脚本, 只要运行脚本就可以配置好环境 工具存入地址: \\newnas\Dep.Mid5.软件3.工具\分布式编译distcc 把distcc_android.tar.gz和install_distcc.sh放到一个目录, 进入该目录, 并运行 ./install_distcc.sh 就可以把环境搭好. Android源码需要修改的地方会上传到服务器.

Android的编译系统

Android的编译系统 一、Makefile的主要流程 以下主要流程都在build/core/main.mk里安排。 初始化相关的参数设置(buildspec.mk、envsetup.mk、config.mk) 检测编译环境和目标环境 决定目标product 读取product的配置信息及目标平台信息 清除输出目录 检查版本号 读取Board的配置 读取所有Module的配置 根据配置产生必要的规则(build/core/Makefile) 生成image 主要配置文件: build/core/config.mk summary of config build/core/envsetup.mk generate dir config and so on build/target/product product config build/target/board board config build/core/combo build flags config 这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中,哪些APK在当前product中是不提供的。 config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输 出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。 配置部分主要完成以下几个工作: a) 基于Android 产品的配置(product config):选择构建安装的运行程序(user package) b) 设置target 等相关变量TARGET_ARCH, TARGET_OS,TARGET_BUILD_TYPE, TARGET_PREBUILT_TAG c) 根据编译环境设置host等相关变量HOST_OS, HOST_ARCH,HOST_BUILD_TYPE, HOST_PREBUILT_TAG d) 编译target上运行程序所需的工具链及编译参数设置,如linux-arm- cc,cflag,include目录等。 e) 编译host上运行程序所需的工具链及编译参数设置。 下图简要介绍了Android build system的配置部分的主要构成及相互关系。

相关主题
文本预览
相关文档 最新文档