为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Android(安卓)编译系统

2017-10-31 7页 doc 22KB 23阅读

用户头像

is_633808

暂无简介

举报
Android(安卓)编译系统Android(安卓)编译系统 Android编译系统 Android使用自己定制的编译系统来生成工具、二进制文件和文档。本文档提供了一个android编译系统的概述,并做了一个简单的编译说明。 Android的编译系统基于最近版本的GNU Make(注:android使用GNU Make一些高级的特性,这些特性可能并不一定在GNU Make官网上出现)。在继续下面的步骤前,请用make -v在检测你的Make版本。如果你的版本在3.80以下,你则需要更新你的Make。 一、理解Makefile 一个makefile...
Android(安卓)编译系统
Android(安卓)编译系统 Android编译系统 Android使用自己定制的编译系统来生成工具、二进制文件和文档。本文档提供了一个android编译系统的概述,并做了一个简单的编译说明。 Android的编译系统基于最近版本的GNU Make(注:android使用GNU Make一些高级的特性,这些特性可能并不一定在GNU Make官网上出现)。在继续下面的步骤前,请用make -v在检测你的Make版本。如果你的版本在3.80以下,你则需要更新你的Make。 一、理解Makefile 一个makefile定义了如何编译一个特定的应用程序。典型的makefile一般包括下面几个元素: 1.名字:给出要编译目标的名字 (LOCAL_MOUDLE := ) 2.本地变量:用CLEAR_VAR清除本地变量 (include $(CLEAR_CARS)) 3.文件:决定你的应用所依赖的源文件 (LOCAL_SRC_FILES := main.c) 4.标签:必要时,定义标签 (LOCAL_MODULE_TAGS :=ENG development) 5.库文件:定义你的应用程序所需链接的库文件 (LOCAL_SHARED_LIBRARIES := cutils) 6.文件:针对特定目标,包含一个模板文件 (include $(BUILD_EXECUTABLE)) 下面的代码片段就介绍了一个典型的makefile LOCAL_PATH := $(my-dir) include $(CLEAR_VARS) LOCAL_MODULE := 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 二、图层 下所描述的图层是对android编译系统的抽象 每一层都涉及到它上面的一个的一个一对多的关系。例如,Arch 可以有超过一个Board,每块Borad可以有一个以上的Device。您 可以在一个给定的图层中定义一个与其他元素相似的元素,从而简化 维护。 ------------------------------------------------------------------------------------------------------------------------------------- 图层 例子 描述 ------------------------------------------------------------------------------------------------------------------------------------- Product myProduct 该图层定义了一个规格完整的产品,定义了编译哪些模块和怎样配 置它们 ------------------------------------------------------------------------------------------------------------------------------------- Device myDevice 该层代表设备的物理层,例如,北美设备可能包括QWERTY键盘, 而在法国出售的设备可能包括AZERTY键盘。外设通常链接到该 层。 -------------------------------------------------------------------------------------------------------------------------------------- Borad goldfish trout 该层代表一个产品的裸的原理图。你也可以连接外围设备到该层。 -------------------------------------------------------------------------------------------------------------------------------------- Arch arm x86 该层描述了你板子上跑的处理器 --------------------------------------------------------------------------------------------------------------------------------------- 三、编译Android平台 这部分描述如何编译android的默认版本。一旦你了解了通用的编译方式,你就可以开始适配你自己的目标板了。 设备源码 编译通用版本的android,首先source build/envsetup.sh 这个文件包含了必要的变量和函数定义,如下: $cd $TOP $. build/envsetup.sh $choosecombo $make -j4 PROUDUCT-generic-user 你也可以用eng代替user进行编译,方便调试。 $make -j4 PRODUCT-generic-eng 这些选项(eng、user...)不同于调试选项和安装的包 清除 执行$m clean清除你刚刚编译出的二进制文件。你也可以执行$m clobber来清除所有组合下的二进制文件,不同的是$m clobber会把存储目标文件的out目录删除。 快速重新编译 每一个组合会存储在out子目录下,如果可以在编译组合间切 换,而不是每次都把所有的源码都编译,那就可以更快地编译了 然而,如果编译系统没有捕获到环境变量或Makefile的改变,执行 纯净的重新编译是还是有必要的。如果这经常发生的话,你可以这样 定义环境变量: $export USE_CCACHE=1 这样做将强制编译系统使用ccache编译cache tool。它将重新 编译所有源码 ccache二进制文件在prebuilt目录下,并且不用安装到你的系统里 四、常见问题 以下错误很可能是由运行较早版本的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) [...] 检查你的java版本,你应该看到如下信息 $java -version 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)如果你发生了上述 错误,但确实使用的java1.5或更新的,就请确认一下你的PATH变 量 五、编译android内核 这部分描述了如何编译android默认内核,一旦你了解了通用 的编译方式,你就可以为你的目标板适配android驱动了 在编译内核前,切换到device目录以建立环境变量 $. build/envsetup.sh $partner_setup generic 然后切换到kernel目录 检查分支 默认的分支一直是android。为了检查不同的分支,执行如下命令: $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" 为了简化代码管理,让你当地的分支与远程它是跟踪(在上面的代码 片段所示)分支名字相同,通过执行$git checkout . 分支之间切换。 六、验证 靠执行下面的命令可以找出那些分支是存在的,那些是积极的(标有星号的) $ git branch -a android * android-mydevice origin/HEAD origin/android origin/android-mydevice origin/android-mychipset略去-a参数 就可以只看到本地分支了 七、编译内核 $make -j4 编译选项 当编译一个特定版本时,相对最终版本经常会有些轻微的改动,这些标签就变得有用了 这些是当前定义的编译选项 eng 这是一个默认的选项,执行make 和make eng是一样的 1. 安装具有eng、user、and/or developement标签的模块 2. 安装没有标签的非apk模块 3. 根据product定义安装apk和具有标签的apk 4.ro.secure=0 5.ro.debuggable=1 6.ro.kernel.android.checkjni=1 7.adb默认可用 user 1. 安装具有user标签的模块 2. 安装没有标签的非apk模块 3. 根据product定义安装apk,apk忽略标签 4. ro.secure=1 5. ro.debuggable=0 7. adb 默认不可用 userdebug 同user,除了 1. 同时安装具有debug标签的模块 2. ro.debuggable=1 3 adb默认可用 如果你编译时是一种标签,又想编译其他的,在两次make之间 你 应该运行make installclean。make clean也可以,但是会花更多的 时间
/
本文档为【Android(安卓)编译系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索