ANDROID Porting系列一、ANDROID编译系统
译自:http://source.android.com/porting/build_system.html
Android使用一个自定义生成系统生成工具,二进制文件和文档。本文档提供了一个建立Android的编译系统的概述。
Android的编译系统需要最新版本的GNU make, (请注意,Android使用GNU的先进功能,可能使用还没有出现在网站的GNU Make)。在继续之前,请通过运行%make –v。查询您的make版本。如果您不具有版本3.80或更高版本,您需要升级您的make版本。
了解Makefile
Makefile定义了如何建立一个特定的应用程序。 Makefile文件通常包括下列全部内容:
Name:给你建立一个名称(LOCAL_MODULE:= <build_name>)。
Local Variables:用CLEAR_VARS清除局部变量(include $(CLEAR_VARS)).。
Files:确定哪些文件取决于您的应用程序(LOCAL_SRC_FILES:= main.c)。
Tags:定义标记,如必要(LOCAL_MODULE_TAGS:=eng development)。
Libraries:定义您的应用程序是否与其他libraries链接(LOCAL_SHARED_LIBRARIES:= cutils)。
Template file:包含一个模板文件来定义,强调为特定目标(工具包括$(BUILD_EXECUTABLE))。
下面的代码段演示了一个典型的Makefile。
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := <buil_name>
LOCAL_SRC_FILES := main.c
LOCAL_MODULE_TAGS := eng development
LOCAL_SHARED_LIBRARIES := cutils
include $(BUILD_EXECUTABLE)
(HOST_)EXECUTABLE, (HOST_)JAVA_LIBRARY, (HOST_)PREBUILT, (HOST_)SHARED_LIBRARY,
(HOST_)STATIC_LIBRARY, PACKAGE, JAVADOC, RAW_EXECUTABLE, RAW_STATIC_LIBRARY,
COPY_HEADERS, KEY_CHAR_MAP
上述片段包括artificial line breaks,以保持一个print-friendly打印文件。
层
构建层次结构包括抽象如下表所述层。
每一层关系到它上面的一个一对多的关系之一。例如,arch可以有多个board,每board可以有一个以上的device。你可以定义一个作为一个在同层元素专业化给定的层元素,从而消除复制和简化维护。
|
Layer |
Example |
Description |
|
Product |
myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk |
该产品层定义了一船产品规格齐全,界定哪些模块,来构建,以及如何配置它们。你可能会在几个不同的版本提供的设备的基础上的区域设置,例如,或在功能,如照相机。 |
|
Device |
myDevice, myDevice_eu, myDevice_eu_lite |
该device层代表设备上的塑料的物理层。例如,北美的设备可能包括销售设备,而在法国的QWERTY键盘可能包括AZERTY键盘。外设通常连接到device层。 |
|
Board |
sardine, trout, goldfish |
board层代表一个产品的原理图。您可能仍然连接外设的board层. |
|
Arch |
arm (arm5te) (arm6), x86, 68k |
arch层描述了处理器运行在您的board上。 |
在Android平台的建设
本节介绍了如何建立在Android的默认版本。一旦你建立了一个通用的舒适,那么你可以开始修改自己的目标设备的机器人。
设备代码
为了做一个机器人通用建设,源建设/ envsetup.sh,其中包含必要的变量和函数的定义,分述如下。
% cd $TOP
% . build/envsetup.sh
# pick a configuration using choosecombo
% choosecombo
% make -j4 PRODUCT-generic-user
您也可以替换为用户调试project:
% make -j4 PRODUCT-generic-eng
这些建立在不同的变体和包安装调试选项条件。
清理
执行% m clean,清理你刚刚创建的二进制文件。您也可以执行% m clobber获得的所有连击的二进制文件清除。 % m clobber等同于删除/ /输出/目录下生成的所有文件的存储位置。
加快重新build
每个组合的二进制文件存储为不同的子/ /输出/,从而能够迅速连击之间切换,而不必每次都重新编译所有的源目录。
但是,执行干净重建是必要的,如果不生成系统捕捉到的环境变量或生成文件的变化。如果发生这种情况时候,你应该定义如下所示USE_CCACHE环境变量:
% export USE_CCACHE=1
这样做将迫使编译系统的编译器使用ccache的缓存工具,从而降低重新编译所有来源。
ccache的二进制文件中提供/ /预置/ ...也不需要让您的系统上安装。
疑难解答
下面的错误可能是由运行的Java过时的版本引起的。
device Dex: core UNEXPECTED TOP-LEVEL ERROR:
java.lang.NoSuchMethodError: method java.util.Arrays.hashCode with
signature ([Ljava.lang.Object;)I was not found.
at com.google.util.FixedSizeList.hashCode(FixedSizeList.java:66)
at com.google.rop.code.Rop.hashCode(Rop.java:245)
at java.util.HashMap.hash(libgcj.so.7)
[...]
dx是一个Java程序,使用设施,首先在现有的Java版本1.5。在shell执行% java -version检查您使用的Java版本。您应该看到类似:
java version "1.5.0_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-164)
Java HotSpot(TM) Client VM (build 1.5.0_07-87, mixed mode, sharing)
如果你有Java 1.5或更高版本和您收到此错误,请确认您已正确地更新你的PATH变量。
建设Android内核
本节介绍如何构建Android的默认内核。一旦你建立了一个generic build,那么你可以开始修改自己的Android target设备的驱动程序。
要构建内核的基础上,切换到设备目录(/home/joe/android/device),以建立变量和运行:
% . build/envsetup.sh
% partner_setup generic
然后切换到内核目录/home/joe/android/kernel.。
Checking Out a Branch
The default branch is always android. To check out a different branch, execute the following:
% git checkout --track -b android-mydevice origin/android-mydevice
//Branch android-mydevice set up to track remote branch
% refs/remotes/origin/android-mydevice.
//Switched to a new branch "android-mydevice"
为了简化代码管理,让您的本地branch与远程branch跟踪(如在上述片段所示)相同的名称。通过执行% git checkout <branchname>.在分支之间切换
Verifying Location
找出存在的branch(包括本地和远程)哪个branch active通过执行以下(有星号标记):
% git branch -a
android
* android-mydevice
origin/HEAD
origin/android
origin/android-mydevice
origin/android-mychipset
只看local branch,省略- a标志.
Building the Kernel
要构建内核,执行:
% make -j4
build变量
当某一产品的build,经常是有用的,什么是最终的最终发布版本略有不同。这是目前定义的build变量:
|
eng |
这是默认的flavor。%make与%make eng一样。 •安装模块标记: eng, debug, user, 或development.。 •安装non-APK模块,没有标记指定。 •安装APKs根据产品定义文件,除了标记的APKs。 •ro.secure = 0 •ro.debuggable = 1 •ro.kernel.android.checkjni = 1 •adb是默认启用的。 |
|
user |
make user 这是意在最终版本位的lavor。 •安装模块用的用户。 •安装non-APK模块,没有标记中指定。 •安装APKs根据产品定义文件,标签被忽略的APK模块。 ro.secure=1 · ro.debuggable=0 · adb is disabled by default. |
|
userdebug |
make userdebug 与 user一样, 除: · 还安装与debug标记模块 . · ro.debuggable=1 · adb is enabled by default. |
如果你建立一个flavor,然后想建一个,你应该运行make installclean,两个make间要保证让你不接受了以前installclean flavor。Make clean也足够了,但它需要的时间更长。
ANDROID Porting系列一、ANDROID编译系统的更多相关文章
- ANDROID Porting系列二、配置一个新产品
ANDROID Porting系列二.配置一个新产品 详细说明 下面的步骤描述了如何配置新的移动设备和产品的makefile运行android. 1. 目录//vendor/创建一个公 ...
- Android学习系列(38)--Android源码下载和编译
前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在<拓展系列>里.随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以 ...
- Android逆向系列文章— Android基础逆向(6)
本文作者:HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1) Android逆向-Android基础逆向(2) Android逆向-Android基础逆向(2 ...
- Android学习系列(40)--Android主题和样式之系统篇(下)
11)Widget样式(Widget Style) 特别说明,此处定义大量的系统内置控件的样式,对于重写原生控件的样式具有很大的参考价值. <!-- Widget styles --> & ...
- Android学习系列(42)--Android Studio实战技巧
使用android studio开发项目的一些问题,功能和技巧. 1. 环境 Mac OSX 10.9.5 + Android Studio 0.8.9 2. gradle项目加载超慢 这是因为gra ...
- Android学习系列(41)--Android Studio简单使用
1. 环境 UBUNTU 14.04 + Android Studio 0.8.2 2. 安装jdk openjdk-7是一个很好的选择: sudo apt-get update sudo apt-g ...
- Android学习系列(39)--Android主题和样式之系统篇(上)
[基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计 ...
- Android开发系列之Android项目的目录结构
今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目 ...
- Android调试系列—使用android studio调试smali代码
1.工具介绍 使用工具 android killer:用于反编译apk包,得到smali代码 android studio:调试smali代码工具,或者使用idea,android studio就是在 ...
随机推荐
- 6 关于 Oracle NULL栏位和PL./SQL执行实验
今日有针对NULL值有了相关实验. 对NULL 值插入的讨论. 1, PL/SQL 中可以执行插入''或者NULL 的操作, 前提是栏位允许为空. 2, 可以对NULL进行一系列数据库运算. 如: ...
- Codevs 4768 跳石头 NOIP2015 DAY2 T1
4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 一年一度的"跳石头"比赛又要开始了! ...
- 视频处理简单实例 [OpenCV 笔记2]
VideoCapture是OpenCV 2.X中新增的类,提供从摄像机或视频文件捕获视频的C++接口.利用它读入视频的方法一般有两种: // method 1 VideoCapture capture ...
- Android中为APP创建快捷方式的原理(自己的理解)
我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...
- [学习笔记]设计模式之Facade
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Facade(外观)模式定义了一个高层接口,它能为子系统中的一组接口提供一个一致的界面,从而使得这一子系统更加容易使用.欢迎回到时の魔 ...
- Java学习----集合函数
1.List----有序的collection(序列) 与数组的不同:数据类型可以相同可以不同,数组的长度是预先定义好的,集合的长度也是预先定义好的,但是长度会随着元素的增加而增加 ArrayList ...
- C#.Net网页加载等待效果漂亮并且简单
最近网页加载数据比较多,点击后给用户就是白板很不友好,想了很久找了些资料,在网页加载中显示等待画面给客户,页面加载完成自动隐藏等待效果. 在网页后台cs代码: protected void Pa ...
- ng-form
form提供的属性都是用来表示表单的验证状态的,包括:$pristine(表单没有填写记录).$dirty(表单有填写记录).$valid(通过验证).$invalid(未通过验证).$error(验 ...
- Swift(一,创建对象,类型推导,基本运算,逻辑,字符串,数组,字典)
swift用起来刚开始感觉有点怪怪的,但用了一段时间觉得还是挺好用的,哈哈.毕竟都是要有一个过程的嘛. 我就写一些自己在使用swift的时候的注意点吧,如有不正之处,还请指正! 一.在开发中优先使用常 ...
- ”ENV_IS_EMBEDDED“解惑以及相关的移植实验
一.概述( ENV_IS_EMBEDDED的目的) 经典资料 认识 ENV_IS_EMBEDDED只有在CFG_ENV_IS_IN_FLASH或者CFG_ENV_IS_IN_NAND定义了才有 ...