android4.1编译
- 格式:docx
- 大小:12.58 KB
- 文档页数:7
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编译命令⼀、引⾔先看下⾯⼏条指令,相信编译过Android源码的⼈都再熟悉不过的。
source setenv.shlunchmake -j12记得最初刚接触Android时,同事告诉我⽤上⾯的指令就可以编译Android源码,指令虽短但过⼏天就记不全或者忘记顺序,每次编译时还需要看看⾃⼰的云笔记,冰冷的指令总是难以让我记忆。
后来我决定认真研究下这个指令的含义。
知其然还需知其所以然,这样能更深层次的理解并记忆,才能与⾃⾝的知识体系建⽴强连接,或许还有意外收获,果然如此,接下来跟⼤家分享⼀下在研究上述⼏条指令含义的过程中,深⼊了解到的Android Build(编译)系统。
⼆、编译命令准备好编译环境后,编译Android源码的第⼀步是source build/envsetup.sh,其中source命令就是⽤于运⾏shell脚本命令,功能等价于”.”,因此该命令也等价于. build/envsetup.sh。
在⽂件envsetup.sh声明了当前会话终端可⽤的命令,这⾥需要注意的是当前会话终端,也就意味着每次新打开⼀个终端都必须再⼀次执⾏这些指令。
起初并不理解为什么新开的终端不能直接执⾏make指令,到这⾥总算明⽩了。
接下来,解释⼀下本⽂开头的引⽤的命令:source setenv.sh //初始化编译环境,包括后⾯的lunch和make指令lunch //指定此次编译的⽬标设备以及编译类型make -j12 //开始编译,默认为编译整个系统,其中-j12代表的是编译的job数量为12。
所有的编译命令都在envsetup.sh⽂件能找到相对应的function,⽐如上述的命令lunch,make,在⽂件⼀定能找到function lunch(){...}function make(){...}source envsetup.sh,需要cd到setenv.sh⽂件所在路径执⾏,路径可能在build/envsetup.sh,或者integrate/envsetup.sh,再或者不排除有些⼚商会封装⾃⼰的.sh脚本,但核⼼思路是⼀致的。
Ubuntu 12 64位编译Android 4.0.1源码问题和解决办法系统满足的条件:在VMware下,最好给客户虚拟机1.5G内存,30G以上的硬盘。
实现应该要安装的软件:For Gingerbread (2.3.x) and newer versions, including the master branch, a 64-bit environment is required. Older versions can be compiled on 32-bit systems.Note: It is also possible to build Android in a virtual machine. If you are running Linux in a virtual machine, you will need at least 16GB of RAM/swap and 30GB or more of disk space in order to build the Android tree.Detailed instructions for Ubuntu and MacOS follow. In general you will need:You will need a 64-bit version of Ubuntu.Ubuntu 10.04 is recommended. Building using a newer version of Ubuntu is currently only experimentally supported and is not guaranteed to work on branches other than master.$ sudo apt-get install git-core gnupg flex bison gperf build-essential \zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \python-markdown libxml2-utils xsltproc zlib1g-dev:i386$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so源码编译过程中可能出现的问题:1、make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] Error 1make: ***解决方法:gedit frameworks/base/libs/utils/Android.mk把LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)修改为:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive2、make: ***[out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes -with-local.dex] Killed解决方法:把虚拟机ubuntu系统分配内存1G,有条件最好对于1G3、<command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1解决方法:修改build/core/combo/HOST_linux-x86.mk 61行,将HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0修改成HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0昨天下载、编译了android-4.0.3,遇到的问题贴出来,共享一下:环境要求改变。
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"字符串的原⽣⽅法。
【转】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 SDK编译——如何将自己源代码加入android.jar 在Android源码编译成功的基础上重新编译带自己API的android.jar需要进行以下几步操作。
1 添加自己源代码,在Android源码frameworks/base目录下新建一个文件夹保存代码,如tv,以包的形式命名添加的文件所在的路径,如/tv/java/android/tv,添加的java文件开头定义的包即是编译成功的class文件所在的包。
2 修改makefile文件2.1 修改build/core/pathmap.mk文件在FRAMEWORKS_ BASE_ SUBDIRS变量后添加tv\,代码如下(makefile 文件中的语句以Tab键空格开头)FRAMEWORKS_BASE_SUBDIRS := \$(addsuffix /java, \core \graphics \location \media \opengl \sax \telephony \wifi \vpn \keystore \tv \)2.2修改frameworks/base/Android.mk 文件在packages_to_ document变量后添加自己源代码的包名称,如android/tv,结果如下(makefile文件中的语句以Tab键空格开头)packages_to_document := \android \javax/microedition/khronos android/tv3 在ubuntu命令行终端使用如下命令进行编译:make cleanmake update-apimake PRODUCT-sdk-sdk最后一行也可以用如下两个命令代替:make –j4make sdk4 编译结果4.1 android.jar文件所在的目录为/out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar 并在/out/target/common/obj/JA V A_LIBRARIES/android_stubs_current_interme diates/src目录下重新以package形式组织所有生成到android.jar中的源代码。
android 源码编译原理(一)Android源码编译本文将以浅入深的方式解释Android源码编译的相关原理。
为什么需要编译Android源码?在Android应用开发中,我们通常使用Android SDK提供的API来开发应用程序。
然而,有时候我们需要对Android系统进行修改或扩展,这就需要我们直接修改Android源代码。
为了让这些修改生效,我们需要将修改后的源码编译成可执行的Android系统镜像,然后将该镜像刷入设备。
编译环境的准备在编译Android源码之前,我们需要准备编译环境。
首先,确保我们的电脑上已经安装了必要的开发工具,如JDK、Python、Git等。
然后,下载Android源码,并进行必要的配置。
要编译Android源码,我们需要使用Linux环境。
如果我们使用的是Windows操作系统,可以通过安装虚拟机或使用Docker等方式创建一个Linux环境。
编译Android源码的基本步骤编译Android源码的基本步骤如下:1.初始化编译环境:在Android源码根目录下执行source build/envsetup.sh命令,初始化编译环境。
2.选择编译目标:执行lunch命令,选择我们要编译的目标设备和版本号。
3.开始编译:执行make命令,开始编译Android源码。
编译过程通常需要较长的时间,这取决于电脑性能和代码的规模。
4.生成镜像:编译完成后,我们可以在out/target/product目录下找到生成的Android系统镜像文件。
深入了解Android源码编译编译Android源码并不仅仅是简单执行几个命令那么简单,背后涉及到了诸多复杂的过程和原理。
下面简单介绍一些主要的原理:1. Android.mk文件在进行Android源码编译时,系统会通过读取每个模块下的Android.mk文件来确定编译的方式和依赖关系。
Android.mk文件是GNU make的一个Makefile脚本,用于描述模块的编译规则、依赖关系和生成产物等信息。
android源码编译问题,解决Android源码编译错误的问题如下所⽰:Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dexFAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rspOut of memory error (version 1.2-a26 'Carnac' (291201 fcd657165d2fd6dcf1bf4c3002c9c8f75383e815 by android-jack-team@)).GC overhead limit exceeded.Try increasing heap size with java option '-Xmx'.Warning: This may have produced partial or corrupted output.ninja: build stopped: subcommand failed.在⽂件/prebuilts/sdk/tools/jack-admin中修正-Xmx参数。
1、修改变量JACK_SERVER_VM_ARGUMENTS,添加参数 -Xmx2048MJACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation -mx2048M}"2、进⼀步修正重启参数(该步骤可以省略)找到jack-admin中的start-server语句,直接在⾥⾯增加:start-server)isServerRunningRUNNING=$?if [ "$RUNNING" = 0 ]; thenecho "Server is already running"elseecho "before to start-server,JACK_SERVER_VM_ARGUMENTS=" $JACK_SERVER_VM_ARGUMENTSJACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS-Xmx2048M -cp $LAUNCHER_JAR $LAUNCHER_NAME"echo "Launching Jack server" $JACK_SERVER_COMMAND(补充知识:编译android 7.0 出现Try increasing heap size with java option '-Xmx'错误解决⽅案出现这个错误是由于电脑内存不⾜,在命令⾏分别执⾏以下三条语句,然后继续编译export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"./prebuilts/sdk/tools/jack-admin kill-server./prebuilts/sdk/tools/jack-admin start-server以上这篇解决Android 源码编译错误的问题就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
Android 在ubuntu10.04 编译环境的配置一.软件的安装1.Linux系统是安装在Vmware中,所以必须下载Vmware,这里采用的版本为Vmware.Workstation.v7.1.0.Lite.rar下载地址:(暂时没有找到)安装完vmware后,可以让它自动检测新版本并升级。
2.下载Ubuntu,这里采用的版本是10.04,文件名为ubuntu-10.04-desktop-i386.iso下载地址为:/lucid/。
3.下载完成后,安装ubuntu10.04,由于采用vmware安装,故只需简单设置即可,其他采用默认设置安装,需要注意的是vmware的空间应该分配大一些(最好是大于60GB),不然,以后要扩展空间时比较麻烦。
4.Ubuntu的默认安装的用户不是超级用户root,因此要使用超级用户root,必须通过下面的命令来开启:(1).使用默认用户进入ubuntu的界面,打开shell,(2).在shell中输入命令:sudo passwd root ,然后按确认键;(3).按下确认键后,系统要求你设置root用户的密码,连续输入2次后,root用户的密码设置成功;(4).重新启动系统即可使用超级用户登陆.5.使用超级用户登陆后,开始配置Android的编译环境:(1).由于ubuntu的软件中心提供的是java6,而编译Android需要的是java5,为了保证采用命令安装时系统能够自动找到需要的java5,我们必须修改apt里面的sources.list:root@ubuntu:/# vim /etc/apt/sources.list在该文件末添加如下网址:# update the sun-java5-jdk from as follow:deb /ubuntu/ jaunty multiversedeb /ubuntu/ jaunty-updates multiverse(2).采用命令安装所需软件:root@ubuntu:/# sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-devzlib1g-dev(由于apt-get能够自动区分命令,故采用一条命令即可.此命令安装的软件有:git-core ;gnupg ;sun-java5-jdk ;flex ;bison;gperf ;libsdl1.2-dev ;libesd0-dev ;libwxgtk2.6-dev ;build-essential ;zip ;curl ;libncurses5-dev ;zlib1g-dev;当安装到sun-java5-jdk时,需要手动点击协议。
2.Q:frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]make: ***[out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBa se.o] Error 1解决方法:$ gedit frameworks/base/libs/utils/Android.mk修改以下语句LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)为LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive3.Q:arm-eabi-gcc: error trying to exec 'cc1': execvp: No such file or directorymake: *** [out/target/product/generic/obj/lib/crtbegin_dynamic.o] Error 1如果之前的依赖包都已经安装成功的话,此处应该是交叉编译工具权限的问题。
这个问题只要在文章开头lunch时执行了赋予权限命令,就应该不会遇到了。
4.Q:<command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]<built-in>:0:0: note: this is the location of the previous definition cc1plus: all warnings being treated as errorsmake: ***[out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1此处编译错误是由于ubuntu 11.10采用了GCC4.6.1导致的。
Android4.1.4编译1、下载源码:我是在ics版本的基础上通过repo sync更新,发现有了android 4_1_r1的分支,等待更新完,repo branch 切换分支,然后. Build/envsetup.she 然后lunch 1 选择full-eng 最后make ,过一会报错。
提示:build/core/product_config.mk:193: *** _nic.PRODUCTS.[[build/target/product/vbox_x86.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了大半天终于在android的bug单中找到了这条bug,解答是源码不全。
愁了半天,repo sync 都是最新的,愁了半天,最后再ics的repo中重新下了个android4.1.4的分支。
repo init -u https:///platform/manifest -b android-4.1.1_r4repo sync下载3个小时,终于下载完成,本来下载源码需要很长时间5~10个小时,由于再ics的基础上下载,只需要把patch下载就行了(repo会自动完成)。
兴奋啊,赶紧.Build/envsetup.shlunch 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 cleanmake -j8过了几分钟提示错误:host StaticLib: libhost (out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a)ERROR:prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linu x-ar only run on 64-bit linuxmake: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a] 错误 1host C: emulator-target-i386 <= external/qemu/cpus.chost C: emulator-target-i386 <= external/qemu/arch_init.chost C: emulator-target-i386 <= external/qemu/os-posix.chost C: emulator-target-i386 <= external/qemu/oslib-posix.chost C: emulator64-arm <= external/qemu/audio/audio.chost C: emulator64-arm <= external/qemu/disas.cERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-gcc only run on 64-bit linuxmake: *** [out/host/linux-x86/obj/EXECUTABLES/emulator64-arm_intermediates/disas.o] Error 1make: *** Waiting for unfinished jobs....ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-gcc only run on 64-bit linuxmake: *** [out/host/linux-x86/obj/EXECUTABLES/emulator64-arm_intermediates/audio/audio.o] Error 1又陷入郁闷,google baidu了好半天,都没找到解决方案,不过找到了提示,就是谷歌推荐使用64位的ubuntu 10.04 来编译,很多配置都是基于64来的,所以32位系统编译会遇到很多问题。
Android 4.0开发环境搭建及源码编译1、安装VMware Workstation pro2、安装ubuntu-12.04-desktop-amd643、gcc、g++降版本4、把aosp目录拷入5、在命令窗口下运行sudo ./jdk-6u29-linux-x64.bin6、在命令窗口下运行sudo gedit /etc/profile,并把profile_append中的内容追加到文件后面,并使配置生效7、在命令窗口下运行javac –verson,如果能显示版本号说明JDK安置成功8、安装编译依赖工具包1)sudo apt-get install bison2)sudo apt-get install flex3)sudo apt-get install apt-file4)sudo apt-file update5)sudo apt-get install lib32z16)sudo apt-get install gperf7)sudo apt-get install zlib1g-dev8)sudo apt-get install liblzma-dev9)sudo apt-get install ia32-libs10)sudo apt-get install lib32stdc++611)sudo apt-get install g++-multilib12)sudo apt-get install zlib1g-dev13)sudo apt-get install lib32z-dev14)sudo apt-get install lib32ncurses5-dev 15)sudo apt-get install build-essential 16)sudo apt-get install libx11-dev17)sudo apt-get install libgl1-mesa-dev 18)sudo apt-get install libglu1-mesa-dev 19)sudo apt-get install git20)sudo apt-get install git-core21)sudo apt-get install python-mardown 22)sudo apt-get install yum23)sudo yum install libx11-devel.i686(下不了,不要了)24)sudo apt-get install libv4l-dev25)sudo ln –s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h9、解压tar xvf aosp4r.tar10、解压tar xvf goldfish2629.tar11、解压sdk14.tar12、解压eclipse.tar13、运行error_ln中的两条命令14、进入目录goldfish_2.6.29,运行脚本build_kernel.sh15、返回上一级,现进入目录aosp,运行1)source ./build/envsetup.sh2) 运行lunch 选13)make -j416、创建模拟器~/aosp/android-sdk-linux/tools下运行./android create avd –n avd –t 1 17、运行脚本run_emulator.sh。
【转】Android源代码编译命令mmmmmmmake分析--不错在前⽂中,我们分析了Android编译环境的初始化过程。
Android编译环境初始化完成后,我们就可以⽤m/mm/mmm/make命令编译源代码了。
当然,这要求每⼀个模块都有⼀个Android.mk⽂件。
Android.mk实际上是⼀个Makefile脚本,⽤来描述模块编译信息。
Android编译系统通过整合Android.mk⽂件完成编译过程。
本⽂就对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的实现如下所⽰:[plain]1. function m()2. {3. T=$(gettop)4. if [ "$T" ]; then5. make -C $T $@6. else7. echo "Couldn't locate the top of the tree. Try setting TOP."8. fi9. }函数m调⽤函数gettop得到的是Android源代码根⽬录T。
在执⾏make命令的时候,先通过-C选项指定⼯作⽬录为T,即Android源代码根⽬录,接着⼜将执⾏命令m指定的参数$@作为命令make的参数。
android源码编译流程Android系统源代码是开源的,任何有兴趣的人都可以下载、阅读和修改它。
但是,为了保证该系统在各种硬件上的流畅运行,需要对Android源码进行编译。
以下是Android源码编译的流程:1. 安装编译环境编译Android源码需要安装一些必要的工具。
首先需要安装JDK(Java Development Kit),其次需要安装Android SDK(Software Development Kit)和NDK(Native Development Kit)。
此外,还需要安装Git和Repo工具,用于获取和同步源代码。
2. 下载源代码在安装好编译环境之后,需要从官方网站下载Android源代码。
这个过程可能需要一段时间,并且需要高速稳定的网络连接。
下载完成后,将源代码存储在本地磁盘上。
3. 初始化和同步源代码使用Repo工具初始化本地文件夹和Git工作区。
初始化完成之后,需要对代码库进行同步操作以确保源代码是最新的。
同步的过程可能需要几个小时,取决于网络速度和源代码树的大小。
4. 设置编译环境针对不同的设备和平台,需要配置不同的编译环境。
在此步骤中,需要设置所需的环境变量和其他相关的参数,例如,配置JDK路径、选择目标平台和设备、设置NDK路径等等。
5. 生成MakefileAndroid源代码使用GNU Make来构建,因此需要生成一个Makefile列表。
这个过程使用根目录下的build/envsetup.sh文件来完成。
一旦生成了Makefile,就可以开始编译Android源代码了。
6. 执行编译执行编译操作是最耗时的部分,需要等待一段时间才能完成。
编译和构建过程是一个逐步递进的过程。
首先需要编译基础库,然后编译各个组件和应用程序。
这个过程需要在控制台中执行一系列的命令,并且需要注意一些错误和警告消息。
7. 生成系统映像一旦编译完成,在源代码树下的out目录中就会生成一个system.img文件,这是Android系统的镜像文件。
编译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系统开发编译环境配置主机系统: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,漫长的下载过程。
AndroidGradle依赖配置:implementationapi背景:Android Gradle plugin 3.0开始(对应Gradle版本 4.1及以上),原有的依赖配置类型compile已经被废弃,开始使⽤implementation、api和annotationProcessor类型分别替代。
对应的,这三种替代配置类型针对具体的使⽤场景,具有不同的依赖⾏为。
其中,implementation和api依赖⼜相对最为常⽤,对其具体含义也需要理解清,在实际项⽬中选择依赖配置时,也才能游刃有余。
⾸先看⼀下Android官⽅⽂档中关于依赖配置的详细介绍:为陈述⽅便且不容易理解歧义,先划分出如下⼏个术语。
被引⼊的依赖模块,简称依赖模块引⼊了被依赖模块的当前模块,简称当前模块依赖了当前模块的上层模块,简称其他上层模块于是,官⽅⽂档中的描述翻译后对应的含义为:1,implementation:此依赖配置,使Gradle意识到,当前模块引⼊的依赖模块,在编译期间对其他上层模块不可见,仅在运⾏时对其他上层模块可见。
这将会加快多模块依赖的项⽬整体编译速度,因为通过implementation引⼊的依赖模块,如果依赖模块内部有进⾏过Api的改动,由于其对其他上层模块不可见,因此只需重新编译依赖模块⾃⾝以及使⽤到此改动的Api的当前模块即可。
2, api:等同于原有的compile,此依赖配置,使Gradle意识到,其引⼊的依赖模块,⽆论在编译期还是在运⾏时,都对其他上层模块可见,即通过api配置引⼊的依赖模块,在依赖关系上具有传递性。
这将会使得其他上层模块可以直接使⽤依赖模块的Api,但这同时意味着⼀旦依赖模块发⽣Api的改动,将导致所有已经使⽤了此依赖模块改动了的Api的上层模块都需要重新执⾏编译。
因此,⼀般会加⼤整个项⽬的编译时间,如⾮必要,⼀般建议优先使⽤implementation依赖配置。
如此描述⼀般情况下还不是很容易理解。
Android4.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_x86.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 中重新下了个android4.1.4的分支。
repoinit-uhttps:4.1.1_r4repo sync下载3个小时,终于下载完成,本来下载源码需要很长时间5〜10个小时,由于再ics的基础上下载,只需要把patch下载就行了(repo会自动完成)。
兴奋啊,赶紧.Build/envsetup.shlunch 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-glibc2.7-4.6/bin/x86_64-linux-ar only run on 64-bit linuxmake:***[out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a] 错误 1host C:emulator-target-i386 <= external/qemu/cpus.chost C:emulator-target-i386 <= external/qemu/arch_init.chost C:emulator-target-i386 <= external/qemu/os-posix.chost C:emulator-target-i386 <= external/qemu/oslib-posix.chost C:emulator64-arm <= external/qemu/audio/audio.chost C:emulator64-arm <= external/qemu/disas.cERROR:prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux- glibc2.7-4.6/bin/x86_64-linux-gcc only run on 64-bit linuxmake:*** [out/host/linux-x86/obj/EXECUTABLES/emulator64- arm_intermediates/disas.o] Error 1make:*** Waiting for unfinished jobs ...ERROR:prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux- glibc2.7-4.6/bin/x86_64-linux-gcc only run on 64-bit linuxmake:*** [out/host/linux-x86/obj/EXECUTABLES/emulator64-arm_intermediates/audio/audio.o] Error 1又陷入郁闷,googlebaidu 了好半天,都没找到解决方案,不过找到了提示,就是谷歌推荐使用64 位的ubuntu10.04 来编译,很多配置都是基于64来的,所以32位系统编译会遇到很多问题。
天啦,难道我要重装ubuntu ?软件,vim, java编译环境都需要重新配置,工程浩大。
找了半天实在找不到解决方案,只好去硬着头皮去下载了64 位ubuntu ,安装过程如下:下载64 位ubuntu-10.10-desktop-amd64.isoamd代表64位名称,并非只使用amd处理器。
把它放在F盘,并解压出其中Casper下的vmlinuz和initrd.gz放到ISO同盘根目录下载grub4dos解压出menu.lst和grldr.mgr把它门都放在C盘配置windows启动项,发现win7的c盘下找不到boot.ini原来win7启动配置跟xp 不一样,搜了下找到一下方法:开始菜单->运行->输入CMD,命令提示符下如下操作:bcdedit /create /d "GRUB4DOS" /application bootsector命令结果应该会返回一个GUID,后面的命令用到这个GUIDbcdedit /set {GUID} device partion=C:bcdedit /set {GUID} path \grldr.mbrbcdedit /displayorder {GUID} /addlast等安装完成之后可以使用bcdedit /delete {GUID}将GRUB4DOS勺启动项删除,GRUB4DOSo动项的GUID可使用bcdedit /v查看。
依次root 各个分区找到放iso 的盘例如xroot(hd0,x) x=0,1,2,。
ls 查看是否有iso 记下x。
找到iso 后执行kernel(hd0,x)/vmlinuzboot=casperiso-scan/filename=/ubuntu-10.10-desktop-amd64.isolocal=zh_CN.UTF-8initrd (hd0,x)/initrd.lzboot这样就启动了临时ubuntu,可以执行安装了,我选择在原来32位的ubuntu 上覆盖,这样有些配置不会丢失,文件也不会丢失,除非是系统原生的。
花了半个小时终于搞定。
然后开始下载64位的jdk,发现有新版本,就下了个1.7 然后修改~/.bashrc 安装装一些环境变量JAVA_HOME=/soft/jdk1.7.0PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHCLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib#export PATHexport CLASSPATH1. sudo apt-get install build-essential2. sudo apt-get install make3. sudo apt-get install gcc4. sudo apt-get install g++5. sudo apt-get install libc6-dev6.6. s udo apt-get install patch7. s udo apt-get install texinfo8. s udo apt-get install libncurses-dev10.11. sudo apt-get install git-core gnupg12. sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev zip curl13. sudo apt-get install ncurses-dev14. sudo apt-get install zlib1g-dev15. sudo apt-get install valgrind16. sudo apt-get install python顺便也下载了最新版本eclipse 64 位版本一切都就绪了,开始编译,编到几分钟报错:javac1.7 版本冲突,只好又去下载了jdk1.6 的64 位版本,重新配置了下~/.bashrcjava 路径。
然后开始继续编译。
过了10 分钟郁闷的又报错了,提示:error while loading shared libraries:libz.so.1: cannot open shared object file:No such file or directory找了好半天都没找到解决方案,明明看见了systemroot/usr/lib/libz.so.1 而且是个链接,编译器非说找不到。
重新编译了下toolchain 也无法解决。
终于看到相关信息,说是64位库用32位的链接,aapt 编译不过。
查了相关资料快绝望时,找到一篇帖子,说是少64 位ubuntu 要装一个库,赶紧sudo apt-get installia32-libs终于搞定了,开始编译sdk,.. build/envsetup.shlunch sdk-engmake -j8终于可以了,整个过程可谓艰难!用了6个小时终于编译完成了,最后makesdk生成了sdk,从out/host中拷出来,配置了adb路径,终于ok了。