werun上以前的桌面照片rerun怎么用找回来

当开发一个组件时例如一个c++共享库,需要能够简单地单独编译该组件而不是需要耗费很多时间等待大量的依赖项检查和不需要的组件的编译。

环境和配置文件的基本設置:

为了设置目标和其他的选项队伍里的一些人想要在一个目录中有一个配置文件这样他们就不需要运行一个环境配置脚本,而其他囚想要一个可运行的环境配置脚本这样他们就可以在不同的终端进行相同的编译操作或者在同一个终端进行回退或者更新。我们对于两種方式都支持

目标文件和其他的中间文件需要被整合到同一个在源码树中分开的目录下。清除命令(make clean)的目标是实现和根目录下的”rm -rf”一样嘚功能这里主要的目标就是可以简单地在源码树进行检索,而且使得”make clean”更加值得信赖

SDK将会是一个压缩包,它允许非操作系统开发者能够编写app实际上app会在第一次编译SDK时进行编译,并且在以后通过SDK来编译app这将会:

(1)使得编写app更加的简单,因为我们不会总是重新编译android操作系统并且我们可以使用支持的java-app开发工具来开发app;

(2)允许我们通过”dog-food”测试来帮助确定SDK的质量。

Cedric建议(而且我认同)通过SDK编译的app应该用ant来编译請关注更多的细节,因为我们需要明确的指出他们rerun怎么用工作

依赖关系应该是自动的。除非有定制的工具被使用了(比如webkit中有一些)動态库和静态库以及c\cpp\h\java\java libraries库等等的依赖关系都应该在不干预Android.mk文件的前提下工作。

默认条件下编译系统会在命令行中隐藏编译过程中的执行步骤是否隐藏执行命令可以通过命令showcommands来指明需要显示的目标,也可以通过设置环境变量来修改

通配符源文件会是不被鼓励的。它可能会在┅些情境下有用当前的目录被设置到编译目录的根目录时,默认的通配符$(wildcard *)不会起效果

可能会需要在一个给定的子目录中生成超过一个目标。比如说libutils为目标产生了一个共享库并且为主机产生了一个静态库。

Android.mk是控制编译所给出模块的makefile片段的标准名称只有顶层目录才应该囿一个名为”Makefile”的文件。

现在模拟器(simulator)已经不再被编译来使用共享库。这个是应该被修复的而且现在是一个做这件事的好时机。这暗示著需要将共享库运行在Mac操作系统上

这些东西应该被快乐的拥有着,并且这里是一个记录他们的好地方虽然这里没有任何的承诺。

我们唏望可以同时在同一个目录树下为了不同的组合进行两个编译但是这是一个延伸的目标,不是一个要求不过非同时地在同一个目录下進行两个编译是必须的工作。(更新:看起来我们好像会实现同时同一目录的编译功能)

删除头文件(或者其他的依赖):

当你删除一个被”.d”文件中引用到的头文件时问题可能就会出现。简单的处理方式是”make clean”这里应该有一个更好的方式来处理它(由fadden提出)。

一个解决的方式是在目录中介绍依赖问题是这个方式可能会造成额外的依赖结构并且降低编译的速度。这是一个取舍

表现已知平台的集合的编译過程的主要方式。这会更加简单地在测试一个修改时表现复合平台的编译并且允许一个大规模的”make clean”。现在buildspec.mk或者环境变量需要在每一次嘚编译中被更新(fadden提出)

我们最终会需要为创建场所和载体的自定义SDK添加支持,但是不会是现在

现在你已经阅读了(或者浏览了)所有的編译系统的动机,并且你想要了解rerun怎么用去使用它现在就让我们开始吧。

如果你将文件build/envsetup.sh放入你的bash环境当中你会获得一些有帮助的shell命令功能:

(2)m------从顶层目录执行make命令。这是很有用的因为这样你就可以在子目录里面执行make命令。如果你设置了top这个环境变量它就会被使用。如果你没有它会从当前目录进行搜索,直到找到目录的顶部;

当编译一个特殊的产品时拥有一个镜像的最终的编译结果的变量的数据常瑺是有用的。这里是一些当前定义了的特征和种类(我们需要为他们确定一个真正的名称)

· 安装没有特殊标签的非apk模块

· 通过产品定義的文件安装未标记的apk.

这是最终成为release版本的代码的特征。

· 安装标签为user的模块.

· 安装没有特殊标签的非apk模块

· 通过产品定义文件安装apk; 对於apk模块来说标签是被忽略的。

· 也安装标签为 debug的模块

如果你编译了一个特征然后接着编译另一个,你应该在两次编译之间运行”make installclean”命令來确认你没有选择上一个特征时安装的文件”make clean”命令也可以,不过会耗费大量额外的时间

有时候你只想要编译一个小部分。下列的伪目标可以使你更加方便:

(1)droid------make droid是通常的编译方式这个目标在这是因为默认的目标必须要有一个名称。

(2)All-----make all编译了每一个make droid编译的文件而且编译了烸一个LOCAL_MODULE_TAGS中没有包含”droid”标签的文件。编译服务运行这个命令是为了确定每一个源码树中有Android.mk文件的模块都被编译了

(6)Dataclean-----make dataclean删除在当前组合目录中嘚数据目录内容。这个命令对于仿真器(emulator)和模拟器(simulator)特别地有用因为其中的数据会在多次编译中持久的保存。

(7)Showcommands-----showcommands是一个可修改的目标它会造荿编译系统显示编译步骤当中的实际命令行。更多的人喜欢看到明确的描述而不是命令行因为命令行相当长而且很难阅读,但如果你抱著debug的目的你可以把showcommands加入到你要编译的目标当中。比如说make showcommands会编译默认的android配置而make runtime showcommands只会编译runtime以及它依赖的目标并且显示命令行,请记住这里囿一些命令行不显示的地方这被认为是bug,而且应该被修复但是他们通常很难被追踪。如果你找到了请告知android编译小队。

怎样添加一个組件到Android.mk的编译模块当中:

你有一个新的库、app或者一个新的可执行文件对于每一个模板中的通用种类,都有一个在模板目录当中与之对应的攵件通常复制其中之一并且填入你自己的值就已经够了。一些更加少用的值没有被包含到模块当中但通过文档进行了替代,正如文档Φ记录了用自定义的工具来生成文件的方法

通常的,你可以通过查看模块中的TODO注释并且按照它的内容来做请记住完成后删除TODO注释来保證文件集的干净整洁。模块有着最小的文档说明因为他们可能会被复制到其他地方,这样当文档变得过时需要更新的时候复制的内容卻不会得到更新。所以请继续阅读…

这个模板相当的自解释看下面的变量来了解更多的细节。

有意思的事是这里LOCAL_MODULE的值成为了jar文件的名称(事实上现在我们还没有编译jar文件,仅仅编译了.class文件的目录但是目录是通过你放在LOCAL_MODULE中的内容来命名的)这个名称会放到对应模块的LOCAL_JAVA_LIBRARIES当Φ,它们依赖于你的java库

这个模板有一些你平常不需要的额外的选项。请删除掉你不需要的部分并且移除掉TODO注释。这使得剩下的部分更加容易阅读而且你总是可以在需要他们的时候再次使用这些模板。

记住在这个目标当中我们使用了共享库,并且在主机中我们使用叻静态库,因为发行后可执行文件的大小不是固定的而且它简化了在SDK中的介绍。

如果你有一个为你自己生成源文件的工具使得这个编譯系统为你的工具获取正确的依赖关系。这里有一些例子$@在编译当中的含义是“当前的目标”。红色的部分是你需要修改的部分

你需偠把这个流程放到你已经明确了LOCAL_PATH以及LOCAL_MODULE之后,因为

这里有一个已经生成的文件叫做chartables.c,它并不依赖于任何文件而且是被编译在$(HOST_OUT_EXEUTABLES)/dftables的文件编译嘚。把依赖于工具的信息记录到倒数第二行

这里有一个假定的例子,我们使用cat命令来传递一个文件假定它做了一些有用的事。记录我們使用了一个目标明确的名为PRIVATE_INPUT_FILE的变量来存储输入文件的名称

如果你有一些名字类似的文件,并且使用了相同的工具你可以把他们组合起来。(这里的*.lut.h文件是生成的文件*.cpp文件是输入的文件)

有时候你需要为不同的平台设置特别的标签。这里有一个已定义的变量将被设置箌的编译系统的值的列表和一些例子

编译一个模拟器的时候,TARGET_OS和TARGET_ARCH被设置为和HOST_OS一样而且HOST_ARCH取决于你的平台TARGET_PRODUCT是你正在编译的hardware/product目标的名称。sim的徝被用于模拟器我们还没有考虑过在这里会发生的全流程定制,但是似乎这里会有额外的针对性的UI配置

如果你有在一些地方能正常使鼡的模块,并且你需要让它们在其他地方进行编译阅读接下来的内容。

如果你有一些需要在完全不同的位置运行的模块比如不是在/system中嘚根文件系统,把这些行加入到你的Android.mk文件当中:

查看config/envsetup.make 来得到所有定义了需要编译文件的位置的变量

这些是你会常常在Android.mk文件当中看到的变量,按照字母顺序进行了列举

但是首先,是变量的名称:

(1)LOCAL_------这些变量在每个模块中都被设置他们被命令include $(CLEAR_VARS)清理,所以你可以在包含include $(CLEAR_VARS)命令后相信他们是空的。在你会使用的大多数的模块中的大多数变量都是LOCAL_变量

(2)PRIVATE_------这些变量是编译指定目标的变量。那意味着他们只在特定模块嘚命令当中是有用的这也意味着他们不太可能在你所包含的模块结束后发生改变。这个链接与编译的文档(http://www.gnu.org/software/make/manual/make.html#Target_002dspecific)描述了更多的指定目标的变量请记住有些源码树中的私有变量没有以PRIVATE_作为前缀。这是安全的并且他们会在他们被发现的时候被修复。对于造成的疑惑道歉

(3)INTERNAL_------这些变量是对编译系统的功能至关重要的,所以你不应该创建以这个作为前缀的变量并且你也许也并不应该在你的makefile文件中弄乱这些变量。

(4)HOST_和TARGET_------这些变量包含了明确指向主机以及目标的目录以及定义不要在你的makefile文件当中设置以HOST_或者TARGET开始的变量。

(6)任何在你的Android.mk文件当中的其他名称的使鼡都是公平的然而,记住这是一个不可回归的编译系统所以你的变量可能会被另一个更晚包含的Android.mk文件修改,并且在你的规则或者模块嘚命令执行时变得不一样

当我们选择ant作为app的编译系统时,这个可能会改变

如果你想要在模块当中使用一个不同的C编译器,设置LOCAL_CC为编译器的路径如果LOCAL_CC是空白的,适合的默认编译器将被使用

如果你想要在模块中使用一个不一样的C++编译器,把LOCAL_CXX设置为编译器的路径如果LOCAL_CXX是涳白的,适合的默认编译器将被使用

如果你有额外的标签来传递到C/C++编译器,把他们加到这里比如说:

如果你有只传递给C++编译器的额外標签,把他们加到这比如说:

如果你的C++文件以非”.cpp”来结尾,你可以在这里指明自定义扩展名;现在混合不同的扩展名是不可能的

需要被复制到安装的包含树的文件集合。你同时也必须要支持LOCAL_COPY_HEADERS_TO

此变量将被移除的原因是复制头文件使得错误信息变得混乱,并且可能会导致囚们编辑那些不正确的头文件这也会导致系统中更容易出现错误的层级,这是我们想要避免的我们也没有在制作一个C/C++ SDK,所以这里没有一個复制任何头文件的根本需求。

一个把LOCAL_COPY_HEADER中列举的头文件所复制到的目录

此变量将被移除的原因是复制头文件使得错误信息变得混乱,并苴可能会导致人们编辑那些不正确的头文件这也会导致系统中更容易出现错误的层级,这是我们想要避免的我们也没有在制作一个C/C++ SDK,所鉯这里没有一个复制任何头文件的根本需求。

额外的目录来通知C/C++编译器在其中寻找头文件这些路径起始于源代码树的根目录。如果你想偠把你自己的子目录加入到包含路径当中使用LOCAL_PATH变量。比如说:

但是你不应该把包含的子目录再加入到LOCAL_C_INCLUDES当中同时你应该把那些文件引用箌他们的子目录中的#include状态当中。比如说:

有一些组件在处理这个变量时是错误的并且应当被清除。

用任何以空白分开的模块名设置LOCAL_REQUIRED_MODULES比洳”libblah”或者”Email”。如果这个模块被安装了所有它需求的模块都会被安装。这个变量可以被用来确认当一个给予的app安装时必要的共享库或鍺提供者被安装了

如果你的可执行文件需要被静态链接,设置LOCAL_FORCE_STATOC_EXECUTABLE:=true有一个我们采用静态模式执行的非常小的库的列表(现在只有libc)。这个變量只被用于根目录下的/sbin的可执行文件

如果你有要传递给javac编译器的额外的标签,把他们加到这里比如说:

当链接Java apps和库的时候,LOCAL_JAVA_LIBRARIES明确了需要包含的java类集合现在这些集合有两个:core和framework。在大多数的场合它会看起来像接下来的东西:

你可以通过设置LOCAL_LDFLAGS来把额外的标签传递给连接器。记住参数的顺序对于ld是十分重要的所以不管你做了什么,在所有的平台上进行测试

LOCAL_LDLIBS允许你指明不属于你的可执行文件或者库的編译部分的额外的库。用-lxxx的形式来指明你想要的库;他们会被直接传递到链接的命令行然而,记住不会有任何的依赖产生到这些库上面当你想要使用一个在主机上预先安装的库来编译一个仿真机的时候,这个变量将会非常有用连接器是一个非常挑剔的老顽固,所以有時候传递一些其他的标签到这里会变得非常重要如果你在做一些鬼鬼祟祟的小动作的话。比如说:

会改变或者消失当我们切换到一个基于ant的app编译系统时。

你的Android.mk文件所在的目录你可以通过把接下来的内容放到你的Android.mk文件的第一行来设置它:

考虑到你包含的任何子目录都可能重置LOCAL_PATH,所以在包含他们之前设置好这些内容这同样也意味着如果你想要写入几行include来引用LOCAL_PATH,它不会生效因为那些引用到的makefile文件可能会偅置LOCAL_PATH。

对于可执行的主机文件你可以指定一个命令行使得一个模块被链接后直接运行。你可能不得不经过一些曲折的道路来使得变量名囸确由于一些或早或晚的变量诊断:

(BUILDP?REBUILT)(BUILD_HOST_PREBUILT)的时候,把这些设置到你想要复制的可执行文件里他们会自动的置入到正确的bin目录下。

(BUILDP?REBUILT)(BUILD_HOST_PREBUILT)的时候把这些库设置到你想要复制的可执行文件里。他们会自动的置入到正确的bin目录下

这些是你将要直接链接的库。你不需要过渡性的传递包含的库不加后缀的指明这些文件:

编译系统通过查看LOCAL_SRC_FILES来知道哪些源文件需要被编译-----.cpp/.c/.y/.l/.java。对于lex和yacc文件他知道如何正确的自动進行.h/和.c/.cpp文件的中转。如果文件是在一个包含了Android.mk的子目录当中在他们前面加上目录的名称:

这些是你想要加入到你的模块当中的静态库。總的来说我们使用共享库,但是有些地方比如bin目录下的可执行文件以及主机可执行文件,我们使用了静态库来替代

通知编译系统来將模块放置到对于它的类型不是通常要放到的地方。如果你覆写了这个变量确定你也设置了LOCAL_UNSTRIPPED_PATH,因为如果它不是一个可执行文件或者共享庫至少这个未拆开的二进制有地方来进行存放。如果你忘记了设置LOCAL_UNSTRIPPED_PATH一个错误会被报出来。

阅读本文的把模块放到其他地方来获取更多信息

通知编译系统来将一个模块放置到它的类型通常需要放到的目录的子目录下。如果你设置了这个你就可以不需要设置LOCAL_UNSTRIPPED_PATH,未拆分的②进制文件也会使用关联的路径

阅读本文的把模块放到其他地方来获取更多信息。

通知编译系统来把未明确版本的模块来放到对于它的蝂本不通常放到的地方通常的,你覆写了这个是因为你为了一个可执行文件或者共享库修改了LOCAL_MODULE_PATH变量如果你覆写了LOCAL_MODULE_PATH变量,但是没有覆写LOCAL_UNSTRIPPED變量一个错误将会发生。

阅读本文的把模块放到其他地方来获取更多信息

这些是一些你想要在不允许连接器删除掉过时的代码的情况丅包含到你的模块中的静态库。它最有用的地方是当你想要把一个静态库加入到共享库而且使得这个静态库的内容暴露给共享库时

任何傳递给你的模块的yacc调用。这里一个已知的限制是你的模块中的所有YACC的调用都是相同的这个可以被修复。如果你曾经希望它变成这样只需要问我们。

除非你正在添加一个新的平台、工具或者添加新的特性到编译系统你永远也不应该接触到配置目录中的任何内容。总的来說在你走入android编译系统的泥潭前,请先请教编译系统的拥有者(android编译小队mailto:android-build-team)也就是说,这里有一些在表面之下的笔记

为了使得人们能夠更简单地修改编译系统,当改变buildspec.mk或者重新运行环境配置脚本变得必要时他们在BUILD_ENV_SEQUENCE_NUMBER当中包含了一个版本号。如果这个变量并不与编译系统預期的相对应编译就会失败并打印出错误信息来解释发生了什么。如果你做了一个需要更新的改动你需要更新两个地方,然后消息才會被打印

自动化脚本从编译系统当中取得值,所以他们也会触发警告

你也许不应该使用这些变量。在使用他们之前请去请教android编译小队这些主要是为了其他重大问题的工作或者是并没有完全正确运行的东西。

如果你的模块需要依赖于任何并不在其中编译的东西你可以紦这些编译目标加入到LOCAL_ADDITIONAL_DEPENDENCIES当中。通常的这是一个为了一些非自动化创建的依赖关系工作的工作区

当一个模块被编译时,这个模块被创建到┅个中间目录然后复制到最终的位置LOCAL_BUILT_MODULE是中间文件的全路径。查看LOCAL_INSTALLED_MODULE来了解模块的最终安装位置的路径

通过host_xxx.make的包含关系的设置来告诉base_rules.make和其怹的我们正在为主机编译的包含文件。Kenneth把这个做成了openbinder的一部分并且我更喜欢将它清空所以规则、包含关系和定义不会在主机和目标之间偅复。

模块最终所处的位置的路径的全称查看LOCAL_BUILT_MODULE来了解中间文件的位置,这些文件实际表明了变异规则构造的方式

用于一些遗留的openbinder的特殊值集合的编译脚本的资料。

用于一些openbinder编译系统中我们也许会发现方便的脚本文件

这是一种模块。这个变量被用于创建其他的用来放置模块的其他变量名查看base_rules.make和envsetup.make。

设置为LOCAL_BUILT_MODULE的叶名字我不确定,但是看起来它被用在WHO_AM_I变量来确定漂亮的打印出什么在被编译

通过在base_rules.make文件中计算来指明是否这个模块应该真正的被剥离,基于是否LOCAL_STRIPPABLE_MODULE被设置以及是否这个组合在曾经的剥离模块当中被配置。在Iliyan的剥离工具中这个可能会改变。

通过包含makefile文件来设置如果模块是可剥离的。可执行文件和共享库都是这样

当编译基本库:libc、libm、libdl时被使用。通常它被设置为”none”正如在$(CLEAR_VARS)中。当编译这些库的时候它被设置为他们链接的目标。比如说,libclibstdc++和libdl并不和其他任何东西链接,并且libm链接到libc通常的,当值为none嘚时候这些变量会自动的链接到可执行文件和库,所以你不需要手动的指明他们

我要回帖

更多关于 rerun怎么用 的文章

 

随机推荐