利用mm命令编译Android模块

合集下载

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

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

环境Linux 版本:Ubuntu 11.04 (可由10.10的版本进行升级)64位系统GCC版本:gcc version 4.5.2Java版本:java version "1.6.0_26"下载android源码前注意:1、保证Ubuntu系统中的容量在80G左右,以保证足够的空间来存放android源码以及编译后的相关文件。

2、保证Ubuntu系统进行Internet访问。

联网方法:采用拨号进行连接。

相关操作步骤如下所示:1、虚拟机→设置→硬件→网络适配器→网络连接→桥接2、启动Ubuntu系统,打开终端(在普通用户下),输入相关命令如下:$ pppoeconf //打开后输入上网账号跟密码,确认保存$ sudo pon dsl-provider //上网连接命令经过这两个步骤后就可以进行上网了。

Android源码编译所依赖的tools01.$ sudo apt-get update02.$ sudo apt-get -y install git-core03.$ sudo apt-get -y install gnupg04.$ sudo apt-get -y install sun-java6-jdk flex05.$ sudo apt-get -y install bison06.$ sudo apt-get -y install gperf07.$ sudo apt-get -y install libsdl-dev08.$ sudo apt-get -y install libesd0-dev09.$ sudo apt-get -y install libwxgtk2.6-dev10.$ sudo apt-get -y install build-essential11.$ sudo apt-get -y install zip12.$ sudo apt-get -y install curl13.$ sudo apt-get -y install libncurses5-dev14.$ sudo apt-get -y install zlib1g-dev15.$ sudo apt-get -y install valgrind注意:(如果是32bit的系统的话,则要更改几个Android.mk文件)01./external/clearsilver/cgi/Android.mk02./external/clearsilver/java-jni/Android.mk03./external/clearsilver/util/Android.mk04./external/clearsilver/cs/Android.mk用gedit打开,修改m64为m32即可另外将build/core/main.mk中的ifneq (64,$(findstring 64,$(build_arch)))修改为:ifneq (i686,$(findstring i686,$(build_arch)))对于32位系统所出现的问题,解决方法:Error1:make: ***[out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] error 1在terminal中输入$ gedit frameworks/base/libs/utils/Android.mk将LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)修改为:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissiveError2:make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] error 1此处编译错误是由于ubuntu 11.10采用了GCC4.6.1导致的修改源码目录下/build/core/combo/HOST_linux-x86.mk并将以下语句:HOST_GLOBAL_CFLAGS+= -D_FORTIFY_SOURCE=0修改为:HOST_GLOBAL_CFLAGS+= -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0Android源码下载1、安装repo安装过程步骤如下所示:Repo下载安装1、$ mkdir ~/bin //在home目录下创建bin文件夹2、$ PATH=~/bin:$PA TH //环境变量设置3、$ curl https:///dl/googlesource/git-repo/repo > ~/bin/repo //repo下载4、$ chmod a+x ~/bin/repo //权限设置,保证repo可执行Repo client初始化1、$ mkdir Android //创建Android目录,用于存放下载的android源码2、$ cd Android //进入到Android目录3、$ repo init -u https:///platform/manifest //指定URL清单,指定包含在Android源代码的各种存储库将被安置在工作目录中当然也可以指定android版本,使用如下命令:$ repo init -u https:///platform/manifest -b android-4.0.1_r1Android源码文件获取$ repo sync注意:在Android源码下载过程中凡出现问题,可以进入Android源码下载的相关官方网站/source/downloading.html 进行查看。

Android系统编译

Android系统编译

Android系统编译Android 系统编译博客分类:•Android最近研究了下Android 的编译系统,下面结合编译我们自己的产品mobot 来对整个编译系统进行必要的介绍,方便大家今后对默认编译的修改。

先列出几个觉得重要的Make 文件:build/buildspec.mkbuild/envsetup.shbuild/core/main.mkbuild/core/envsetup.mkbuild/config.mk总的来说,Android 以模块 (module/package) 的形式来组织各个系统的部件,每个模块(module/package) 的目录下都会有一个Android.mk 。

所谓 module 就是指系统的 Native Code ,而相对于Java 写的 Android application 称为 package 。

Makefile的主要流程 1初始化参数设置 2读取Product 的设定 3读取BoardConfig 4读取所有Module 4产生相应的Rules ,生成 image 5具体make 操作: 6完整编译 6模块编译 6单独编译image 文件 7一些疑问和解答: 7Makefile的主要流程以下主要流程都在build/core/main.mk 里安排。

l 初始化相关的参数设置(buildspec.mk 、envsetup.mk 、config.mk)l 检测编译环境和目标环境l 决定目标productl 读取product 的配置信息及目标平台信息l 清除输出目录l 检查版本号l 读取Board 的配置l 读取所有Module 的配置l 根据配置产生必要的规则(build/core/Makefile)l 生成image初始化参数设置在main.mk里,简单设置几个主要编译路径的变量后,来到config.mk :——————————————config.mk ——————————————其中设置了源文件的一系列路径,包括头文件、库文件、服务、API 已经编译工具的路径。

Mtk Android编译命令

Mtk Android编译命令

banyan_addon 建立MTK sdk addon
cts 建立cts包
bootimage 编译boot映像
cacheimage 编译cache映像
systemimage 编译系统映像
mrproper 移除所有产生的文件+config+。。。
mm 通过android本地命令“mm”编译模块
emigen 产生EMI设置源代码
nandgen 生成支持nand flash设备列表
codegen 生成跟踪DB(META/凯瑟等使用的工具)。
userdataimage 编译用户数据映像
target--packege 编译目标文件包
updataepackege 编译更新包
dist 编译分发包
Modules:
pl, preloader : Specify to build preloader.
snod 没有依赖的情况下去编译系统映像
recoveryimage 编译恢复映像
secroimage 编译secro映像
factoryimage 编译工厂映像
userdataimagenodeps 没有依赖的情况去编译用户数据映像
NULL 编译所有
(makeMtk|mk) [options] project actions [modules]
options:
-t 打印标准输出信息
-o 通过附加参数去make
project:
一个可用的项目(可以用mk listp来查看有哪些可用项目),或则缺省(延续上一次的项目)
lk : Specify to build little kernel.
ub, uboot : Specify to build uboot.

Android源代码编译过程及指令

Android源代码编译过程及指令

Android源代码编译过程及指令编译Android源代码分为两种情况:1. 完整编译源码:./mk_aliphone.sh --> 完整编译脚本--> 6735 输⼊对应的编号--> userdebugadbnew(-->remake)上述指令流程后,若报错,则将错误解决后,执⾏. ./mk_aliphone.sh后开始编译流程2. 源码编译完成后,单独编译模块:. ./build/envsetup.sh (当前⽬录:build/⽬录上级⽬录) --> 初始化环境的脚本:envsetup.shlunch(在当前⽬录即可)选择CPU:full_aeon6735_65c_s_l1-userdebug选择要编译的模块(即:进⼊到想要编译的模块)⽐如:~/v6SourceCode/aliyunos/packages/apps/uShell(只需要执⾏⼀次脚本和lunch;再次进⼊时就不需要)mm -b(触发编译)source xxx.sh 初始化编译环境lunch 指定本次编译的⽬标设备以及编译类型make -j12 开始编译,默认是编译整个系统,参数表⽰编译的job数量单独编译apk结果⽬录:~/v6SourceCode/out/target/product/generic(aeon6735_65c_s_l1)/system/app/uShell(对应编译的模块)单独编译apk后,将结果apk安装到设备中,⼀般有两种⽅式:adb install和adb push;可以分别使⽤两种⽅式安装。

其他资料:引⾃:对⽐博⽂:按照Google给出的编译步骤如下:1. source build/envsetup.sh 加载编译指令(envsetup.sh⽂件存放在Android源代码根⽬录下的build⽬录下)2. lunch 选择平台编译选项 --> 控制台列出所有可供选择的平台,使⽤哪个平台根据具体情况⽽定,本次选择6735_debug3. make 执⾏编译分析1:source build/envsetup.sh上述指令⽤来将envsetup.sh⾥的所有指令加载到环境变量中,⽐如:⽹上提供的指令列表function help() # 显⽰帮助信息function get_abs_build_var() # 获取绝对变量function get_build_var() # 获取绝对变量function check_product() # 检查productfunction check_variant() # 检查变量function setpaths() # 设置⽂件路径function printconfig() # 打印配置function set_stuff_for_environment() # 设置环境变量function set_sequence_number() # 设置序号function settitle() # 设置标题function choosetype() # 设置typefunction chooseproduct() # 设置productfunction choosevariant() # 设置variantfunction tapas() # 功能同choosecombofunction choosecombo() # 设置编译参数function add_lunch_combo() # 添加lunch项⽬function print_lunch_menu() # 打印lunch列表function lunch() # 配置lunchfunction m() # make from topfunction findmakefile() # 查找makefilefunction mm() # make from current directoryfunction mmm() # make the supplied directoriesfunction croot() # 回到根⽬录function cproj()function pid()function systemstack()function gdbclient()function jgrep() # 查找java⽂件function cgrep() # 查找c/cpp⽂件function resgrep()function tracedmdump()function runhat()function getbugreports()function startviewserver()function stopviewserver()function isviewserverstarted()function smoketest()function runtest()function godir () # 跳到指定⽬录 405具体看⼀下YunOS平台上的envsetup.sh⽂件内容:envsetup.sh主要的作⽤如下:1. 加载编译时使⽤到的函数命令:m、mm等等2. 添加两个编译选项:generic-eng和simulator3. 查找vendor/<⼚商⽬录>/和vendor/<⼚商⽬录>/build/下的vendorsetup.sh;如果存在的话,就加载执⾏,添加⼚商⾃⼰定义的编译选项分析2:lunch执⾏lunch命令,它会打印出⼀个选择菜单,列出可⽤的编译选项;lunch命令是envsetup.sh⾥定义的⼀个命令,⽤来让⽤户选择编译项,来定义Product和编译过程中⽤到的全局变量。

【推荐下载】Android编译-missing separator-错误的解决

【推荐下载】Android编译-missing separator-错误的解决

Android 编译”missing separator”错误的解决2016/11/17 14203今天在Android7.0 源码环境中利用mm 编译某个模块的时候,总是莫名的报错,报错信息如下:device/actions/common/prebuilt/apk/actions/FileExplorer/Android.mk:15: *** missing separator.1 ifeq ($(wildcard $(TOP)/device/actions/common/packages/AgingTest/Android.mk),)23 LOCAL_PATH := $(call my-dir)4 include $(CLEAR_VARS)5 LOCAL_MODULE := prebuild_apk_AgingTest6 LOCAL_MODULE_STEM := prebuild_apk_AgingTest.apk7 LOCAL_SRC_FILES := app/AgingTest.apk8 LOCAL_MODULE_TAGS := optional9 LOCAL_MODULE_CLASS := APPS 10 LOCAL_DEX_PREOPT := false 11 LOCAL_CERTIFICATE := PRESIGNED 12 LOCAL_MODULE_PATH := $(TARGET_OUT)/app 13 include $(BUILD_PREBUILT) 14 15 endif #here need a space, why? without it, compile failed! 没发现什么错误啊,但就是编译不过啊,搞了很久,最后发现:居然是最后一行的”endif”后面没有空格导致的,加个空格就可以编过,这他娘的什么江湖啊,不是,什么规则啊,知道的同学,麻烦告知,不胜感激!tips:感谢大家的阅读,本文由我司收集整编。

MTKandroid快速编译方法

MTKandroid快速编译方法

MTKandroid快速编译方法[FAQ10625] 提升Android编译速度Platform:MT6572MT6582MT6588MT6589MT6592MT6595M T6571MT6582/92+MT6290Branch:GB3JB2JB3JB5JB9GB5JB7FAQ Content[DESCRIPTION]Android codebase都很大,编译一次都需要花很多时间,如果是preloader/lk/bootimage还好,但是Android的话都是非常久。

实际上这个编译时间还是可以进一步缩短![KEYWORD]ccache编译时间提升降低[SOLUTION]1. 移除modules_to_check(1). Android默认是所有模块都会编译的(不管需不需要),这个有些冗余,可以通过修改编译系统不编译哪些没有用到的模块(2). 修改方法:alps/build/core/main.mkfiles: prebuilt \$(modules_to_install) \$(modules_to_check) \$(INSTALLED_ANDROID_INFO_TXT_TARGET)修改为:files: prebuilt \$(modules_to_install) \$(INSTALLED_ANDROID_INFO_TXT_TARGET)(3). 如果是ubi nand文件系统的项目(比如72 nand项目),还需要在alps/build/core/Makefile中:$(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) \$(INSTALLED_RAMDISK_TARGET) \$(INSTALLED_BOOTIMAGE_TARGET) \$(recovery_binary) \$(recovery_initrc) $(recovery_kernel) \$(INSTALLED_2NDBOOTLOADER_TARGET) \$(recovery_build_prop) $(recovery_resource_deps) \$(recovery_fstab) \$(recovery_gzip) $(recovery_sec_ko) \$(RECOVERY_INSTALL_OTA_KEYS)的前面添加:ifeq ($(TARGET_USERIMAGES_USE_UBIFS),true)$(INSTALLED_RECOVERYIMAGE_TARGET):$(recovery_ubiformat)endif否则会编译失败!(4). 修改后Android编译时间降低16%~18%(数据仅供参考)(5). 此种方法google已在4.3版本默认应用了。

Ubuntu下编译Android源码并运行Emulator 2

Ubuntu下编译Android源码并运行Emulator 2

Ubuntu下编译Android源码并运行Emulator 2//apt-get autoremove sun-java5-jdk//apt-get install nautilus-open-terminalandroid源码的编译安装虚拟机时建议设置空间为16G左右,否则后面编译源代码可能会导致空间不够编译环境:Ubuntu8.101、安装一些环境sudo apt-get install build-essential //sudo apt-get install makesudo apt-get install gccsudo apt-get install g++ //sudo apt-get install libc6-devsudo 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-devsudo apt-get install zlib1g-devsudo apt-get install valgrindsudo apt-get install python2.5安装java环境sudo apt-get install sun-java5-jdk不要用sun-java6-jdk,否则会有问题2、设置环境变量vim ~/.bashrc在.bashrc中新增或整合PA TH变量,如下#java 程序开发/运行的一些环境变量在home/你的用户名/.bashrc中加入下面一些,有些是后面运行编译后的模拟器而用的export JA VA_HOME=usr/lib/jvm/java-1.5.0-sunexport JRE_HOME=usr/lib/jvm/java-1.5.0-sun/jreexport PA TH=$PATH JA V A_HOME/binexport PA TH=$PATH:~/mydroid/out/host/linux-x86/binexport ANDROID_PRODUCT_OUT=~/mydroid/out/target/product/genericexport CLASSPATH=.{JA V A_HOME}/lib JRE_HOME/lib CLASSPATHexport JA VA_PATH=${JA V A_HOME}/bin{JRE_HOME}/binHOME_BIN=~/bin/export PA TH=${PATH}{JA V A_PA TH}{JRE_PATH}{HOME_BIN};3、安装repo(用来更新android源码)创建~/bin目录,用来存放repo程序,如下:$ cd ~$ mkdir bin注意:下载后的.repo也许并不在这个文件夹中,请返回上一级目录找到后拷贝至此下载repo脚本并使其可执行:$ curl /repo >~/bin/repo$ chmod a+x ~/bin/repo4、下载android源码并更新之$ mkdir mydroid$ cd mydroid方式一建议不要用repo来下载(android源码超过1G,非常慢),直接在网上下载http: ///bbs/pub/cupcake.tar.gz。

android模块编译,mm,mmm

android模块编译,mm,mmm

android模块编译,mm,mmm如果你只修改某⼀个模块的内容,却每次都要执⾏make, 最后等待很长时间。

使⽤模块编译,只需要在你所在的模块的⽬录或者其⼦⽬录,执⾏mm,便可以编译出⼀个单独的apk,这样岂不快哉!具体步骤:1)打开~/.baserc⽂件,加⼊source ~/I850/build/envsetup.sh. 加⼊你⾃⼰该⽂件所在的路径,这样就免去了每次启动新的终端执⾏mm 命令之前,需要引⽤此⽂件。

2)完成步骤1之后,就可以在你的模块⾥⾯随意执⾏mm了,要想使⽤其他快速命令,可以查看envsetup.sh⽂件,⽐如cgrep,jgrep,resgrep在不同类型的⽂件⾥⾯进⾏相应的查询。

还有m,mmm等等3)还可以使⽤adb push 将你的apk push到模拟器或者⼿机终端,也可以在⼯程根⽬录通过make -snod⽣成新的system.img编译模块Android中的⼀个应⽤程序可以单独编译,编译后需要重新⽣成system.img。

在Android⽬录下运⾏$ . build/envsetup.sh 或者$ source build/envsetup.sh ,然后就会多出⼏个可⽤的命令:- croot: Changes directory to the top of the tree.- m: Makes from the top of the tree.- mm: Builds all of the modules in the current directory.- mmm: Builds all of the modules in the supplied directories.- cgrep: Greps on all local C/C++ files.- jgrep: Greps on all local Java files.- resgrep: Greps on all local res/*.xml files.- godir: Go to the directory containing a file.- printconfig: 当前build的配置情况.可以使⽤ --help查看⽤法。

m,mm,mmm的用法

m,mm,mmm的用法

m,mm,mmm的⽤法通过查看android源码⽬录下的build/envsetup.sh⽂件,可知:- m: Makes from the top of the tree.- mm: Builds all of the modules in the current directory.- mmm: Builds all of the modules in the supplied directories.要想使⽤这些命令,⾸先需要在android源码根⽬录执⾏. build/envsetup.shm:编译所有的模块mm:编译当前⽬录下的模块,当前⽬录下要有Android.mk⽂件mmm:编译指定路径下的模块,指定路径下要有Android.mk⽂件下⾯举个例⼦说明,假设我要编译android下的libjpeg模块,当前⽬录为源码根⽬录,⽅法如下:1、. build/envsetup.sh2、mmm external/jpeg/或者:1、. build/envsetup.sh(.和build之间有空格)2、cd external/jpeg3、mm最后说明⼀下,envsetup.sh只要source⼀次就够了,source之后还可以⽤croot命令返回到源码根⽬录,很好⽤。

1、修改APK应⽤:在packages中的应⽤如果修改后都可以单独编译。

先执⾏$. build/envsetup.sh #初始化$mmm packages/providers/ContactsProvider/##⽤mm/mmm来编译⽣成的.apk并不会打包到system.img中,需要我们⼿动通过make snod把system⽂件夹打包为system.img##可以使⽤make snod将模块打包到system.img中,也可以使⽤ adb install *.apk安装注:通过mmm packages/providers/ContactsProvider/ 编译后的apk在 out/target/product/generic/system/app这时候通过 adb install out/target/product/generic/system/app/xxx.apk 安装你刚修改过的apk就可以在模拟器上看到你修改的效果了。

mmm等和envsetup.sh

mmm等和envsetup.sh

mmm等和envsetup.sh⼀、envsetup.sh简介Android 完成编译的时候先执⾏ source build/envsetup.sh。

在这个shell 脚本中定义了 help, croot, m, mm, mmm 等 function,这些function可以作为命令⾏⼯具使⽤。

source命令:source 命令会把对应脚本中的内容读取到当前的bash 解释器中,在当前的执⾏环境中执⾏;其中定义的 function 以及通过export 声明的变量等在 source 执⾏结束之后依然存在于当前的bash 环境中。

⽐如我们常⽤的 source .bashrc 或者 source .profile等⽬的是为了引⽤刚刚改动过的环境变量。

envsetup.sh中提供⼀下⼯具:lunch:lunch<product_name> - <build_variant>tapas:tapas[<App1> <App2> ...] [arm | x86 | mips] [eng | userdebug | user]croot:将⽬录更改为树的顶部。

m:从树顶make。

mm:构建(build)当前⽬录中的所有模块。

mmm:构建(build)所提供⽬录中的所有模块。

cgrep:Greps所有本地C/C ++⽂件。

jgrep:Greps所有本地Java⽂件。

resgrep:Greps on all local res/*.xml⽂件。

godir:到包含⽂件的⽬录。

add_lunch_combo:在lunch函数的菜单中添加⼀个条⽬m:编译整个安卓系统。

mm:编译当前⽬录下的模块,当前⽬录下需要有Android.mk,否则就往上找最近的Android.mk⽂件。

mma:当前⽬录新增或删除⽂件后,可以⽤mma重新编译。

mmm:编译指定路径下的模块,指定的路径下⾯需要有Android.mk。

Android编译流程 makefile流程

Android编译流程 makefile流程

想要了解一個系統,我常會從makefile 或是building system 下手,以了解系統組成元素為何? 目錄結構為何? 對於Android,我也不例外。

透過了解building system ,我們能知道如何新增、修改、刪除程式,並保有完整性,順利編譯出結果。

設定檔Android building system 包括幾種重要的設定檔,∙Android.mk∙AndroidProducts.mk∙target_<os>-.mk, host_-.mk and -.mko BoardConfig.mko buildspec.mkAndroid.mk 是module 和package 的設定檔,每個module/package 的目錄下都會有一個Android.mk。

所謂的module 是指系統的native code ,相對於用Java 寫成的Android application 稱為package。

AndroidProducts.mk 則設定product 配置。

product 即特定系統版本,透過編譯不同product ,產生不同軟體配置內容,安裝不同的application。

Product 可視為特定專案,產生特定規格系統。

BoardConfig.mk 是為product 主板做設定,像是driver 選擇、設定。

*-.mk 則是針對選擇的作業系統和CPU 架構,進行相關設定。

buildspec.mk 是位於source 根目錄下,為進行編譯者所做之額外設定。

例如,可在此選擇要產生的product 、平台、額外的module/package 等。

參數build/envsetup.sh 實作一個mm 指令,以編譯單一module,不需編譯整個source tree。

ONE_SHOT_MAKEFILE 這個makefile 變數/參數就是用以實作這個功能。

使用方法是在執行make 時,將該變數指定為module 的Android.mk。

Android2.2源码编译步骤详解

Android2.2源码编译步骤详解

Android2.2源码编译步骤详解Ubuntu10.4 + Android2.2 + JDK1.51、编译环境Android2.2 + Ubuntu10.04 + JDK1.5安装必要的软件环境sudo apt-get install git-coresudo apt-get install gnupgsudo apt-get install flexsudo apt-get install bisonsudo apt-get install gperfsudo apt-get install libsdl-devsudo apt-get install libesd0-devsudo apt-get install libwxgtk2.6-devsudo apt-get install build-essentialsudo apt-get install zipsudo apt-get install curlsudo apt-get install libncurses5-devsudo apt-get install zlib1g-dev以上就是官方推荐的软件包,可能需要的软件包还有以下几个sudo apt-get install makesudo apt-get install gccsudo apt-get install g++sudo apt-get install libc6-devsudo apt-get install patchsudo apt-get install texinfosudo apt-get install valgrindsudo apt-get install pythonJDK1.5安装官方声明:32位操作系统下JDK必须要用1.5的,是因为在编译Android api docs时需要1.5的。

用JDK1.6必须用64位系统,当然也有解决办法,网上教程很多此处就不再一一声明。

2.Android源代码编译命令m和mm和mmm以及make分析

2.Android源代码编译命令m和mm和mmm以及make分析

老罗的新浪微博:/shengyangluo,欢迎关注!在前文中,我们分析了Android编译环境的初始化过程。

Android编译环境初始化完成后,我们就可以用m/mm/mmm/make命令编译源代码了。

当然,这要求每一个模块都有一个Android.mk文件。

Android.mk实际上是一个Makefile脚本,用来描述模块编译信息。

Android编译系统通过整合Android.mk文件完成编译过程。

本文就对Android源代码的编译过程进行详细分析。

从前面Android编译系统环境初始化过程分析这篇文章可以知道,lunch命令其实是定义在build/envsetup.sh文件中的函数lunch提供的。

与lunch命令一样,m、mm和mmm 命令也分别是由定义在build/envsetup.sh文件中的函数m、mm和mmm提供的,而这三个函数又都是通过make命令来对源代码进行编译的。

事实上,命令m就是对make命令的简单封装,并且是用来对整个Android源代码进行编译,而命令mm和mmm都是通过make命令来对Android源码中的指定模块进行编译。

接下来我们就先分别介绍一下函数m、mm和mmm的实现,然后进一步分析它们是如何通过make命令来编译代码的。

函数m的实现如下所示:函数m调用函数gettop得到的是Android源代码根目录T。

在执行make命令的时候,先通过-C选项指定工作目录为T,即Android源代码根目录,接着又将执行命令m指定的参数$@作为命令make的参数。

从这里就可以看出,命令m实际上就是对命令make的简单封装。

函数mm的实现如下所示:函数mm首先是判断当前目录是否就是Android源码根目录,即当前目录下是否存在一个build/core/envsetup.mk文件和一个Makefile文件。

如果是的话,就将命令mm当作是一个普通的make命令来执行。

否则的话,就调用函数findmakefile从当前目录开始一直往上寻找是否存在一个Android.mk文件。

安卓编译详解

安卓编译详解

安卓编译详解安卓编译详解1.关于make1.Make命令在执行的时候,默认会在当前目录找到Makefile文件,根据Makefile文件中的指令来对代码进行编译2.Makefile文件中的指令可以是编译命令,例如gcc,也可以是其它命令,例如Linux系统中的shell命令cp、rm3.make命令事实也是通过shell命令来完成任务的,但是它的神奇之处是可以帮我们处理好文件之间的依赖关系1.Makefile文件最基础的功能就是描述文件之间的依赖关系以及怎么处理这些依赖关系2.Make根据Makefile指令两个文件之间存在依赖关系,以及当被依赖文件发生变化时如何处理目标文件4.Makefile可划分为Makefile片段(fragement),Makefile通过include指令来将片段组装在一个Makefile 2.build/envsetup.sh脚本文件1.envsetup.sh会在vendor和device两个目录将厂商指定的envsetup.sh也source到当前shell,通过vendor和device两个目录的envsetup.sh可获得厂商提供的产品配置信息2.envsetup.sh还提供了以下几个重要的命令来帮助我们编译Android源码mm1.lunch:用来初始化编译环境,例如设置环境变量和指定目标产品型号1.设置TARGET_PRODUCT、TARGET_BUILD_VARIANT、TARGET_BUILD_TYPE和TARGET_BUILD_APPS等环境变量,用来指定目标产品类型和编译类型2.通过make命令执行build/core/config.mk脚本1.build/core/config.mk会加载build/core/dumpvar.mk打印出当前的编译环境配置信息2.build/core/config.mk脚本还会加载BoradConfig.mk和envsetup.mk配置目标产品型号相关信息2.m:相当于是在执行make命令。

android编译apk

android编译apk
#sdk版本不能是current,否则@hide的api无法调用到!!!所以下一行注释掉
#LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := bright-yinjk
LOCAL_CERTIFICATE := platform
#编译程序产生的apk是经过dex 优化的,若安装出现Failure [INSTALL_FAILED_DEXOPT],加上下面一句
# name of the development build or, if this is a release build, the official
# SDK version of this release.
ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"
endif
注释即可。
3、对于包含.so文件的工程,编译的Android.mk文件中 LOCAL_MODULE := lib[.so文件名] 而非 NDK 编译中的 LOCAL_MODULE := [.so文件名]。
4、对于我编译的sdk,如果需要在模拟器启动完成后,就已经安装了该应用那么还需要在该目录下添加如下编译脚本:
5、对于 apk 安装出现 Failure [INSTALL_FAILED_DEXOPT]
这个是因为你编译程序产生的apk是经过dex 优化的。你可以在makefile里加上LOCAL_DEX_PREOPT := false 再重新生成apk,再安装试试。
2、对于 apk 安装出现 Failure [INSTALL_FAILED_OLDER_SDK]
打开[源码目录]/build/core/version_defaults.mk 文件:

搭建Android源码编译环境

搭建Android源码编译环境

Android 2.3.1 的源代码并在 Ubuntu 10.04(32 位)上编译通过。

这篇文章简 要记录了下载、编译的过程。

关于搭建 Android 开发环境的文章已经有很多,本文只简要介绍一下,做为备 忘。

[ 编译前的准备 ] 这一步安装获取源代码以及编译所需要的软件,使用如下命令:$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev 另外,参考别人编译 Android 2.3 的经验,安装了下列软件包:$ sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6 虽然 Android 官方网站上讲不支持 Java 6,不过我使用 Java 6 也可以编译通 过,所以在这里 Easwy 安装的是 Java 6。

首先去掉/etc/apt/sources.list 中 这两行的注释,使能 Java 6 源:deb /ubuntu lucid partner deb-src /ubuntu lucid partner 然后安装 Java 6 JDK:$ sudo aptitude install sun-java6-jdk1接下来下载 repo 工具,这是 Google 提供的一个 Python 脚本,方便管理多个 Git 版本库:$ cd ~ $ mkdir bin $ curl /repo >~/bin/repo $ chmod a+x ~/bin/repo 记得把 repo 加到你的路径中, 方便以后使用。

编辑~/.bashrc, 加入下面一行:PATH=$PATH:~/bin export PATH 然后用命令. ~/.bashrc,以后就可以直接使用 repo 命令了。

编译文档

编译文档

1.编译1.1.编译系统级应用apk目前的理解是将应用程序的代码放到武当源代码目录路径下,然后进行编译。

将编译生成的*.apk通过adb或者其它方式放到/system/app目录下即可。

1.2.编译普通级应用apk应用程序的代码并没有放到平台的源代码目录下,然后通过编译生成的*.apk通过adb install的方式放到/data/app目录下,就是普通级的apk。

2.Android.mk2.1.作用Android.mk在编译中起着至关重要的作用,这其实就是Android 编译环境中的make file。

Android.mk文件是为了向生成系统描述你的源代码。

更明确的说:这个文件实际上是GNU Make文件的一小片段,它会被生成系统解析一次或多次。

因此,你应该在Android.mk里尽量少地声明变量。

2.2.详细说明2.2.1.LOCAL_PATHLOCAL_PATH := $(call my-dir):每个Android.mk文件都必须以定义LOCAL_PATH变量开始,其目的是为了定位源文件的位置。

2.2.2. CLEAR_VARSCLEAR_VARS变量是生成系统提供的,它指向一个特殊的GNU Makefile,它将会为你自动清除许多名为LOCAL_XXX的变量(比如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等),但LOCAL_PATH是例外,它不会被清除。

注意:这些变量的清除是必须的,因为所有的控制文件是在单一的Makefile,执行环境中解析的,在这里所有的变量都是全局的。

2.2.3. LOCAL_MODULELOCAL_MODULE变量必须定义,用来标识在Android.mk文件中描述的每个模块。

名称必须是唯一的,而且不包含任何空格。

注意编译系统会自动产生合适的前缀和后缀,例如:LOCAL_MODULE := screenshot,一个被命名为“screenshot”的共享库模块,将会生成“libscreenshot.so”文件。

Android编译时:m、mm、mmm、mma、mmma的区别

Android编译时:m、mm、mmm、mma、mmma的区别

Android编译时:m、mm、mmm、mma、mmma的区别m:编译整个安卓系统makes from the top of the treemm:编译当前⽬录下的模块,当前⽬录下需要有Android.mk这个makefile⽂件,否则就往上找最近的Android.mk⽂件。

builds all of the moudles in the current directorymma:当前⽬录新增或删除⽂件后,可以⽤mma重新编译。

mmm:编译指定路径下的模块,指定的路径下⾯需要有Android.mk这个makefile⽂件builds all of the moudles in the supplies directorymmma:指定⽬录下新增或删除⽂件后,可以⽤mmma重新编译。

// 未全编译的情况系下,可以使⽤该命令单编译模块mm、mmm是类似的,都是⽤来编译某些模块。

使⽤这些编译命令,⾸先需要在Android根⽬录下配置环境#source build/envsetup.sh 要确保当前根⽬录下有envsetup.sh脚本⽂件#lunch ... 对⼯程的选择#cd (要编译模块所在的⽬录)#mm(mma、mmm、mmma) -B -j2 2>&1 开始编译模块注:-B表⽰编译模块的所有⽂件,-j2表⽰编译的时候开启两个线程,2>&1表⽰将错误切换到输出(输⼊为0,输出为1,错误为2)。

envsetup.sh脚本⽂件⾥包含vendorsetup.sh 、lunch、 m mm mmm的定义mmm 和 mm 区别:mmm package/apps/DeskClockcd package/apps/DeskClock ,然后再mm。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在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
lunch m mm mmm pid printconfig print_lunch_menu resgrep runhat runtest set_java_home setpaths set_sequence_number set_stuff_for_environment settitle smoketest
startviewserver stopviewserver systemstack tapas tracedmdump
可以看到mm命令,意思是编译当前文件夹下的所有模块。

3. 接下来的事情将变得很简单,只需来到需要编译的模块文件夹下,运行mm命令即可,当然我们也可以用mmm命令,如mmm external/jpeg/,和在external/jpeg/目录下运行mm命令具有同样的效果。

相关文档
最新文档