Android ninja 编译启动过程分析
- 格式:pdf
- 大小:151.98 KB
- 文档页数:3
Android编译过程详解(⼀)Android的优势就在于其开源,⼿机和平板⽣产商可以根据⾃⼰的硬件进⾏个性定制⾃⼰的⼿机产品,如⼩⽶,LePhone,M9等,因此,在我们在对Android的源码进⾏定制的时候,很有必要了解下,Android的编译过程。
如果你从来没有做过Android代码的编译,那么最官⽅的编译过程就是查看Android的官⽅⽹站:但是,这⼉只是告诉你了如何去编译⼀个通⽤的系统,并没有详细告诉你细节,我们跟着编译过程来了解下。
+--------------------------------------------------------------------------------------------------------------------+本⽂使⽤Android版本为2.1,采⽤开发板为华清远见研发的FS_S5PC100 A8开发板。
+--------------------------------------------------------------------------------------------------------------------+按照google给出的编译步骤如下:1> source build/envsetup.sh:加载命令2> lunch:选择平台编译选项3> make:执⾏编译我们按照编译步骤来分析编译过程的细节,最终添加⾃⼰的平台编译选项。
1. source build/envsetup.sh这个命令是⽤来将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# add_lunch_combo函数被多次调⽤,就是它来添加Android编译选项# Clear this variable. It will be built up again when the vendorsetup.sh406 # files are included at the end of this file.# 清空LUNCH_MENU_CHOICES变量,⽤来存在编译选项407 unset LUNCH_MENU_CHOICES408 function add_lunch_combo()409 {410 local new_combo=$1 # 获得add_lunch_combo被调⽤时的参数411 local c# 依次遍历LUNCH_MENU_CHOICES⾥的值,其实该函数第⼀次调⽤时,该值为空412 for c in ${LUNCH_MENU_CHOICES[@]} ; do413 if [ "$new_combo" = "$c" ] ; then # 如果参数⾥的值已经存在于LUNCH_MENU_CHOICES变量⾥,则返回414 return415 fi416 done# 如果参数的值不存在,则添加到LUNCH_MENU_CHOICES变量⾥417 LUNCH_MENU_CHOICES=(${LUNCH_MENU_CHOICES[@]} $new_combo)418 }# 这是系统⾃动增加了⼀个默认的编译项 generic-eng420 # add the default one here421 add_lunch_combo generic-eng # 调⽤上⾯的add_lunch_combo函数,将generic-eng作为参数传递过去423 # if we're on linux, add the simulator. There is a special case424 # in lunch to deal with the simulator425 if [ "$(uname)" = "Linux" ] ; then426 add_lunch_combo simulator427 fi# 下⾯的代码很重要,它要从vendor⽬录下查找vendorsetup.sh⽂件,如果查到了,就加载它1037 # Execute the contents of any vendorsetup.sh files we can find.1038 for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/build/vendorsetup.sh 2> /dev/null`1039 do1040 echo "including $f"1041 . $f # 执⾏找到的脚本,其实⾥⾯就是⼚商⾃⼰定义的编译选项1042 done1043 unset fenvsetup.sh其主要作⽤如下: 1. 加载了编译时使⽤到的函数命令,如:help,lunch,m,mm,mmm等 2. 添加了两个编译选项:generic-eng和simulator,这两个选项是系统默认选项 3. 查找vendor/<-⼚商⽬录>/和vendor/<⼚商⽬录>/build/⽬录下的vendorsetup.sh,如果存在的话,加载执⾏它,添加⼚商⾃⼰定义产品的编译选项其实,上述第3条是向编译系统添加了⼚商⾃⼰定义产品的编译选项,⾥⾯的代码就是:add_lunch_combo xxx-xxx。
ANDROID源码编译流程编译Android源代码是一个相对复杂的过程,但是如果你按照正确的步骤进行,你就可以成功地编译出你自己的Android系统。
下面是一个大致的流程来编译Android源代码:1.环境准备:在开始编译Android源代码之前,你需要确保你的系统满足以下要求:- Linux系统(推荐使用Ubuntu)-64位操作系统-至少8GB的RAM-大规模存储空间(30GB或更多)你还需要安装一些必要的开发包和工具,例如JDK、Git等。
详细的要求可以在Android官方网站上找到。
2.获取源代码:要编译Android系统,你需要先获取源代码。
Android的源代码存储在Git仓库中,你可以使用Repo工具来管理多个Git仓库。
首先,你需要安装Repo工具。
你可以通过下面的命令来安装:```$ sudo apt-get install repo```之后,在一个合适的目录下创建一个新的文件夹来存放源代码:$ mkdir myandroid$ cd myandroid```使用Repo工具来初始化一个仓库:``````之后,同步源代码到你的本地仓库:```$ repo sync```这个过程可能需要花费几个小时甚至更长时间,取决于你的网络速度和计算机配置。
3.构建工具链:Android使用GNU Make和Ninja构建工具来构建系统。
你需要安装这些工具。
首先,安装GNU Make和一些必要的依赖库:```$ sudo apt-get install build-essential然后,安装Ninja:```$ sudo apt-get install ninja-build```4.配置构建环境:在构建Android系统之前,你需要进行一些配置操作。
首先,你需要选择要构建的目标设备和版本。
你可以在Android源代码的根目录中找到`lunch`脚本。
运行`lunch`脚本并选择你的目标:```$ source build/envsetup.sh$ lunch```然后,你需要选择编译时使用的编译器。
Android编译过程总结及android中各种img文件的作用以及系统启动过程编译环境:ubuntu 10.04(或者更高)(windows平台目前不被支持)本文以编译android2.3为例,64位操作系统1、编译环境的准备(1)确保安装有ubuntu系统或者虚拟机(2)安装JDK1.6(对于Android2.3以上代码)$ sudo add-apt-repository "deb/ lucid partner"$ sudo add-apt-repository "deb-src/ubuntu lucid partner"$ sudo apt-get update$ sudo apt-get installsun-java6-jdk(3)安装一些需要软件包$ sudo apt-get install git-coregnupg flex bison gperf build-essential \zip curl zlib1g-dev libc6-devlib32ncurses5-dev ia32-libs \x11proto-core-dev libx11-devlib32readline5-dev lib32z-dev \libgl1-mesa-dev g++-multilibmingw32 tofrodos(4)安装repo$ git clonegit:///tools/repo.git$ mkdir ~/bin$ cp repo-script/repo~/bin$ vim ~/.bashrc,将~/bin加入PARH环境变量,如:$ exportPATH=~/bin:$PATH保存后,同步更新:source~/.bashrc(5)设置git执行以下语句$git config "你的名字"$git config --global user.email"你的email地址"(6)同步源代码1)创建工程目录:$ mkdir myandroid$ cd myandroid2)repo初始化以及同步代码$repo init ****************.x.xx:git库名/manifest.git -b 主分支名在此过程中需要输入名字和email地址。
JAVA应用程序和小应用程序编译运行的详细过程Java应用程序和小应用程序的编译和运行过程可以分为以下几个步骤:2. 编译代码:一旦代码编写完成,程序员需要使用Java编译器将源代码转换为字节码。
在命令行中,可以使用javac命令来完成编译过程。
编译器会检查代码的语法和语义错误,并生成一个以.class结尾的字节码文件。
3. 加载类:在运行Java程序之前,Java虚拟机(JVM)需要将编译生成的字节码文件加载到内存中。
当JVM加载类时,它会根据类的名字查找对应的字节码文件,并将字节码文件加载到内存中的方法区。
4.验证:一旦类被加载到内存中,JVM会对它进行验证,以确保它的字节码是有效和安全的。
验证过程包括检查字节码的结构、检查类的继承关系和访问权限,并检查方法的参数和返回值是否正确。
5.准备:在类被实例化之前,JVM会为类的静态成员变量分配内存,并将其初始化为默认值。
这个过程被称为“准备阶段”。
6.解析:在程序执行之前,JVM还需要解析类中的符号引用,例如方法调用和字段访问。
解析阶段将符号引用解析为实际的方法和字段引用。
7.初始化:在准备阶段之后,JVM会执行类的静态初始化。
在静态初始化块中,程序员可以为静态成员变量赋值,并执行其他静态初始化操作。
静态初始化只会执行一次,且在类的第一次使用时才会触发。
8. 执行程序:一旦类被初始化,JVM会按照指定的入口点开始执行程序。
程序会按顺序执行代码,从主方法开始,逐行执行,直到程序结束或遇到return语句。
9.垃圾回收:在程序执行过程中,JVM会通过垃圾回收器自动回收不再使用的对象和内存。
垃圾回收器会周期性地扫描内存,找出无法访问的对象,并释放它们占用的内存空间。
总结:Java应用程序和小应用程序的编译和运行过程可以概括为编写代码、编译代码、加载类、验证、准备、解析、初始化和执行程序。
通过这个过程,程序员可以将Java代码转换为可执行的程序,并在JVM上运行。
如何使⽤ninja编译系统编译我们的程序?使⽤ninja配置⾃⼰的环境来使⽤ninja构建程序Android使⽤ninjaWindows使⽤调试不使⽤VS技巧问题Ninja的原意是忍者,忍者神龟的忍者。
这⾥被google拿来⽤在他们的编译系统上。
⽬标是替代make之类的构建器,由于他们认为其他的构建器太慢了,为此他们做过对照,对于chrome之类的拥有⼏万个⽂件的超⼤程序来说,⽤ninja的话,差点⼉马上開始编译,⽽make差点⼉要等上个10秒钟才開始编译。
Ninja的另外⼀个特点,事实上不是他娘的特点,就是独⽴于编译系统的输⼊⽂件,我想问下google⼤神。
难道cmake的CMakeList.txt不是吗?Google把别的编译系统⽐作⾼级语⾔,⽽把⾃⼰努⼒设计成更底层的汇编器。
这样才⼲从指令层⾯来优化编译性能。
Ninja的的构建(build)⽂件是给⼈看的。
但不是特别⽅便于⼿写。
这些特点同意她⾼速评估递增构建。
毕竟不是每次都要从头開始。
Ninjia的底层特性使得她更适合嵌⼊功能强⼤的构建系统。
通过gyp(哈哈,拿来的CMakeLists.txt)。
ninja可以构建Chrome和v8, node.js等等项⽬。
通过cmake, ninja可以构建LLVM(虚拟机啊)以及KDE桌⾯等等。
如何获取ninja?github上有:git clone git:///martine/ninja.git或者我们在debian/ubuntu上能够这样:apt-get install ninja-build本⽂属原创。
转载请注明出处,违者必究关注微信公众平台:程序猿互动联盟(coder_online),你能够第⼀时间获取原创技术⽂章,和(java/C/C++/Android/Windows/Linux)技术⼤⽜做朋友。
在线交流编程经验。
获取编程基础知识,解决编程问题。
程序猿互动联盟,开发者⾃⼰的家。
Android源码编译的全过程记录写本篇⽂章主要参考了官⽅⽂档和⽹上的⼀些资料,但是对于Android最新的代码来说,⽹上资料有些已经过时。
本⽂中步骤已经作者实验,⼤家可以亲⾃执⾏试试。
由于没有使⽤Eclipse的习惯,所以没有做Eclipse的相关配置。
编译环境:ubuntu9.10,widnows平台⽬前不被⽀持。
1)安装必要的软件环境$ 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-dev zlib1g-dev官⽅推荐的就是上⾯这些,如果在编译过程中发现某些命令找不到,就apt-get它。
可能需要的包还有:$ sudo apt-get install make$ sudo apt-get install gcc$ sudo apt-get install g++$ sudo apt-get install libc6-dev$ sudo apt-get install patch$ sudo apt-get install texinfo$ sudo apt-get install zlib1g-dev$ sudo apt-get install valgrind$ sudo apt-get install python2.5(或者更⾼版本)需要注意的是,官⽅⽂档说如果⽤sun-java6-jdk可出问题,得要⽤sun-java5- jdk。
经测试发现,如果仅仅make(make不包括make sdk),⽤sun-java6-jdk是没有问题的。
⽽make sdk,就会有问题,严格来说是在make doc出问题,它需要的javadoc版本为1.5。
因此,我们安装完sun-java6-jdk后最好再安装sun-java5-jdk,或者只安装sun-java5-jdk。
Android编译过程详解(⼆)通过上篇⽂章,我们分析了编译android时source build/envsetup.sh和lunch命令,在执⾏完上述两个命令后, 我们就可以进⾏编译android了。
1. make执⾏make命令的结果就是去执⾏当前⽬录下的Makefile⽂件,我们来看下它的内容:### DO NOT EDIT THIS FILE ###include build/core/main.mk### DO NOT EDIT THIS FILE ###呵呵,看到上⾯ 的内容,我们都会笑,这是我见过最简单的Makefile了,我们再看下build/core/main.mkmain.mk⽂件⾥虽然脚本不多,但是却定义了整个Android的编译关系,它主要引⼊了下列⼏个重要的mk⽂件:49 include $(BUILD_SYSTEM)/config.mk55 include $(BUILD_SYSTEM)/cleanbuild.mk142 include $(BUILD_SYSTEM)/definitions.mk当然每个mk⽂件都有⾃⼰独特的意义,我们⼀并将主线流程相关mk⽂件都列出来,⼤概来介绍下,先有个整体的概念,然后再细化了解。
所有的Makefile都通过build/core/main.mk这个⽂件组织在⼀起,它定义了⼀个默认goals:droid,当我们在TOP⽬录下,敲Make实际上就等同于我们执⾏make droid。
当Make include所有的⽂件,完成对所有make我⽂件的解析以后就会寻找⽣成droid的规则,依次⽣成它的依赖,直到所有满⾜的模块被编译好,然后使⽤相应的⼯具打包成相应的img。
其中,config.mk,envsetup.mk,product_config.mk⽂件是编译⽤户指定平台系统的关键⽂件。
上图中红⾊部分是⽤户指定平台产品的编译主线,我们先来看下config.mk的主要作⽤。
【转】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编译系统环境初始化过程分析Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就是指定编译的类型和目标设备的型号。
Android的编译类型主要有eng、userdebug和user三种,而支持的目标设备型号则是不确定的,它们由当前的源码配置情况所决定。
为了确定源码支持的所有目标设备型号,Android编译系统在初始化的过程中,需要在特定的目录中加载特定的配置文件。
接下来本文就对上述的初始化过程进行详细分析。
对Android编译环境进行初始化很简单,分为两步。
第一步是打开一个终端,并且将build/envsetup.sh加载到该终端中:[html] view plain copy 在CODE上查看代码片派生到我的代码片$ . ./build/envsetup.shincluding device/asus/grouper/vendorsetup.shincluding device/asus/tilapia/vendorsetup.shincluding device/generic/armv7-a-neon/vendorsetup.shincluding device/generic/armv7-a/vendorsetup.shincluding device/generic/mips/vendorsetup.shincluding device/generic/x86/vendorsetup.shincluding device/lge/mako/vendorsetup.shincluding device/samsung/maguro/vendorsetup.shincluding device/samsung/manta/vendorsetup.shincluding device/samsung/toroplus/vendorsetup.shincluding device/samsung/toro/vendorsetup.shincluding device/ti/panda/vendorsetup.shincluding sdk/bash_completion/adb.bash从命令的输出可以知道,文件build/envsetup.sh在加载的过程中,又会在device目录中寻找那些名称为vendorsetup.sh的文件,并且也将它们加载到当前终端来。
android的编译过程Android应用程序的编译过程涉及多个步骤,包括代码编译、资源处理、打包和优化等。
下面我将从多个角度全面介绍Android应用程序的编译过程。
首先,Android应用程序的编译过程通常从Java或Kotlin源代码开始。
开发人员编写应用程序的业务逻辑和功能,然后使用Java编译器或Kotlin编译器将源代码编译成Java字节码或Kotlin字节码。
其次,Android应用程序还涉及资源文件,如布局文件、图片、字符串等。
这些资源文件需要经过资源处理工具的处理,例如aapt (Android Asset Packaging Tool),它将资源文件编译成二进制格式,并生成R.java文件,其中包含资源ID的映射关系。
接下来,编译器将Java字节码或Kotlin字节码与资源文件一起打包成未签名的APK文件。
此时,还没有进行代码优化或混淆处理。
然后,未签名的APK文件需要经过代码优化和混淆处理。
代码优化可以包括删除未使用的代码、压缩代码等,以提高应用程序的性能和减小文件大小。
混淆处理则是为了保护应用程序的安全,将变量名、方法名等重命名为无意义的名称,使得反编译后的代码难以理解。
最后,经过代码优化和混淆处理的未签名APK文件将被签名,生成最终的APK文件。
签名是为了验证APK文件的真实性和完整性,确保在应用程序安装和更新时不会被篡改。
总的来说,Android应用程序的编译过程涉及代码编译、资源处理、打包、优化和签名等多个步骤,最终生成可安装的APK文件。
这些步骤保证了应用程序的性能、安全性和稳定性。
android 编译流程Android编译流程Android编译流程是将开发人员编写的源代码转换为可在Android 设备上运行的可执行文件的过程。
本文将介绍Android编译流程的主要步骤和各个阶段的工作原理。
一、源代码准备阶段在编译之前,开发人员需要准备好Android应用程序的源代码。
通常,Android应用程序的源代码以Java编写,开发人员可以使用Android Studio等集成开发环境进行编码和调试。
二、构建系统Android构建系统是整个编译流程的核心部分,它负责处理源代码的编译、资源文件的处理和打包等工作。
Android构建系统使用Gradle作为构建工具,它可以自动化执行编译、依赖管理和打包等任务。
1. 生成R.java文件在编译过程中,构建系统会根据项目中的资源文件(如布局文件、图片等)生成对应的R.java文件,该文件包含了资源文件的引用和ID等信息。
2. 编译源代码构建系统将Java源代码编译为字节码文件(.class文件),并将其转换为Android虚拟机(Dalvik虚拟机或ART虚拟机)可以理解的.dex文件。
3. 处理资源文件构建系统会对项目中的资源文件进行处理,包括压缩、优化和打包等操作。
资源文件包括布局文件、图片、字符串等。
4. 构建APK构建系统会将编译后的字节码文件和处理后的资源文件打包成Android应用程序的安装包(APK文件)。
APK文件是Android应用程序的可执行文件,可以在Android设备上安装和运行。
三、签名和打包在构建完成后,开发人员需要对APK文件进行签名和打包。
APK签名是为了验证APK文件的完整性和来源,以确保安装的应用程序是可信的。
APK打包是将签名后的APK文件进行压缩和优化,以减少文件大小并提高应用程序的性能。
1. 生成密钥库开发人员需要生成一个密钥库(Keystore)文件,用于存储应用程序的数字证书和私钥。
密钥库文件是用来对APK文件进行签名的重要文件。
1. Boot系统初始化,具体过程参见(system\core\init\Init.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。
2. 初始化成功后,就开始mounting系统,具体参见(system\core\mountd\Mountd.c) 中的main 函数。
3.接下来运行ndroidRuntime,并开始启动java虚拟机dalvikvm。
4. Java虚拟机启动成功后,开始系统初始化。
系统初始的第一步是用JNI方式实现的,对应java代码为(frameworks\base\services\java\com\android\server\SystemServer.java) init1(Native)函数,对应的JNI C++代码为(frameworks\base\core\jni\server\com_android_server_SystemServer.cpp),而实现的C++代码为(frameworks\base\cmds\system_server\library\ System_init.cpp) 中的system_init()函数。
5. system_init调用SurfaceFlinger,SurfaceFlinger的readyToRun()函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个动态的小机器人。
6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.init2()。
ServerThread 将启动各种系统服务,如Power Manager、Activity Manager等等,具体参见ServerThread的run函数,ServerThread同在SystemServer.java中。
7.这之后的事,应该就是进入系统了。
android的编译和运⾏过程深⼊分析⾸先来看⼀下使⽤Java语⾔编写的Android应⽤程序从源码到安装包的整个过程,⽰意图如下,其中包含编译、链接和签名等:可以先通过搭建好的Eclipse开发环境创建⼀个未编译的Android⼯程,记的⼀定要将Eclipse中Project菜单下的Build Automatically选项前⾯的对勾去掉后再去创建⼯程。
创建好未编译的⼯程后,在命令⾏中输⼊如下命令:d:\android-sdk-windows\platform-tools>aapt package -f -m -M "C:\Documents andSettings\******\workspace\HelloAndroid3\AndroidManifest.xml" -J "C:\Documents andSettings\******\workspace\HelloAndroid3\gen" -S "C:\Documents and Settings\******\workspace\HelloAndroid3\res" -I "D:\android-sdk-windows\platforms\android-10\android.jar"其中-M及紧跟其后的参数是⽤于指定AndroidManifest.xml(配置⽂件)的路径,-J及紧跟其后的参数是指定R.java⽣成路径,-S及后⾯参数是指定资源⽂件所在⽬录,-I及后⾯参数是指定要包含的Android平台类库;运⾏后会在⼯程⽬录中的gen⽬录下⽣成R.java⽂件。
aapt的具体⽤法可在命令⾏输⼊aapt后会看到。
R.java⽂件的作⽤是提供给程序访问资源的⼊⼝,更详细的内容请参见后⾯关于Android⼯程的⽂件结构和详解的博⽂。
AIDL是Android系统提供的⼀种进程间调⽤的⽅式,类似于IPC调⽤,通过aidl⼯具将使⽤Android Interface Definition Language描述的.aidl⽂件编译成包含java接⼝类的.java⽂件,然后进程间遵循这些接⼝进⾏相互调⽤。
Ninja编译过程分析在Android N的系统上,初次使⽤了Ninja的编译系统。
对于Ninja,最初的印象是⽤在了Chromium open source code的编译中,在chromium的编译环境中,使⽤ninja -C out/Default chrome命令,就可以利⽤源码编译出chrome的apk。
对使⽤者⽽⾔,抛开对原理的探究,最直观的印象莫过于可以清楚的看到⾃⼰当前编译的进度。
同时,对android⽽⾔,也可以感受到编译速度的提升带来的便捷。
本⽂将深⼊分析Ninja的编译原理,以及android上⾯的编译改变。
正因为这个改变,所以在编译android N的code的时候需要使⽤OpenJDK8NinjaNinja是⼀个致⼒于速度的⼩型编译系统(类似于Make);如果把其他编译系统⽐做⾼级语⾔的话,Ninja就是汇编语⾔主要有两个特点:1、可以通过其他⾼级的编译系统⽣成其输⼊⽂件;2、它的设计就是为了更快的编译;使⽤Kati把makefile转换成Ninja files,然后⽤Ninja编译在不久的将来,当不再⽤Makefile(Android.mk)时,Kati将被去掉ninja核⼼是由C/C++编写的,同时有⼀部分辅助功能由python和shell实现。
由于其开源性,所以可以利⽤ninja的开源代码进⾏各种个性化的编译定制。
Blueprint和Soong是⽤于⼀起把Blueprint ⽂件转换为Ninja⽂件。
将来需要写Blueprint⽂件(Android.bp),转换为Android.soong.mk(也可以直接写),然后转换为Ninja⽂件(build.ninja)然后⽤Ninja编译。
如果Android.mk和Android.bp同时存在,Android.mk会被忽略。
如果Android.bp的同级⽬录下有Android.soong.mk也会被include。
android 系统编译流程原理Android系统编译流程及原理Android系统是目前全球最流行的移动操作系统之一,而其编译过程是实现系统构建的关键步骤。
本文将介绍Android系统的编译流程及其原理,以帮助读者更好地理解Android系统的工作原理。
一、概述Android系统的编译过程主要包括源代码的获取、构建环境的配置、编译源代码、生成系统镜像等几个主要步骤。
整个编译过程通常需要一台性能较好的计算机来完成。
二、源代码的获取要编译Android系统,首先需要从官方网站或其他渠道获取到Android源代码。
Android源代码以Git的形式进行管理,可以通过Git命令来获取最新的源代码。
三、构建环境的配置在开始编译前,需要配置好编译环境。
首先需要安装Java Development Kit(JDK),并设置好相应的环境变量。
然后需要安装Android SDK,以及Android Build Tools等编译工具。
四、编译源代码编译源代码是整个编译过程的核心步骤。
Android系统的源代码使用Makefile进行管理和编译。
Makefile是一种构建工具,用于描述源代码的依赖关系和编译规则。
在编译过程中,Makefile会根据源代码的依赖关系,自动判断哪些文件需要重新编译。
这样可以避免重复编译和提高编译效率。
编译源代码的过程通常包括以下几个步骤:1. 初始化:Makefile会进行一些初始化操作,例如设置编译参数、创建输出目录等。
2. 依赖检查:Makefile会检查源代码的依赖关系,判断哪些文件需要重新编译。
3. 编译源文件:Makefile会根据源代码的编译规则,将源文件编译成目标文件。
4. 链接目标文件:Makefile会将编译得到的目标文件链接成可执行文件或库文件。
5. 生成系统镜像:最后,Makefile会将编译得到的可执行文件、库文件等打包成系统镜像,以供安装到设备上运行。
五、生成系统镜像在编译完成后,就可以生成Android系统的系统镜像了。
跨平台:GN实践详解(ninja,编译,windowsmacandroid实战)目录一、概览二、跨平台代码编辑器三、GN入门四、示范工程五、关键细节六、结语 [编译器选项]其中前两部分是前缀部分,原本没有跨平台构建经验和知识的同学可以借助来帮助理解,后四部分则是讲述GN工程的基本结构、如何搭建一个GN构建的工程、以及关键的一些GN知识一、概览如何开始这个话题是我比较在意的,因为对于部分人而言,真正从思维和理解上切入这篇文章真正要阐述的点是有困难的。
这在于跨平台编译和开发这块,如果没有一定的经历,可能会很难理解这些跨平台工具出现的真正意义,它们所要解决的问题是什么,所以这里我需要做一点前缀工作,如果对GN/GYP/CMake这类话题已经有上下文的同学可以直接跳过这部分赘述内容,同时也希望借助对这篇文章的理解,大家往后对于跨平台工具的理解不局限于GN,而是有自己的认知。
在不断发展和变化的大潮中,工具始终是在演变,能够始终抓住紧要的精髓,见到陌生的工具时对它从根上有淡定从容的认知,以最小的精力消耗掌握它,最快发挥它的价值服务于我们,才是我们的取胜之道。
集成编译开发环境以实际工作为例,我们在开发过程中需要接触到的有源代码工程管理、代码编辑、代码编译,而统一囊括了这几部分的开发环境就是集成开发环境,由于集成开发环境的存在,大部分人其实只需要重点关注代码编辑这块,工程管理和编译集成开发环境已经内置做了绝大部分工作,所以理所当然也就容易忽略它们,我们也有必要重新认识下这几部分工作。
工程管理:源代码包含、模块输出设置(动态库/静态库/可执行文件、模块依赖关系配置、编译选项设置、链接选项设置、生成后执行事件……等非常多的设置。
代码编辑:自动补齐、格式对齐、定义跳转、关键字高亮、代码提示……等我们编写代码时用着很人性化的功能。
代码编译:语法语音分析、代码优化、错误提示、警告提示、最终生成二进制代码和符号表。
各操作系统应用开发的集成开发环境Windows应用开发:Visual Studio,简称VS,是微软提供和支持的集成开发编译环境,用于开发Windows上应用。
Android ninja编译启动过程分析
---make是如何转换到到ninja编译的
1.首先你的得对make的工作机制有个大概的了解:
运行的命令在要编译的目录下运行make,或者make target_name
a.分析处理保存阶段(没有实际编译动作):它首先对当前目录下的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.mk
97include$(BUILD_SYSTEM)/help.mk
98
99#Set up various standard variables based on configuration
100#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:=true
107endif
108endif
116ifeq($(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_NINJA
122#Remove ninja build mark if it exists.
123$(shell rm-f$(OUT_DIR)/ninja_build)
124endif
......
endif////////!relaunch_with_ninja
这里是文件底了
接着上面的include build/core/ninja.mk
build/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)
139else
140COMBINED_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_ninja
118ifndef BUILDING_WITH_NINJA
119#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。
,只是他会输出.ninja file,而不是如过去make解析makefile记在心里,然后给他自己跳入做action,而现在是生成个文件给ninja跳入做action了.
在下载的Android源码下,测试通过make droid-j25最接续编译测试:
####make completed successfully(01:06(mm:ss))####
快的震惊啊!
测试用代码版本:
PLATFORM_VERSION:=7.1.2。