我喜欢高度了解android构建系统的工作原理。那是什么时候它补充了GNU make和Linux构建系统以及它何时以及如何区别?我的意思是,有时我们使用make文件为最终图像添加功能,有时我们使用Andoroid.mk?然后有时我们同时使用两者。有没有人很好地掌握这些组件如何协同工作?
例如,我只使用make文件将一个简单的程序添加为模块。另一方面,查看/ external目录中的某些模块有Android.mk文件,有些还有make文件。然后是仿生目录。有人可以详细说明吗?
@ arkascha-我很欣赏这一点,但我认为还有一点。在我看来,GNU make可以通过Android文件夹控制Linux内核目录和Android.mk;这听起来直观不是吗?我正在寻找一个评论,可以进一步详细说明需要更新哪些文件以添加功能。即。看着我的构建环境我有:
0628Samsung build.sh Documentation include Makefile packages sound
abi config-backup drivers init Makefile.bak pdk system
AndroidKernel.mk COPYING drivres ipc Makefile-original Platform.tar.gz tools
arch CREDITS dtbTool Kbuild mkbootimg prebuilts usr
art crypto external Kconfig mm README vendor
bin cts files kernel modules.order REPORTING-BUGS virt
bionic dalvik firmware Kernel.tar.gz ndk samples
block developers frameworks lib net scripts
bootable development fs libcore note3 sdk
build device github-repo libnativehelper out security
build_msm8974pro_kernel.sh docs hardware MAINTAINERS output
我问这个问题,因为似乎没有清楚地了解AOSP环境。例如,this链接有一个部分,称为将新程序添加到Android源代码树的步骤。在其中,他们建议更新core / main.mk文件。但我的环境并没有他们提到的那些线条。有时候一个人真的没有选择使用一个,make文件与android.mk,或另一个。至少那是我的经历。也许我错过了什么,但我做的是将示例程序添加到外部目录。我能够使用我用于创建图像和闪存手机的相同工具链进行编译。但是可执行文件没有在我的手机上运行,这让我相信也许我需要发出其他开关并设置各种环境变量。所以我一直在尝试使用包含的程序构建映像,但构建环境没有进入该目录。在浏览了其他目录之后,我意识到他们中的大多数都有一个Android.mk文件,所以我添加了一个,现在它正在匆匆忙忙。我会告诉你结果如何。这就是我提出这个问题的原因。也许我没有找到正确的地方,没有关于如何为最终图像添加功能的明确稳定内容以及每个文件夹中存在的内容之间的区别。有一个高级别的描述,但这里没有讨论如何将模块添加到this / external,/ bionic,......这就是最终结果。
lib_src := src
lib_headers := headers
.PHONY: all $(lib_src) $(lib_headers)
$(lib_src) :
$(MAKE) --directory=$@
$(lib_*): $(MAKE) --directory=$@
obj-$(CONFIG_TOS) += examples.o
所以当你说Android只使用Android.mk时,我想知道。原因是,在这里我只使用了一个make文件,我能够在我的图像中看到生成的代码。此外,我将与您分享另一个例子。在Android Studio项目中,为了获得一些本机项目,您必须创建一个make文件以及一个Android.mk。所以....?必须有更多;没有?每个文件在构建系统中都有一些独特的功能;你不同意吗? 请注意,我只是在努力将我的代码放入最终图像。
我相信我听说/ external目录中的内容只是进入最终图像的/ system文件夹。但我不能证实这一点。这是我的外部目录中的内容:
aac droiddriver hyphenation libpng nist-sip sonivox
android-clat dropbear icu4c libppp noto-fonts speex
android-mock e2fsprogs iproute2 libselinux oauth sqlite
ant-glob easymock ipsec-tools libsepol objenesis srec
antlr ebtables iptables libusb okhttp srtp
apache-harmony eclipse-basebuilder iputils libusb-compat opencv stlport
apache-http eclipse-windowbuilder jack libvorbis openfst strace
apache-qp eigen javasqlite libvpx openssh stressapptest
apache-xml elfutils javassist libxml2 openssl svox
arduino embunit jdiff libxslt open-vcdiff tagsoup
bison emma jhead libyuv oprofile tcpdump
blktrace esd jmdns linux-tools-perf pixman temp
bluetooth expat jmonkeyengine littlemock ppp timezonepicker-support
bouncycastle eyes-free jpeg llvm proguard tinyalsa
brctl fdlibm jsilver lzma protobuf tinycompress
bsdiff flac jsr305 marisa-trie qemu tinyxml
bzip2 freetype junit markdown qemu-pc-bios tinyxml2
ceres-solver fsck_msdos kernel-headers mdnsresponder regex-re2 tremolo
checkpolicy ganymed-ssh2 libcap-ng mesa3d replicaisland v8
chromium gcc-demangle libffi mksh robolectric valgrind
chromium-libpac genext2fs libgsm mockito safe-iop webkit
chromium_org giflib liblzf mockwebserver scrypt webp
chromium-trace google-diff-match-patch libmtp mp4parser sepolicy webrtc
clang grub libnfc-nci mtpd sfntly wpa_supplicant_8
compiler-rt gtest libnfc-nxp naver-fonts shahin xmlwriter
dexmaker guava libnl-headers netcat sil-fonts xmp_toolkit
dhcpcd hamcrest libogg netperf skia yaffs2
dnsmasq harfbuzz libpcap neven smack zlib
doclava harfbuzz_ng libphonenumber nist-pkits smali zxing
这基本上就是我在external / shahin目录中的内容:
sansari@ubuntu:~/WORKING_DIRECTORY/external/shahin$ more Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hello_world.S
LOCAL_MODULE := shahin
include $(BUILD_EXECUTABLE)
sansari@ubuntu:~/WORKING_DIRECTORY/external/shahin$ more hello_world.S
.syntax unified
.global main
main:
push {ip, lr}
ldr r0, =message
bl printf
mov r0, #0 @ Return 0.
pop {ip, pc}
message:
.asciz "Hello, world.\n"
简单的汇编代码和Android.mk文件。但是当我从项目的根目录发出make时,我不确定它是否会添加到最终图像中。我没有看到此目录中创建的任何目标文件。我错了吗?我的问题是如何将其纳入最终图像?
答案 0 :(得分:0)
Android平台构建系统仅使用Android.mk。 external/
目录中有正常的makefile,因为这些项目在Android之外构建时使用make,我们只是镜像它们的源代码。不过,我们只使用Android.mk为Android构建它。
Bionic与Android中的其他项目没有什么不同,它只是有一些更复杂的Android.mk结构来处理CPU特定来源的复杂性以及构建低级系统库所带来的各种问题。
Android.mk仍然只是制作。每个include $(BUILD_*)
都会在build/core
中处理,最终会被重写为正常的制作规则。