Android编译过程详解
android bp编译流程
android bp编译流程
Android BP编译流程一般包括以下步骤:
1. 创建项目目录,并在项目根目录下创建一个名为Android.bp的文件。
2. 在Android.bp文件中定义要编译的模块。
这通常包括模块的名称、源代码文件和其他相关属性。
3. 配置模块,指定模块所需的参数和属性。
这可能包括AndroidManifest.xml文件的路径、签名证书的路径、资源目录的路径等。
4. 导入build/make/core/config.mk文件进行环境变量或重要参数的
配置。
5. 导入build/make/core/definitions.mk文件,定义一些其他变量。
6. 定义一系列规则,这些规则的目标是编译要生成的目标文件。
7. 执行编译命令,例如make或gradle编译,将源代码编译成可执行
文件或其他目标文件。
请注意,具体的编译流程可能因项目结构和使用的工具链而有所不同。
因此,以上步骤仅供参考,具体流程可能需要根据实际情况进行调整。
android编译流程
android编译流程Android编译流程是将源代码转化为可执行的Android应用程序的过程。
编译流程包括以下几个主要步骤:1.获取源代码:首先,开发人员需要从Android Open Source Project (AOSP) 或者其他可靠的源代码库中获取Android源代码。
获取源代码可以通过使用版本控制工具如Git来完成。
2.准备构建环境:在编译之前,需要准备好构建环境。
这包括安装正确的开发工具、依赖库和配置。
- 开发工具:Android编译使用Java编程语言,因此需要安装Java Development Kit (JDK)。
同时还需要安装Android软件开发工具包(SDK),用于构建和测试Android应用。
- 依赖库:编译Android需要一些依赖库,包括C/C++编译器、make 工具、libc、libm和其他系统库。
这些库可以通过安装合适的软件包管理工具来获取。
-配置:开发人员需要根据构建计划配置构建环境。
这包括选择编译器版本、构建目标平台以及其他构建选项。
3.设置环境变量:为了让系统能够找到正确的构建工具和依赖库,开发人员需要设置一些环境变量。
这可以通过在命令行终端中设置系统环境变量或者使用脚本文件进行配置来实现。
4.执行初始化构建:在进行实际的编译之前,需要执行一些初始化构建操作。
这包括解压源代码文件、创建构建描述文件、设置编译选项等。
5.编译源代码:编译源代码是整个编译流程的核心步骤。
在此步骤中,构建系统将递归地遍历整个源代码树,并将每个源文件编译成目标文件。
编译过程通常分为以下几个阶段:-预处理:在编译之前,构建系统会首先对源代码进行预处理。
预处理器将处理预处理指令、宏定义等,并将源代码转化为可供编译器识别的形式。
-编译:编译器将源代码编译成汇编语言或者中间代码。
-汇编:汇编器将汇编语言代码转化为机器可执行的二进制指令。
Android ninja 编译启动过程分析
Android ninja编译启动过程分析---make是如何转换到到ninja编译的1.首先你的得对make的工作机制有个大概的了解:运行的命令在要编译的目录下运行make,或者make target_namea.分析处理保存阶段(没有实际编译动作):它首先对当前目录下的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.mk97include$(BUILD_SYSTEM)/help.mk9899#Set up various standard variables based on configuration100#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:=true107endif108endif116ifeq($(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<===第二次扫描入这里了121ifndef BUILDING_WITH_NINJA122#Remove ninja build mark if it exists.123$(shell rm-f$(OUT_DIR)/ninja_build)124endif......endif////////!relaunch_with_ninja这里是文件底了接着上面的include build/core/ninja.mkbuild/core/ninja.mk:$(sort$(DEFAULT_GOAL)$(ANDROID_GOALS)):ninja_wrapper//使nijia_wrapper成为第一扫描后要做的action 的第一个跳入的标签ninja_wrapper:$(COMBINED_BUILD_NINJA)$(MAKEPARALLEL)@echo Starting build with ninja+$(hide)export NINJA_STATUS="$(NINJA_STATUS)"&&source$(KATI_ENV_SH)&&$(NINJA_MAKEPARALLEL) $(NINJA)$(NINJA_GOALS)-C$(TOP)-f$(COMBINED_BUILD_NINJA)$(NINJA_ARGS)这里被依赖$(COMBINED_BUILD_NINJA)要先被处理完后才能返回来继续这里的action了ifeq($(USE_SOONG),true)135$(COMBINED_BUILD_NINJA):$(KATI_BUILD_NINJA)$(SOONG_ANDROID_MK)136$(hide)echo"builddir=$(OUT_DIR)">$(COMBINED_BUILD_NINJA)137$(hide)echo"subninja$(SOONG_BUILD_NINJA)">>$(COMBINED_BUILD_NINJA)138$(hide)echo"subninja$(KATI_BUILD_NINJA)">>$(COMBINED_BUILD_NINJA)139else140COMBINED_BUILD_NINJA:=$(KATI_BUILD_NINJA)141endif继续看:$(KATI_BUILD_NINJA)162$(KATI_BUILD_NINJA):$(KATI)$(MAKEPARALLEL)$(DUMMY_OUT_MKS)$(SOONG_ANDROID_MK)FORCE 163@echo Running kati to generate build$(KATI_NINJA_SUFFIX).ninja...164+$(hide)$(KATI_MAKEPARALLEL)$(KATI)--ninja--ninja_dir=$(OUT_DIR)--ninja_suffix=$(KATI_NINJA_SUFFIX)--regen--ignore_dirty=$(OUT_DIR)/%--no_ignore_dirty=$(SOONG_ANDROID_MK)--ignore_optional_include=$(OUT_DIR)/%.P--detect_android_echo $(KATI_FIND_EMULATOR)-f build/core/main.mk$(KATI_GOALS)--gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK)在这个位置触发了的第二次build/core/main.mk(由kati处理的)的扫描,看起来他和make功能一样,这里kati要处理一遍: build/core/main.mk,下面他处理的包括的过程:文件开始....117else#!relaunch_with_ninja118ifndef BUILDING_WITH_NINJA119#Remove ninja build mark if it exists.120$(shell rm-f$(OUT_DIR)/ninja_build)121endif.....#endif也就是说kati处理了从main.mk文件开始到末尾的全部,不包括include build/core/ninja.mk部分的全部了,包括他include makefiles了@echo Running kati to generate build$(KATI_NINJA_SUFFIX).ninja.../////////////在屏幕上可以看到是否kati开始了扫描生成.ninja file的过程在这个过程中,kati要判断是否生成.ninja是否需要更新了,这个是在kati内部完成的!./:172:fprintf(stderr,"%s was modified,regenerating...\n",s.c_str());看来东西不少,然后他回到ninja_wrapper:下继续上一层的action执行ninja_wrapper:$(COMBINED_BUILD_NINJA)$(MAKEPARALLEL)//重新贴了一遍上面的东西@echo Starting build with ninja+$(hide)export NINJA_STATUS="$(NINJA_STATUS)"&&source$(KATI_ENV_SH)&&$(NINJA_MAKEPARALLEL) $(NINJA)$(NINJA_GOALS)-C$(TOP)-f$(COMBINED_BUILD_NINJA)$(NINJA_ARGS)这个执行就是启动ninja了,看:$(NINJA)$(NINJA_GOALS)@echo Starting build with ninja/////////////在屏幕上可以看到是否开是在ninja带领下编译开始了.....//====到此,第一阶段准备工作部分分析完成了,下面进入具体的ninjia编译阶段了3.总结kati代替了make过去做的非常相同一样的工作(连输出打印都很一样,例如遇到$(error xxxx)会退出),parse makefile。
android img 的编译过程
android img 的编译过程
Android img的编译过程通常包括以下步骤:
在Android源码根目录下执行初始化环境命令:source build/envsetup.sh。
使用lunch命令选择需要编译的版本,如:lunch full-eng。
执行make命令进行编译,如:make bootimage,这个命令会编译生成boot.img。
boot.img的生成过程主要是将kernel、ramdisk、dtb打包到一起。
在这个过程中,需要用到dtb.img,如果dtb.img过大导致编译不过,那么需要分析dtb.img的生成过程。
dtb.img实际上是将kernel下的dts文件重新命名后拷贝到out目录下生成的。
此外,编译Android系统时,make命令实际上是在执行Makefile文件。
Android系统的Makefile文件在源码根目录下,并且这个Makefile文件会包含另一个主要的Makefile文件,即main.mk。
在main.mk中,定义了一个默认目标droid,这个目标依赖于droid_targets。
droid_targets又依赖于droidcode和dist_files两大伪目标。
当执行make命令时,make工具会检查并解析这些依赖关系,然后按照依赖顺序生成目标文件。
Ubuntu12.04下在Android4.0.4源码下载及其编译过程
Ubuntu12.04下在Android4.0.4源码下载及其编译过程一、下载源码1、下载工具repo:https:///tools/repo/在本地目录建个bin的文件夹,进入bin文件夹;通过git下载:1.git clone https:///tools/repo下载完成后,进入repo文件夹,切换到稳定分支:1.git checkout -b stable origin/stable将repo命令所在的目录,即/home/yourname/bin/repo添加到环境变量中:1.export PATH=$PATH:~/bin/repo在本地目录下新建目录:android4.0.4,并进入该文件夹:[html]view plaincopy1.cd ~;mkdir android4.0.4;cd android4.0.4;在文件夹下执行下面命令来下载Android源码:1.repo init -u https:///platform/manifest你也可以直接切换到你想要下的版本的分支,而不是“master”分支:1.repo init -u https:///platform/manifest -b android-4.0.4_r2关于到底是哪个分支,根据自己的情况而定,详情可参照:https:///platform/manifest/如你想下载最新的Android4.1代码,即可将分支名称更换成:android-4.1.1_r4你也可以参照官网的下载方式来下载:/source/downloading.html实验证明,我总是在下载那个repo工具的时候,无法连接到相应的地址。
下载是个漫长的过程,下载完成后的大小大概有14G,所以要提前准备好这么大的空间。
下载完成后的目录大概有这些:如图二、编译源码如果你的电脑的环境经常做开发,那么很多环境应该已经搭建好了,如果没有,可以参照官网:/source/initializing.html这里要提醒的是:用apt-get或者ubuntu软件中直接安装的jdk,jre的时候,编译Android是总是编译不过,出现JDK版本不一致的情况;解决办法如下:到oracle官网中下载jdk:/technetwork/java/javase/downloads/index-jsp-138363.html建议下载这个:jdk-6u35-linux-i586.bin下载完成后,运行得到一个jdk1.6.0_35文件夹,然后,将相应的JAVA环境加到系统环境中,简单的可以这样:1.vi ~/.bashrc在.bashrc文件最后添加:1.JAVA_HOME=/home/clw712/tools/jdk1.6.0_352.CLASSPATH=$JAVA_HOME/lib/3.ANDROID_PRODUCT_OUT=/home/clw712/bin/android/out/target/product/generic4.ANDROID=/home/clw712/bin/android5.ANDROID_SWT=/home/clw712/bin/android/out/host/linux-x86/framework6.PATH=$ANDROID/out/host/linux-x86/bin:$ANDROID/prebuilt/android-arm/kernel/:$JAVA_HOME/bin:$ANDROID_PRODUCT_OUT:$PATH7.8.export PATH JAVA_HOME CLASSPATH ANDROID_PRODUCT_OUT ANDROID_SWT当然上述路径还有后面编译好了,用到的路径,是用来运行emulator的。
linaro-android-14.10-panda编译过程及问题解决.
linaro-android-14.10-panda编译过程及问题解决。
一:编译过程参考linaro的官方网站:/14.10/android/panda/,其中building form source 就是详细的从源码的编译过程。
Run the build scriptThe linaro_android_build_cmds.sh script will download the source and create the build.$ chmod +x linaro_android_build_cmds.sh$ ./linaro_android_build_cmds.sh -h #To print the script usageMost commonly used build options:$ ./linaro_android_build_cmds.sh -t #To build from the tip of the branch without overlay$ ./linaro_android_build_cmds.sh -t -o <overlay> #To build from the tip of the branch with provided overlay$ ./linaro_android_build_cmds.sh -m <pinned_manifest> -o <overlay> #To reproduce an exact build from pinned manifest$ ./linaro_android_build_cmds.sh -t -l <login-id> #Providelogin/access ID to clone and build code from linaro-private repositories二:编译过程出现的问题1:无法下载repo在终端执行以下语句之后$ ./linaro_android_build_cmds.sh -t可以发现无法下载repo,打开linaro_android_build_cmds.sh,到176行可以发现下载repo的语句curl"https:///gitweb?p=tools/repo.git;a=blob_plain; f=repo;hb=refs/heads/stable" > repo将这条语句修改为curl "https://android-/gitweb?p=tools/repo.git;a=blob_plain;f=repo;hb=refs/he ads/stable" > repo就可以正常下载repo了问题的原因是网址更换到 了。
Android编译系统(Android.mk文件详解)
Android编译系统(Android.mk⽂件详解)【Android-NDK(Native Development Kit) docs⽂档】NDK提供了⼀系列的⼯具,帮助开发者快速开发C(或C++)的动态库,并能⾃动将so和java应⽤⼀起打包成apk。
Android.mk⽂件是GNU Makefile的⼀⼩部分,它⽤来对Android程序进⾏编译。
因为所有的编译⽂件都在同⼀个 GNU MAKE 执⾏环境中进⾏执⾏,⽽Android.mk中所有的变量都是全局的。
因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
⼀个Android.mk⽂件可以编译多个模块,每个模块属下列类型之⼀:1)APK程序⼀般的Android程序,编译打包⽣成apk⽂件2)JAVA库java类库,编译打包⽣成jar⽂件3)C\C++应⽤程序可执⾏的C\C++应⽤程序4)C\C++静态库编译⽣成C\C++静态库,并打包成.a⽂件5)C\C++共享库编译⽣成共享库(动态链接库),并打包成.so⽂,有且只有共享库才能被安装/复制到您的应⽤软件(APK)包中。
可以在每⼀个Android.mk file 中定义⼀个或多个模块,你也可以在⼏个模块中使⽤同⼀个源代码⽂件。
编译系统为你处理许多细节问题。
例如,你不需要在你的 Android.mk 中列出头⽂件和依赖⽂件。
编译系统将会为你⾃动处理这些问题。
这也意味着,在升级 NDK 后,你应该得到新的toolchain/platform⽀持,⽽且不需要改变你的 Android.mk ⽂件。
注意,NDK的Anroid.mk语法同公开发布的Android平台开源代码的Anroid.mk语法很接近,然⽽编译系统实现他们的⽅式却是不同的,这是故意这样设计的,可以让程序开发⼈员重⽤外部库的源代码更容易。
在描述语法细节之前,咱们来看⼀个简单的"hello world"的例⼦,⽐如,下⾯的⽂件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是⼀个 JNI 共享库,实现返回"hello world"字符串的原⽣⽅法。
ndk 编译
ndk 编译NDK是一种能够让开发者使用C/C++等语言编写Android应用程序的工具集。
NDK被广泛应用于需要高性能和底层硬件控制的应用,例如游戏、多媒体应用等。
NDK编译是将C/C++代码转换成Android应用程序的过程。
在NDK编译过程中,我们需要进行一系列配置和设置,方能使C/C++代码能在Android应用中正确运行。
本文将介绍NDK编译的流程、配置和注意事项。
一、NDK编译流程1、准备工作为了进行NDK编译,我们需要先下载NDK工具集以及安装好Android Studio。
然后,在Android Studio中安装好C++插件,以支持C/C++代码的开发。
2、创建项目在Android Studio中新建一个项目,然后选择“native C++”作为项目类型。
这样可以自动生成一些用于编写C/C++代码的文件和目录。
3、编写代码4、配置gradle文件我们需要在项目的gradle文件中指定编译选项和依赖项。
首先,在build.gradle中添加如下代码:此时,我们需要在CMakeLists.txt文件中指定编译选项和依赖项。
例如:```cppcmake_minimum_required(VERSION 3.4.1)target_link_libraries(native-lib# Android NDK librariesandroidlog)```5、进行编译最后,在Android Studio中点击“Sync Project with Gradle Files”按钮,然后再点击“Build”按钮,即可进行NDK编译。
下面是一些NDK编译的配置和注意事项。
1、指定C++标准和编译选项如果我们的C++代码中使用了某些C++11标准的特性,那么需要在gradle文件中指定C++标准。
例如:```cppexternalNativeBuild {cmake {cppFlags "-std=c++11"}}```我们也可以指定一些编译选项,例如“-O3”代表进行优化。
【转】Android编译系统详解(三)——编译流程详解
【转】Android编译系统详解(三)——编译流程详解原⽂⽹址:本⽂原创作者: 欢迎转载,请注明出处和1.概述编译Android的第三步是使⽤mka命令进⾏编译,当然我们也可以使⽤make –j4,但是推荐使⽤mka命令。
因为mka将⾃动计算-j选项的数字,让我们不⽤纠结这个数字到底是多少(这个数字其实就是所有cpu的核⼼数)。
在编译时我们可以带上我们需要编译的⽬标,假设你想⽣成recovery,那么使⽤mka recoveryimage,如果想⽣成ota包,那么需要使⽤mka otapackage,后续会介绍所有可以使⽤的⽬标。
另外注意有⼀些⽬标只是起到修饰的作⽤,也就是说需要和其它⽬标⼀起使⽤,共有4个⽤于修饰的伪⽬标:1) showcommands 显⽰编译过程中使⽤的命令2) incrementaljavac⽤于增量编译java代码3) checkbuild⽤于检验那些需要检验的模块4) all如果使⽤all修饰编译⽬标,会编译所有模块研究Android编译系统时最头疼的可能是变量,成百个变量我们⽆法记住其含义,也不知道这些变量会是什么值,为此我专门做了⼀个编译变量的参考⽹站,你可以在该⽹站查找变量,它能告诉你变量的含义,也会给出你该变量的⽰例值,另外也详细解释了编译系统⾥每个Makefile的作⽤,这样你在看编译系统的代码时不⾄于⼀头雾⽔。
编译的核⼼⽂件是和,main.mk主要作⽤是检查编译环境是否符合要求,确定产品配置,决定产品需要使⽤的模块,并定义了许多⽬标供开发者使⽤,⽐如droid,sdk等⽬标,但是⽣成这些⽬标的规则主要在Makefile⾥定义,⽽内核的编译规则放在build/core/task/kernel.mk我们将先整体介绍main.mk的执⾏流程,然后再针对在Linux上编译默认⽬标时使⽤的关键代码进⾏分析。
Makefile主要定义了各个⽬标的⽣成规则,因此不再详细介绍它的执⾏流程,若有兴趣看每个⽬标的⽣成规则,可查看2. main.mk执⾏流程2.1 检验编译环境并建⽴产品配置1) 设置Shell变量为bash,不能使⽤其它shell2) 关闭make的suffix规则,rcs/sccs规则,并设置⼀个规则: 当某个规则失败了,就删除所有⽬标3) 检验make的版本,cygwin可使⽤任意版本make,但是linux或者mac只能使⽤3.81版本或者3.82版本4) 设置PWD,TOP,TOPDIR,BUILD_SYSTEM等变量,定义了默认⽬标变量,但是暂时并未定义默认⽬标的⽣成规则5) 包含,该makefile定义了两个⽬标help和out, help⽤于显⽰帮助,out⽤于检验编译系统是否正确6) 包含,config.mk作了很多配置,包括产品配置,包含该makefile后,会建⽴输出⽬录系列的变量,还会建⽴PRODUCT系列变量,后续介绍产品配置时,对此会有更多详细介绍7) 包含,该makefile会包含所有⼯程的CleanSpec.mk,写了CleanSpec.mk的⼯程会定义每次编译前的特殊清理步骤,cleanbuild.mk会执⾏这些清除步骤8) 检验编译环境,先检测上次编译结果,如果上次检验的版本和此次检验的版本⼀致,则不再检测,然后进⾏检测并将此次编译结果写⼊2.2 包含其它makefile及编译⽬标检测1) 如果⽬标⾥含有incrementaljavac,那么编译⽬标时将⽤incremental javac进⾏增量编译2) 设置EMMA_INSTRUMENT变量的值,emma是⽤于测试代码覆盖率的库3) 包含,该makefile定义了许多辅助函数4) 包含,该makefile定义了⾼通板⼦的⼀些辅助函数及宏5) 包含,该makefile定义了优化dex代码的⼀些宏6) 检测编译⽬标⾥是否有user,userdebug,eng,如果有则告诉⽤户放置在buildspec.mk或者使⽤lunch设置,检测TARGET_BUILD_VARIANT变量,看是否有效7) 包含, PDK主要是能提⾼现有设备升级能⼒,帮助设备制造商能更快的适配新版本的android2.3 根据TARGET_BUILD_VARIANT建⽴配置1) 如果编译⽬标⾥有sdk,win_sdk或者sdk_addon,那么设置is_sdk_build为true2) 如果定义了HAVE_SELINUX,那么编译时为build prop添加属性ro.build.selinux=13) 如果TARGET_BUILD_VARIANT是user或者userdebug,那么tags_to_install += debug 如果⽤户未定义DISABLE_DEXPREOPT为true,并且是user模式,那么将设置WITH_DEXPREOPT := true,该选项将开启apk的预优化,即将apk分成odex代码⽂件和apk资源⽂件4) 判断enable_target_debugging变量,默认是true,当build_variant是user时,则它是false。
android.bp 编译aidl原理
android.bp 编译aidl原理一、引言Android应用程序开发中,Android Interface Definition Language(aidl)是用于定义Android中的进程间通信(IPC)的重要工具。
它主要用于实现跨进程的接口调用,为Android应用程序提供了强大的通信机制。
本文将详细介绍android.bp编译aidl的原理。
二、aidl概述aidl是Android平台上的一个重要组件,它允许不同的应用或服务之间进行跨进程通信。
aidl定义了接口和实现,并生成相应的客户端和服务器代码,以实现进程间的通信。
三、编译aidl的过程1. 编写aidl文件:开发者使用文本编辑器或集成开发环境(IDE)编写aidl文件,该文件描述了需要跨进程调用的接口和实现。
aidl文件使用特殊的XML格式编写,包含了接口名、方法名、参数等信息。
2. 编译aidl:开发者使用构建系统(如Gradle)编译aidl文件。
在编译过程中,aidl工具将解析aidl文件,生成相应的Java接口和实现类。
这些生成的代码将被添加到相应的包中,并在构建过程中被包含到最终的APK文件中。
3. AIDL文件的位置:生成的Java代码通常被放置在`gen`目录下,开发者可以通过在代码中添加`import`语句来使用这些生成的代码。
四、原理分析android.bp编译aidl的原理主要基于以下几个步骤:1. 解析aidl文件:aidl工具首先解析aidl文件,生成相应的Java接口和实现类。
这些类包含了跨进程调用的接口和实现方法。
2. 生成Java代码:生成的Java代码包含了跨进程调用的接口和实现方法,以及必要的序列化和反序列化代码。
这些代码将被添加到相应的包中,并在构建过程中被包含到最终的APK文件中。
3. 添加到构建过程中:在构建过程中,生成的Java代码将被添加到相应的包中,并在编译过程中被编译为字节码。
这些字节码将被打包到最终的APK文件中,供应用程序使用。
全志A10 4.0.4-系统编译讲解
Android A10(4.0.3系统编译详解概述android系统编译可分为两部分:一部分是linux内核编译(lichee;另一部分是android源码编译(android4.0.3;全文中主要是说明从搭建编译环境,安装编译依赖开发工具,编译过程中厂家错误,注意事项等。
注意事项一. 本文档所描述开发,编译系统环境为:ubuntu--‐10.04.4--‐server--‐amd64.iso;二. 在整个开发过程中请勿切换为root权限后操作,在需要使用root权限时请以sudo方式执行root权限;编译环境一. 编译系统环境 : ubuntu--‐10.04.4--‐server--‐amd64.iso ,目前该版本系统是对编译android4.0.3支持最好的,最稳定的;编译android4.0以上版本,需要40G以上的空间,内存分配大于2G;二. 安装openssh--‐server提供便捷操作说明:当使用虚拟机开发时,直接在vmware或者其他虚拟机操作异常麻烦,所以建议通过服务器远程操作工具“ssh”来进行操作;进入虚拟机操作界面,执行以下命令安装ssh服务端并开启服务:sudo a pt--‐get i nstall o penssh--‐server三. 安装编译依赖库:1.安装sun--‐java6--‐jdksudo a pt--‐get i nstall s un--‐java6--‐jdk注意:如果提示无法找到对应的sun--‐java6--‐jdk软件包,这是因为该版本的ubuntu系统去掉了sun--‐java6--‐jdk的源;请安装以下方式添加apt源:首先到 /etc/apt/sources.list ,在该文件最后一行添加“deb/ubuntu/ h ardy m ultiverse”然后执行 sudo a pt--‐get u pdate再执行 sudo a pt--‐get i nstall s un--‐java6--‐jdk2.安装其他编译依赖库首先根据命令:uname –ar ,查看系统版本是32位,还是64位;如果有x86_64或者arm64字样那么就是64位,其他就是32位;目前我们所安装的版本默认位32位;ubuntu64://64位系统执行以下操做sudo apt--‐get install git--‐core gnupg flex bison gperf build--‐essential zip curl zlib1g--‐dev gcc--‐multilib g++--‐multiliblibc6--‐dev--‐i386 lib32ncurses5--‐dev ia32--‐libs x11proto--‐core--‐devlibx11--‐dev l ib32readline5--‐dev l ib32z--‐dev编译源码注意事项注意:请用户在首次将工程下载到本地进行编译时请从git获取未包含任何编译后文件的代码,虽然每次通过make clean命令能够清楚编译生成的中间文件,但是该makefile仍然存在不能完全清除中间文件的情况;我自己就因为代码是拷贝别人电脑上的而导致屡次编译失败,无法分析错误原因的情况,在android源码编译中该情况更应该得到重视;中间文件未清楚会导致在编译时出现各种未知的错误提示;源码结构说说明:source tree, 必须严格按照这个目录结构存放.缺省是 ~/workspace/exdroid|--‐--‐ a ndroid4.0.3 --‐--‐--‐android源码|--‐--‐ l ichee --‐--‐--‐linux内核| |--‐--‐ b uildroot| |--‐--‐ b uild.sh| |--‐--‐ l inux--‐3.0| `--‐--‐ o ut --‐--‐--‐生成镜像文件的目录,编译成功就会生成此目录说明:在存放文件时,android4.0.3源码,lichee必须在同级目录,因为在android源码中通过相对路径的方式调用内核编译的部分头文件,镜像文件;例如:内核编译1.进入lichee2.进入 lichee/linux--‐3.0目录2.1执行 make ARCH=ARM menuconfig 配置默认为arm参数,如果不执行该步骤,可能在编译过程中出现很多错误;执行命令后出现如下界面:选择exit,提示如图:选择保存当前配置后退出;2.如果是首次编译,先执行 make c lean 清除之前(否则不需要重新编译时不需要该操作3.回到上一目录cd ..再执行命令:./build.sh --‐p s un4i_crane –k 3.0进行编译,如图:3.编译顺利的话,您应该看到生成lichee/out,目录里面有生成的内容,其中bImage就是生成的内核镜像,如图:4.常见错误及解决方案3.1 错误一解决方法:到lichee/linux--‐2.6.36/modules/wifi/usi--‐bcm4329/v4.218.248.15/open--‐src /src/dhd/linux1.删除 dhd--‐cdc--‐sdmmc--‐gpl--‐2.6.36--‐android目录2.进入 lichee/linux--‐2.6.36目录,先执行 make c lean 清除之前3.再执行命令:./build.sh --‐p s un4i_crane进行编译Android4.0.3源码编译1.首先从git上下载源码,这样能够得到一份未编译过的,干净的代码库;2.执行 cd a ndroid4.0.3进入该目录;3.执行脚本 source b uild/envsetup.sh4.Lunch5.选择 7 6. extract--‐bsp()6. 7. Make (该位置建议使用单线程方式编译,make -j4/8 多线程时偶尔报错)编译大概 3 小时 30 分钟后可编译完成最后在根目录中生产 out 目录,如图 8.编译 android4.0.3 源码声称的文件在 out/target/product/crane--‐evb/ 目录下面会生成 boot.img, recovery.img, system.img 3 个包。
androidmanifest 编译
androidmanifest 编译在Android开发中,AndroidManifest.xml 文件是每个Android应用程序的必要部分。
它位于应用的根目录下,并包含了关于应用程序的基本信息和配置。
当你编译一个Android项目时,系统会自动读取这个文件并根据其中的信息来配置和优化应用程序。
以下是关于如何编译包含AndroidManifest.xml 文件的Android项目的基本步骤:1. 编写代码:首先,你需要编写你的应用程序的代码。
这通常包括Java、Kotlin或混淆的源代码文件。
2. 配置AndroidManifest.xml:打开AndroidManifest.xml 文件,并进行必要的配置。
这包括设置应用程序的名称、版本、权限、活动、服务、广播接收器和提供者等。
3. 构建项目:使用IDE(如Android Studio)或命令行工具来编译你的项目。
如果你使用的是Android Studio,你可以点击"Build" 菜单中的"Build Bundle(s) / APK(s)" 或简单地点击"Build Project" 按钮来编译项目。
如果你使用的是命令行工具,你可以在项目的根目录下运行 ./gradlew assembleRelease(对于Gradle 项目)来编译项目。
4. 生成APK:编译成功后,你会得到一个或多个APK文件,这些文件是可以在Android设备上安装和运行的应用程序包。
5. 测试和调试:在设备或模拟器上安装并运行生成的APK,进行必要的测试和调试。
6. 发布:如果你完成了应用程序的开发,并准备将其发布到Google Play商店或其他平台,你需要遵循相应的发布流程。
记住,AndroidManifest.xml 文件是应用程序的核心配置文件,它定义了应用程序的基本属性和行为。
确保你正确地配置了这个文件,以满足你的应用程序的需求。
fyne 编译android原理
fyne 编译android原理Fyne 编译 Android 原理介绍Fyne 是一个用于创建跨平台用户界面的 Go 语言框架。
它支持在多个操作系统和设备上构建应用程序,其中包括 Android。
本文将详细介绍 Fyne 编译 Android 的原理。
准备工作在开始编译 Android 应用之前,需要先进行一些准备工作:1.安装 Go 编程语言,并设置好相应的环境变量。
2.安装 Android Studio,并确保已准备好 Android 开发环境。
3.安装 Java JDK,并设置好相应的环境变量。
创建 Fyne 项目首先,创建一个新的 Fyne 项目。
可以使用以下命令:$ go get /fyne/v2/cmd/fyne$ fyne init projectname这将创建一个名为projectname的新目录,并在其中初始化一个 Fyne 项目。
配置 Android 编译环境下一步是配置 Android 编译环境,使得我们可以在 Android 设备上运行应用程序。
在项目目录中,创建一个名为 `` 的文件,并添加以下内容:#!/bin/bash# Set necessary environment variablesexport GOPATH=$(go env GOPATH)export ANDROID_HOME=/path/to/android/sdkexport PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/plat form-tools# Build and run the Fyne app on Androidcd $GOPATH/src/projectnamefyne package -os android -appID -icongo buildfyne package -os android -appID -icon请确保将/path/to/android/sdk替换为正确的 Android SDK 路径。
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查看⽤法。
curl android编译
Curl是一个非常流行的开源网络传输库,它支持多种协议,如HTTP、HTTPS、FTP等。
在Android开发中,使用Curl库可以方便地进行网络数据的传输和处理。
本文将介绍如何在Android上编译和集成Curl库,以及一些常见问题的解决方法。
首先,我们需要下载Curl的源代码。
可以从Curl的官方网站上获取最新的源代码压缩包,也可以通过Git克隆Curl的仓库。
获取源代码后,解压缩到一个合适的目录。
接下来,我们需要配置Android开发环境。
确保已经安装了Android Studio和NDK,并设置好相关的环境变量。
在Android Studio中创建一个新的Android项目,或者打开一个已有的项目。
然后,使用Android Studio的NDK支持功能,将Curl的源代码目录添加到项目中。
在项目的build.gradle 文件中,添加以下代码:```groovyandroid {...externalNativeBuild {ndkBuild {path "path/to/Curl/Android.mk"}}...}```接下来,我们需要创建一个Android.mk文件,用于编译Curl库。
Android.mk是一个Makefile 脚本,定义了编译规则和源文件列表。
以下是一个简单的Android.mk文件示例:```makefileLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := libcurlLOCAL_SRC_FILES := \path/to/Curl/lib/curl/src/*.cLOCAL_LDLIBS := -lloginclude $(BUILD_SHARED_LIBRARY)```在上面的示例中,LOCAL_MODULE定义了生成的库的名称,LOCAL_SRC_FILES定义了所有需要编译的源文件路径。
linphone-android编译过程
编译linphone-android前阵子公司要求从linphone的官网上把android客户端的源码下载下来,编译好。
但是下载好后按照README里面的步骤来做有一些小问题,在网上搜了一下,没有专门介绍怎么编译的帖子,经过研究,全部解决了。
所以记录下来帮助同样是刚刚上手的你。
(问题比较简单,希望高手不要见笑)。
PS:我是在CentOS6下编译的。
Ubuntu下编译的步骤相似,可以参考,而在windows下需要借助Cygwin交叉编译。
一、首先要从github上把源码下载下来,这需要安装git软件,这一步就不多做解释了,你只要百度一下git就可以了。
(注意下载好后要配置git下载的路径,这个只要在你想存放的地方右击鼠标init一下就行了)二、编译前我们要先下载几个依赖库,这其中有autoconf(yum install autoconf), automake (yum install automake),aclocal(yum install aclocal),libtoolize(yum install libtoolize),编译过程中还需要android-ndk-r5b以上版本的ndk支持,我用的是最新的r6b版本。
三、下载好后的源码包,不要做任何修改,按照README里面所说的先运行./prepare_sources.sh,但是你在shell里运行后会发现提示你没有这个文件,不要急,这是因为下载下来的源码包里的文件都是DOS格式的,在Linux下都无法识别,所以导致了路径问题,这时候需要你安装一个dos2unix的软件,在终端里输入yum install dos2unix,安装好后,打开终端,定位到你下载好的linphone-android文件夹根目录,输入find -type f | xargs dos2unix --dos2unix --safe或者find -type f | xargs dos2unix -o,这个两个命令都可以把文件夹里所有的文件转为unix格式。
Ubuntu 10.04下编译Android源码全过程
Ubuntu 10.04下编译Android源码全过程一、获取Android源代码Git是Linux Torvalds(Linux之父)为了帮助管理Linux内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。
在集中式版本控制系统中只有一个仓库(Repository),许多个工作目录(Working Copy),而在Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNU Arch、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 /repo >~/bin/repo这句命令会下载repo脚本文件到当前主目录的/bin目录下,并保存在文件repo中。
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文件。
编译android framwork代码
编译android framwork代码编译AndroidFramework代码是Android开发者必备技能之一。
因为AndroidFramework是整个Android系统的核心,包含了大量的类库、服务、API等,所以掌握其编译方法是非常必要的。
下面是编译Android Framework代码的具体步骤:1. 准备环境要编译Android Framework代码,首先需要安装好Java JDK、Android SDK和NDK,并配置好环境变量。
同时,还需要安装好相关的编译工具,如make、gcc、g++等。
2. 获取源码要编译Android Framework代码,必须先获取其源码。
Android Framework的源码可以从官方网站或GitHub上下载,具体方法可以参考官方文档。
3. 配置编译环境在获取源码后,需要配置编译环境。
具体方法如下:1)进入源码根目录2)执行以下命令:source build/envsetup.shlunch3)选择要编译的目标设备,比如选择“aosp_arm-eng”4)执行以下命令:make -j4其中“-j4”表示使用4个线程进行编译,可以根据自己的电脑配置进行修改。
4. 等待编译完成编译时间较长,一般需要数小时甚至一整天才能完成。
编译过程中会生成大量的日志和输出信息,可以通过控制台查看。
5. 执行编译后的代码编译完成后,会在源码目录下的“out/target/product/设备名/”目录下生成编译后的代码。
可以通过adb命令将其安装到设备上进行测试。
以上就是编译Android Framework代码的具体步骤。
通过掌握这些基本知识,可以更好地进行Android Framework开发。
Android系统开发编译及系统移植
Android系统开发编译环境配置主机系统:Ubuntu9.04(1)安装如下软件包sudo apt-get install git-coresudo apt-get install gnupgsudo apt-get install sun-java5-jdksudo 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 build-essentialsudo apt-get install zipsudo apt-get install curlsudo apt-get install libncurses5-devsudo apt-get install zlib1g-devandroid编译对java的需求只支持jdk5.0低版本,jdk5.0 update 12版本和java 6不支持。
(2)下载repo工具curl /repo >/bin/repochmod a+x /bin/repo(3)创建源代码下载目录:mkdir /work/android-froyo-r2(4)用repo工具初始化一个版本(以android2.2r2为例)cd /work/android-froyo-r2repo init -u git:///platform/manifest.git -b froyo初始化过程中会显示相关的版本的TAG信息,同时会提示你输入用户名和邮箱地址,以上面的方式初始化的是android2.2 froyo的最新版本,android2.2本身也会有很多个版本,这可以从TAG信息中看出来,当前froyo的所有版本如下:* [new tag] android-2.2.1_r1 -> android-2.2.1_r1* [new tag] android-2.2_r1 -> android-2.2_r1* [new tag] android-2.2_r1.1 -> android-2.2_r1.1* [new tag] android-2.2_r1.2 -> android-2.2_r1.2* [new tag] android-2.2_r1.3 -> android-2.2_r1.3* [new tag] android-cts-2.2_r1 -> android-cts-2.2_r1* [new tag] android-cts-2.2_r2 -> android-cts-2.2_r2* [new tag] android-cts-2.2_r3 -> android-cts-2.2_r3这样每次下载的都是最新的版本,当然我们也可以根据TAG信息下载某一特定的版本如下:repo init -u git:///platform/manifest.git -b android-cts-2.2_r3(5)下载代码repo syncfroyo版本的代码大小超过2G,漫长的下载过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文使用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:调试测试机由此可见,除了eng和user外,另外两个一般不能交给最终用户的,记得m8出来的时候,先放出了一部分eng工程机,然后出来了user机之后,可以用工程机换。
好了,我们来分析下lunch命令干了什么??由上面分析可知,lunch命令可以带参数和不带参数,最终导出一些重要的环境变量,从而影响编译系统的编译结果。
导出的变量如下(以实际运行情况为例)?执行完上述两个步骤,就该执行:make命令了,下篇来分析。
通过上篇文章,我们分析了编译android时source build/envsetup.sh和lunch命令,在执行完上述两个命令后,我们就可以进行编译android了。
1. make执行make命令的结果就是去执行当前目录下的Makefile文件,我们来看下它的内容:?呵呵,看到上面的内容,我们都会笑,这是我见过最简单的Makefile了,我们再看下build/ core/main.mk在main.mk里,定义了变量TOPDIR,TOP为当前目录,BUILD_SYSTEM为build/core目录。
在49行,包含了build/core/config.mk文件。
后面的代码是check环境变量,所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:droid,当我们在TOP目录下,敲M ake实际上就等同于我们执行make droid。
当Make include所有的文件,完成对所有make我文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。
这儿不是我们的重点,不再多说。
2. build/core/config.mk该文件被main.mk包含。
定义了以下环境变量:?上述命令变量其实是对应的mk文件名,所有的Android.mk文件里基本上都包含上述命令变量,如:CLEAR_VARS:用来清除之前定义的环境变量BUILD_SHARED_LIBRARY:用来指定编译动态库过程?112行又包含了另外一个重要的mk文件envsetup.mk,我们来看一下。
3. envsetup.mk25 ifeq ($(TARGET_PRODUCT),) #判断TARGET_PRODUCT是否为空,26 ifeq ($(TARGET_SIMULATOR),true)27 TARGET_PRODUCT := sim28else29 TARGET_PRODUCT := generic30 endif31 endif第25行,判断TARGET_PRODUCT是否为空,根据上一节分析可知,TARGET_PRODUCT=fs1 0034 # the variant -- the set of files that are included for a build35 ifeq ($(strip $(TARGET_BUILD_VARIANT)),)36 TARGET_BUILD_VARIANT := eng37 endif3839 # Read the product specs so we an get TARGET_DEVICE and other40 # variables that we need in order to locate the output files.41 include $(BUILD_SYSTEM)/product_config.mk在41行又包含了product_config.mk文件,等会我们再分析它,先看下面的148 # ---------------------------------------------------------------149 # figure out the output directories150151 ifeq (,$(strip $(OUT_DIR)))152 OUT_DIR := $(TOPDIR)out153 endif154155 DEBUG_OUT_DIR := $(OUT_DIR)/debug156157 # Move the host or target under the debug/ directory158 # if necessary.159 TARGET_OUT_ROOT_release := $(OUT_DIR)/target160 TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target161 TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))162...184 PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)187188 HOST_OUT_EXECUTABLES:= $(HOST_OUT)/bin189 HOST_OUT_SHARED_LIBRARIES:= $(HOST_OUT)/lib190 HOST_OUT_JAVA_LIBRARIES:= $(HOST_OUT)/framework191 HOST_OUT_SDK_ADDON := $(HOST_OUT)/sdk_addon...200 TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj201 TARGET_OUT_HEADERS:= $(TARGET_OUT_INTERMEDIATES)/include202 TARGET_OUT_INTERMEDIATE_LIBRARIES := $(TARGET_OUT_INTERMEDIATES)/lib 203 TARGET_OUT_COMMON_INTERMEDIATES := $(TARGET_COMMON_OUT_ROOT)/obj204205 TARGET_OUT := $(PRODUCT_OUT)/system206 TARGET_OUT_EXECUTABLES:= $(TARGET_OUT)/bin207 TARGET_OUT_OPTIONAL_EXECUTABLES:= $(TARGET_OUT)/xbin208 TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib209 TARGET_OUT_JAVA_LIBRARIES:= $(TARGET_OUT)/framework210 TARGET_OUT_APPS:= $(TARGET_OUT)/app211 TARGET_OUT_KEYLAYOUT := $(TARGET_OUT)/usr/keylayout212 TARGET_OUT_KEYCHARS := $(TARGET_OUT)/usr/keychars213 TARGET_OUT_ETC := $(TARGET_OUT)/etc214 TARGET_OUT_STATIC_LIBRARIES:= $(TARGET_OUT_INTERMEDIATES)/lib215 TARGET_OUT_NOTICE_FILES:=$(TARGET_OUT_INTERMEDIATES)/NOTICE_FILES 216217 TARGET_OUT_DATA := $(PRODUCT_OUT)/data218 TARGET_OUT_DATA_EXECUTABLES:= $(TARGET_OUT_EXECUTABLES)219 TARGET_OUT_DATA_SHARED_LIBRARIES:= $(TARGET_OUT_SHARED_LIBRARIES) 220 TARGET_OUT_DATA_JAVA_LIBRARIES:= $(TARGET_OUT_JAVA_LIBRARIES)221 TARGET_OUT_DATA_APPS:= $(TARGET_OUT_DATA)/app222 TARGET_OUT_DATA_KEYLAYOUT := $(TARGET_OUT_KEYLAYOUT)223 TARGET_OUT_DATA_KEYCHARS := $(TARGET_OUT_KEYCHARS)224 TARGET_OUT_DATA_ETC := $(TARGET_OUT_ETC)225 TARGET_OUT_DATA_STATIC_LIBRARIES:= $(TARGET_OUT_STATIC_LIBRARIES)226227 TARGET_OUT_UNSTRIPPED := $(PRODUCT_OUT)/symbols228 TARGET_OUT_EXECUTABLES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system/bin 229 TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/system /lib230 TARGET_ROOT_OUT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)231 TARGET_ROOT_OUT_SBIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/sbin232 TARGET_ROOT_OUT_BIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/bin233234 TARGET_ROOT_OUT := $(PRODUCT_OUT)/root235 TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin236 TARGET_ROOT_OUT_SBIN := $(TARGET_ROOT_OUT)/sbin237 TARGET_ROOT_OUT_ETC := $(TARGET_ROOT_OUT)/etc238 TARGET_ROOT_OUT_USR := $(TARGET_ROOT_OUT)/usr239240 TARGET_RECOVERY_OUT := $(PRODUCT_OUT)/recovery241 TARGET_RECOVERY_ROOT_OUT := $(TARGET_RECOVERY_OUT)/root242243 TARGET_SYSLOADER_OUT := $(PRODUCT_OUT)/sysloader244 TARGET_SYSLOADER_ROOT_OUT := $(TARGET_SYSLOADER_OUT)/root245 TARGET_SYSLOADER_SYSTEM_OUT := $(TARGET_SYSLOADER_OUT)/root/system246247 TARGET_INSTALLER_OUT := $(PRODUCT_OUT)/installer248 TARGET_INSTALLER_DATA_OUT := $(TARGET_INSTALLER_OUT)/data249 TARGET_INSTALLER_ROOT_OUT := $(TARGET_INSTALLER_OUT)/root250 TARGET_INSTALLER_SYSTEM_OUT := $(TARGET_INSTALLER_OUT)/root/system上面的代码是指定了目标输出代码的位置和主机输出代码的位置,重要的几个如下:PRODUCT_OUT = 这个的结果要根据product_config.mk文件内容来决定,其实是out/target/pr oduct/fs100/TARGET_OUT = $(PRODUCT_OUT)/systemTARGET_OUT_EXECUTABLES = $(PRODUCT_OUT)/system/binTARGET_OUT_SHARED_LIBRARIES = $(PRODUCT_OUT)/system/libTARGET_OUT_JAVA_LIBRARIES = $(PRODUCT_OUT)/system/frameworkTARGET_OUT_APPS = $(PRODUCT_OUT)/system/appTARGET_OUT_ETC = $(PRODUCT_OUT)/system/etcTARGET_OUT_STATIC_LIBRARIES = $(PRODUCT_OUT)/obj/libTARGET_OUT_DATA = $(PRODUCT_OUT)/dataTARGET_OUT_DATA_APPS = $(PRODUCT_OUT)/data/appTARGET_ROOT_OUT = $(PRODUCT_OUT)/rootTARGET_ROOT_OUT_BIN = $(PRODUCT_OUT)/binTARGET_ROOT_OUT_SBIN = $(PRODUCT_OUT)/system/sbinTARGET_ROOT_OUT_ETC = $(PRODUCT_OUT)/system/etcTARGET_ROOT_OUT_USR = $(PRODUCT_OUT)/system/usr总结下:envsetup.mk文件主要包含了product_config.mk文件,然后指定了编译时要输出的所有文件的OUT目录。