【Android源码 栏目提醒】:网学会员--在 Android源码 编辑为广大网友搜集整理了:android编译大全_完全指南 - 操作系统绩等信息,祝愿广大网友取得需要的信息,参考学习。
AndroidAndroidAndroidAndroid编译大全
Android编译大全一1.编译前的准备1.1.编译环境准备v先构建一个Ubuntu9.10虚拟机v在虚拟机中确认下面的包是否已经安装nsudoapt-getinstallbuild-essentialnsudoapt-getinstallmakensudoapt-getinstallgccnsudoapt-getinstallgnsudoapt-getinstalllibc6-devnsudoapt-getinstallflexnsudoapt-getinstallbisonnsudoapt-getinstallpatchnsudoapt-getinstalltexinfonsudoapt-getinstalllibncurses-devnsudoapt-getinstallgit-coregnupg//gnupg系统可能已自带nsudoapt-getinstallflexbisongperflibsdl-devlibesd0-devlibwxgtk2.6-devbuild-essentialzipcurlnsudoapt-getinstallncurses-devnsudoapt-getinstallzlib1g-devnsudoapt-getinstallvalgrindnsudoapt-getinstallpython2.5Ubuntu可能已经自带nsudoapt-getinstallsun-java5-jdkUbuntu9.10里面已经用1.6替换了1.5需要重新下载一个1.5v下载repo脚本加上可执行权。
ncurlhttp://
android.git.kernel.org/repogtreponsudochmodaxrepo注本文档以Froyo版本为基础进行编译。
1.2.Sourcecode的获取v在
源码存放目录
android中执行repoinit-ugit://codeaurora.org/platform/manifest.git-bcarrot.cupcake-mM7201JSDCBALYA6380.xml就可以获得代码了关于-b和-m参数的说明参见https://www.codeaurora.org/wiki/QAEPv执行reposync就可以开始下载
源码了reposync漫长的过程视速度而言需要半天以上
Android编译大全二2.编译源代码v执行ls-la/bin/sh命令如果输出如下rwxrwxrwx1rootroot42010-02-1017:14/bin/sh-gtdash请执行sudodpkg-reconfiguredash命令修改sh版本并选择“否”此处如果不改好的话编译时会出现错误。
v执行sourcebuild/envsetup.sh命令v执行choosecombo命令出现选择对话框uBuildforthesimulatororthedeviceu1.Deviceu2.SimulatoruuWhichwouldyoulike1uuBuildtypechoicesare:u1.releaseu2.debuguuWhichwouldyoulike2uuProductchoicesare:u1.coreu2.full_dreamu3.fullu4.full_passionu5.full_sapphireu6.generic_dreamu7.genericu8.generic_passionu9.generic_sapphireu10.msm7625_qrdu11.msm7627_ffau12.msm7627_surfu13.msm7630_surfu14.qsd8250_ffau15.qsd8250_surfu16.sample_addonu17.sdku18.simuYoucanalsotypethenameofaproductifyouknowit.uWhichproductwouldyoulikegeneric3uuVariantchoicesare:u1.useru2.userdebugu3.enguWhichwouldyoulikeeng如果执行这个命令的时候报错/bin/sh:Syntaxerror:quotquotunexpected请执行sudodpkg-reconfiguredash命令并选择“否”v配置环境变量exportJAVA_HOME/usr/lib/jvm/java-5-sunexportCLASSPATHJAVA_HOME/libexportJRE_HOMEJAVA_HOME/jreexportJAVA_PATHJAVA_HOME/bin:JRE_HOME/binexportCLASSPATH.:JAVA_HOME/lib:JRE_HOME/lib:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jarexportANDROID_JAVA_HOMEJAVA_HOMEexportPATHJAVA_PATH:PATHv执行make命令如果安装的是java1.6将报错如下Yourversionis:javaversionquot1.6.0_15quot.Thecorrectversionis:1.5.解决java编译错误如下1下载jdk1.5ftp://202.112.80.252/java/jdk-1_5_0_21-linux-i586.bin2将jdk-1_5_0_21-linux-i586.bin变为可执行权限sudochmodaxjdk-1_5_0_21-linux-i586.bin3在命令行下执行./jdk-1_5_0_21-linux-i586.bin安装sdk4建立一个软连接到jdk目录sudolnjdk1.5.0_21/java-5-sun-s5然后配置环境变量sudogedit/etc/enviroment在其中添加两行CLASSPATH/usr/lib/jvm/java-5-sun/libJAVA_HOME/usr/lib/jvm/java-5-sun如果在出现类似使用了旧版api的错误请先按照提示执行makeupdate-api命令。
该命令执行结束之后再继续执行make命令就可以编译成功了。
在配置好shell命令类型之后也可以新建一个shell脚本如下进行自动编译exportJAVA_HOME/usr/lib/jvm/java-5-sunexportCLASSPATHJAVA_HOME/libexportJRE_HOMEJAVA_HOME/jreexportJAVA_PATHJAVA_HOME/bin:JRE_HOME/binexportCLASSPATH.:JAVA_HOME/lib:JRE_HOME/lib:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jarexportANDROID_JAVA_HOMEJAVA_HOMEexportPATHJAVA_PATH:PATHsourcebuild/envsetup.shchoosecombo1173makebuild之后的log如下……creatingboot.img...creatingrecovery.img...creatingsystem.img...creatinguserdata.img...cleaningup...Done.
Android编译大全三3.验证编译之后的模块exportANDROID_PRODUCT_OUTltSrcDirgt/out/target/product/genericcd./out/host/linux-x86/bin./emulator4.编译完成之后的代码结构
Android编译完成后将在根目录中生成一个out文件夹所有生成的内容均放置在这个文件夹中。
out文件夹如下所示out/--CaseCheck.txt--casecheck.txt--host--common--linux-x86--target--common--product主要的两个目录为host和target前者表示在主机x86生成的工具后者表示目标机模认为ARMv5运行的内容。
host目录的结构如下所示out/host/--common--objJAVA库--linux-x86--bin二进制程序--frameworkJAVA库.jar文件--lib共享库.so--obj中间生成的目标文件host目录是一些在主机上用的工具有一些是二进制程序有一些是JAVA的程序。
target目录的结构如下所示out/target/--common--R资源文件--docs--obj目标文件--product--generic其中common目录表示通用的内容product中则是针对产品的内容。
在common目录的obj中包含两个重要的目录APPS中包含了JAVA应用程序生成的目标每个应用程序对应其中一个子目录将结合每个应用程序的原始文件生成
Android应用程序的APK包。
JAVA_LIBRARIES中包含了JAVA的库每个库对应其中一个子目录。
在默认的情况下
Android编译将生成generic目录如果选定产品还可以生成其他的目录。
generic包含了以下内容out/target/product/generic/--
android-info.txt--clean_steps.mk--data--obj--ramdisk.img--root--symbols--system--system.img--userdata-qemu.img--userdata.img在generic/obj/APPS目录中包含了各种JAVA应用与common/APPS相对应但是已经打成了APK包。
system目录是主要的文件系统data目录是存放数据的文件系统。
obj/SHARED_LIBRARIES中存放所有动态库。
obj/STATIC_LIBRARIES中存放所有静态库。
几个以img为结尾的文件是几个目标映像文件其中ramdisk是作为内存盘的根文件系统映像system.img是主要文件系统的映像这是一个比较大的文件data.img是数据内容映像。
这几个image文件是运行时真正需要的文件。
5.makeSDK5.1.sdk编译在编译完整个系统之后再运行makesdk就可以进行sdk的编译了。
makesdk将各种工具和image打包供开发和调试使用。
exportJAVA_HOME/usr/lib/jvm/java-5-sunexportCLASSPATHJAVA_HOME/libexportJRE_HOMEJAVA_HOME/jreexportJAVA_PATHJAVA_HOME/bin:JRE_HOME/binexportCLASSPATH.:JAVA_HOME/lib:JRE_HOME/lib:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jarexportANDROID_JAVA_HOMEJAVA_HOMEexportPATHJAVA_PATH:PATHsourcebuild/envsetup.shmakesdk……PackageSDKStubs:out/target/common/obj/PACKAGING/
android_jar_intermediates/
android.jarPackageSDK:out/host/linux-x86/sdk/
android-sdk_eng.huangjx_linux-x86.zipbuild之后的log如下5.2.验证编译之后的模块将out/host/linux-x86/sdk/
android-sdk_eng.huangjx_linux-x86.zip解压到本地目录。
进入tools目录输入下面的命令创建AVD./androidcreateavd-t1-c128M-nfroyo-sHVGAAndroid2.2isabasicAndroidplatform.DoyouwishtocreateacustomhardwareprofilenoCreatedAVDfroyobasedonAndroid2.2withthefollowinghardwareconfig:hw.lcd.density160输入下面的命令启动模拟器./emulator-avdfroyo-partition-size160ampAndroid编译大全四6.编译详细分解6.1.build系统简介6.1.1.build系统文件结构./build--CleanSpec.mk--buildspec.mk.default--core--Makefile--apicheck_msg_current.txt--apicheck_msg_last.txt--armelf.x--armelf.xsc--armelflib.x--base_rules.mk--binary.mk--build-system.html--build_id.mk--checktree--cleanbuild.mk--cleanspec.mk--clear_vars.mk--combo--HOST_darwin-x86.mk--HOST_linux-x86.mk--HOST_windows-x86.mk--TARGET_linux-arm.mk--TARGET_linux-sh.mk--TARGET_linux-x86.mk--arch--arm--armv4t.mk--armv5te-vfp.mk--armv5te.mk--armv7-a-neon.mk--armv7-a.mk--javac.mk--select.mk--config.mk--copy_headers.mk--definitions.mk--device.mk--distdir.mk--droiddoc.mk--dynamic_binary.mk--envsetup.mk--executable.mk--filter_symbols.sh--find-jdk-tools-jar.sh--host_executable.mk--host_java_library.mk--host_prebuilt.mk--host_shared_library.mk--host_static_library.mk--java.mk--java_library.mk--key_char_map.mk--main.mk--multi_prebuilt.mk--node_fns.mk--notice_files.mk--package.mk--pathmap.mk--prebuilt.mk--prelink-linux-arm-2G.map--prelink-linux-arm.map--process_wrapper.sh--process_wrapper_gdb.cmds--process_wrapper_gdb.sh--product.mk--product_config.mk--proguard.flags--proguard_tests.flags--raw_executable.mk--raw_static_library.mk--root.mk--shared_library.mk--static_java_library.mk--static_library.mk--tasks--apicheck.mk--cts.mk--product-graph.mk--sdk-addon.mk--version_defaults.mk--envsetup.sh--libs--host--
Android.mk--CopyFile.c--include--host--CopyFile.h--Directories.h--pseudolocalize.h--list.java--pseudolocalize.cpp--target--board--
Android.mk--emulator--AndroidBoard.mk--BoardConfig.mk--README.txt--tuttle2.kcm--tuttle2.kl--generic--AndroidBoard.mk--BoardConfig.mk--README.txt--system.prop--tuttle2.kcm--tuttle2.kl--sim--AndroidBoard.mk--BoardConfig.mk--product--AndroidProducts.mk--core.mk--full.mk--generic.mk--languages_full.mk--languages_small.mk--sdk.mk--security--README--media.pk8--media.x509.pem--platform.pk8--platform.x509.pem--shared.pk8--shared.x509.pem--testkey.pk8--testkey.x509.pem--sim.mkAndroid编译大全五6.1.2.make文件分类??配置类主要用来配置product、board以及根据你的Host和Target选择相应的工具以及设定相应的通用编译选项config文件说明build/core/config.mkConfig文件的概括性配置build/core/envsetup.mkgenerate目录构成等配置build/target/product产品相关的配置build/target/board硬件相关的配置build/core/combo编译选项配置这里解释下这里的board和product。
board主要是设计到硬件芯片的配置比如是否提供硬件的某些功能比如说GPU等等或者芯片支持浮点运算等等。
product是指针对当前的芯片配置定义你将要生产产品的个性配置主要是指APK方面的配置哪些APK会包含在哪个product中哪些APK在当前product中是不提供的。
config.mk是一个总括性的东西它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块比如说BUILT_PREBUILT就定义了如何来编译预编译模块。
envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输出目录combo里面主要定义了各种Host和Target结合的编译器和编译选项。
??模块组织类这类文件主要定义了如何来处理Module的
Android.mk以及采用何种方式来生成目标模块这些模块生成规则都定义在config.mk里面。
我们可以看看CLEAR_VARS:BUILD_SYSTEM/clear_vars.mkBUILD_HOST_STATIC_LIBRARY:BUILD_SYSTEM/host_static_library.mkBUILD_HOST_SHARED_LIBRARY:BUILD_SYSTEM/host_shared_library.mkBUILD_STATIC_LIBRARY:BUILD_SYSTEM/static_library.mkBUILD_RAW_STATIC_LIBRARY:BUILD_SYSTEM/raw_static_library.mkBUILD_SHARED_LIBRARY:BUILD_SYSTEM/shared_library.mkBUILD_EXECUTABLE:BUILD_SYSTEM/executable.mkBUILD_RAW_EXECUTABLE:BUILD_SYSTEM/raw_executable.mkBUILD_HOST_EXECUTABLE:BUILD_SYSTEM/host_executable.mkBUILD_PACKAGE:BUILD_SYSTEM/package.mkBUILD_HOST_PREBUILT:BUILD_SYSTEM/host_prebuilt.mkBUILD_PREBUILT:BUILD_SYSTEM/prebuilt.mkBUILD_MULTI_PREBUILT:BUILD_SYSTEM/multi_prebuilt.mkBUILD_JAVA_LIBRARY:BUILD_SYSTEM/java_library.mkBUILD_STATIC_JAVA_LIBRARY:BUILD_SYSTEM/static_java_library.mkBUILD_HOST_JAVA_LIBRARY:BUILD_SYSTEM/host_java_library.mkBUILD_DROIDDOC:BUILD_SYSTEM/droiddoc.mkBUILD_COPY_HEADERS:BUILD_SYSTEM/copy_headers.mkBUILD_KEY_CHAR_MAP:BUILD_SYSTEM/key_char_map.mk除了CLEAR_VARS是清楚本地变量之外其他所有的都对应了一种模块的生成规则每一个本地模块最后都会include其中的一种来生成目标模块。
大部分上面的.mk都会包含base_rules.mk这是对模块进行处理的基础文件建议要写本地模块的都去看看看明白了为什么
Android.mk要这么写就会大致明白了。
??单个模块编译类本地模块的Makefile文件就是我们在
Android里面几乎上随处可见的
Android.mk。
Android进行编译的时候会通过下面的函数来遍历所有子目录中的
Android.mk一旦找到就不会再往层子目录继续寻找所有你的模块定义的顶层
Android.mk必须包含自己定义的子目录中的
Android.mk。
subdir_makefilesshellbuild/tools/findleaves.sh--prunequot./outquotsubdirsAndroid.mk不同类型的本地模块具有不同的语法但基本上是相通的只有个别变量的不同如何添加模块在前面的帖子已经说过了大家可以参考。
Android通过LOCAL_MODULE_TAGS来决定哪些本地模块会不会编译进系统通过PRODUCT和LOCAL_MODULE_TAGS来决定哪些应用包会编译进系统如果用户不指定LOCAL_MODULE_TAGS默认它的值是user。
此外用户可以通过buildspec.mk来指定你需要编译进系统的模块。
用户也可以通过mm来编译指定模块或者通过makeclean-module_name来删除指定模块。
??系统生成类这主要指的是build/core/Makefile这个文件它定义了生成各种img的方式包括ramdisk.imguserdata.imgsystem.imgupdate.ziprecover.img等。
我们可以看看这些img都是如何生成的对应着我们常用的几个makegoals。
在实际的过程中我们也可以自己编辑out目录下的生成文件然后手工打包相应生成相应的img最常用的是加入一些需要集成进的prebuiltfile。
所有的Makefile都通过build/core/main.mk这个文件组织在一起它定义了一个默认goalsdroid当我们在TOP目录下敲Make实际上就等同于我们执行makedroid。
当Makeinclude所有的文件完成对所有make文件的解析以后就会寻找生成droid的规则依次生成它的依赖直到所有满足的模块被编译好然后使用相应的工具打包成相应的img。
Android编译大全六6.2.makefile文件控制整个
android系统编译的make文件。
其内容如下DONOTEDITTHISFILEincludebuild/core/main.mkDONOTEDITTHISFILE可以看出实际上控制编译的文件是build/core/main.mk6.3.Make命令??makedroid等同于make命令。
droid是默认的目标名称。
??makeallmakeall将make所有makedroid会编译的项目。
同时将编译LOCAL_MODULE_TAGS定义的不包括androidtag的模块。
这将确保所有的在代码树里面同时有
Android.mk文件的模块。
??clean-LOCAL_MODULE和clean-LOCAL_PACKAGE_NAME删除某个模块的目标文件。
例如clean-libutils将删除所有的libutils.so以及和它相关的中间文件clean-Home将删除Home应用。
??makeclean删除本次配置所编译输出的结果文件。
类似于rm–rf./out/ltconfigurationgt??makeclobber删除所有配置所编译输出的结果文件。
类似于rm–rf./out/??makedatacleanmakedatacleandeletescontentsofthedatadirectoryinsidethecurrentcombodirectory.Thisisespeciallyusefulonthesimulatorandemulatorwherethepersistentdataremainspresentbetweenbuilds.??makeshowcommands在编译的时候显示脚本的命令而不是显示编译的简报。
用于调试脚本。
??makeLOCAL_MODULE编译一个单独得模块需要有
Android.mk文件存在。
??maketargets将输出所有拟可以编译的模块名称列表。
注还有一些命令从make文件里面应该可以找到。
本文不做探讨。
6.4.build/core/config.mkconfig.mk文件的主要内容如下??头文件的定义各种include文件夹的设定在定义头文件的部分还include了pathmap.mk如下includeBUILD_SYSTEM/pathmap.mk该文件设置include目录和frameworks/base下子目录等的信息。
??编译系统内部mk文件的定义ltBuildsysteminternalfilesgt??设定通用的名称ltSetcommonvaluesgt??Include必要的子配置文件ltIncludesub-configurationfilesgtnbuildspec.mknenvsetup.mknBoardConfig.mkn/combo/select.mkn/combo/javac.mk??检查BUILD_ENV_SEQUENCE_NUMBER版本号Inordertomakeeasierforpeoplewhenthebuildsystemchangeswhenitisnecessarytomakechangestobuildspec.mkortoreruntheenvironmentsetupscriptstheycontainaversionnumberinthevariableBUILD_ENV_SEQUENCE_NUMBER.Ifthisvariabledoesnotmatchwhatthebuildsystemexpectsitfailsprintinganerrormessageexplainingwhathappened.Ifyoumakeachangethatrequiresanupdateyouneedtoupdatetwoplacessothismessagewillbeprinted.·Inconfig/envsetup.makeincrementtheCORRECT_BUILD_ENV_SEQUENCE_NUMBERdefinition.·Inbuildspec.mk.defaultupdatetheBUILD_ENV_SEQUENCE_DUMBERdefinitiontomatchtheoneinconfig/envsetup.makeThescriptsautomaticallygetthevaluefromthebuildsystemsotheywilltriggerthewarningaswell.??设置常用工具的常量ltGenerictools.gt??设置目标选项ltSetupfinaloptions.gt??遍历并设置SDK版本
Android编译大全七6.5.buildspec.mk默认情况下buildspec.mk文件是不存在的表示使用的多少默认选项。
Android只提供了buildspec.mk文件的模板文件build/buildspec.mk.default。
如果需要使用buildspec.mk文件请将该文件拷贝到ltsrcDirgt根目录下面并命名为buildspec.mk。
同时需要将模板文件里面的一些必要的配置项启用或者修改为你所需要的目标选项。
buildspec.mk文件主要配置下面的选项??TARGET_PRODUCT设置编译之后的目标产品类型可以设置的值在build/target/product/中定义。
比如product目录下有下面几个mk文件??AndroidProducts.mk??core.mk??full.mk??generic.mk??languages_full.mk??languages_small.mk??sdk.mk??sim.mk那么在这里可以设置的值就为上面几个mk文件的前缀名称generic等。
??TARGET_BUILD_VARIANT设置image的类型包括三个选项user、userdebug、eng。
usr出厂时候面向用户的imageuserdebug打开了一些debug选项的imageeng为了开发而包含了很多工具的image??CUSTOM_MODULES设置额外的总是会被安装到系统的模块这里设置的模块名称采用的是简单目标名比如Browser或者MyApp等。
这些名字在LOCAL_MODULE或者在LOCAL_PACKAGE_NAME里面定义的。
LOCAL_MODULEisthenameofwhatssupposedtobegeneratedfromyourAndroid.mk.ForexmampleforlibkjstheLOCAL_MODULEisquotlibkjsquotthebuildsystemaddstheappropriatesuffix--.so.dylib.dll.ForappmodulesuseLOCAL_PACKAGE_NAMEinsteadofLOCAL_MODULE.Wereplanningonswitchingtoantfortheappssothismightbecomemoot.??TARGET_SIMULATOR设置是否要编译成simul.
上一篇:
Android通话拦截和强插应用研究
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计