对于源码下载、编译、阅读,小编建议用 Mac 或 Linux 系统,官方推荐的是 Ubuntu 这样你会省去很多麻烦。同时,根据系统版本,建议针对性的下载,比如小编的 Mac 是 Big Sur 11.2.3 Intel,小编确想编译 Android 8.0 的源码。事实证明小编太年轻了,被教育了,各种问题,如果有人买的是 M1 芯片的,直接更简单,暂不支持 arm64。而且网上有用资源有限,所以如果电脑不是特别老的,没有对版本那么有要求的,直接下最新的源码把,这样出问题的概率比较小。
科大的镜像不好用,亲测的。建议磁盘分配大小为200G,不然会不够用。
Google Java编码规范
Android 源码资源官网
国内镜像教程
官方教程
官方编译教程
刘望舒编译教程
CMake 教程
android-building 论坛
repo sync -f –j10
sync -f
: revision refs/tags/android-8.1.0_r1 in platform/art not found是因为初始化是写错的了版本号
删除重新 init rm -rf .repo/manifest*
https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
打开repo文件fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
关闭所有代理软件
build/core/config.mk:663: error: Error: could not find jdk tools.jar at /usr/local/Cellar/openjdk/13.0.1+9/libexec/openjdk.jdk/Contents/Home/bin/../lib/tools.jar, please check if your JDK was installed correctly.
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH
cd external/bison
touch patch-high-sierra.patch
vim patch-high-sierra.patch
With format string strictness, High Sierra also enforces that %n isn't used
in dynamic format strings, but we should just disable its use on darwin in
general.
--- lib/vasnprintf.c.orig 2017-06-22 15:19:15.000000000 -0700
+++ lib/vasnprintf.c 2017-06-22 15:20:20.000000000 -0700
@@ -4869,7 +4869,7 @@ VASNPRINTF (DCHAR_T *resultbuf, size_t *
#endif
*fbp = dp->conversion;
#if USE_SNPRINTF
-# if !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
+# if !defined(__APPLE__) && !(((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined __UCLIBC__) || ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__))
fbp[1] = '%';
fbp[2] = 'n';
fbp[3] = '\0';
patch -p0 < patch-high-sierra.patch
mm
cp ./out/host/darwin-x86/obj/EXECUTABLES/bison_intermediates/bison ./prebuilts/misc/darwin-x86/bison/bison
setopt shwordsplit
# 去除所有本地化的设置,让命令能正确执行
export LC_ALL=C
由于 系统、SDK 版本不同,将编译代码的版本改成当前系统的版本会出现 一系列 bug ,所以我们可以下载想要的 SDK 版本加入系统中。需要注意的是,源码版本过老也会出现很多问题
MacOS SDK 下载地址
下载文件中所列最高版本的 SDK包。将解压后的文件夹移到 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
。然后将 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist
将文件中 MinimumSDKVersion
版本号改成所下的版本号即可。
# Xcode中添加的SDK版本
xcodebuild -showsdks
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999
git config --global http.postBuffer 524288000
包括 https 也加一遍
art/build/Android.common.mk
,他这个地方有一个判断,看注释mac os不支持最低4g内存申请在64位进程中。
ifneq ($(HOST_OS),darwin)
ART_HOST_SUPPORTED_ARCH := x86 x86_64
else
# Mac OS doesn't support low-4GB allocation in a 64-bit process. So we won't be able to create
# our heaps.
ART_HOST_SUPPORTED_ARCH := x86_64
ART_MULTILIB_OVERRIDE_host := 64
endif
首先确认磁盘是否已满,如果磁盘满了,重新分配大小即可。如果磁盘可用空间在 10G 以上,那说明是最大文件数的问题(Mac 有最大读取文件数量限制,默认 256)。
sysctl -w kern.maxfiles=1048600
sysctl -w kern.maxfilesperproc=1048576
ulimit -n 4096
如果设置的数量过大,会报错。
注意:这么修改只针对当前 Shell 有效,关闭后设置会失效
external/python/cpython2/Modules/getpath.c:414:50: error: incompatible pointer types passing 'unsigned long *' to parameter of type 'uint32_t *' (aka 'unsigned int *') [-Werror,-Wincompatible-pointer-types]
else if(0 == _NSGetExecutablePath(progpath, &nsexeclength) && progpath[0] == SEP)
^~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/mach-o/dyld.h:98:54: note: passing argument to parameter 'bufsize' here
extern int _NSGetExecutablePath(char* buf, uint32_t* bufsize)
external/python/cpython2/Modules/getpath.c 找到下面代码
#ifdef __APPLE__
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
uint32_t nsexeclength = MAXPATHLEN;
#else
unsigned long nsexeclength = MAXPATHLEN;
#endif
#endif
替换成
#ifdef __APPLE__
uint32_t nsexeclength = MAXPATHLEN;
#endif
如果是 cpython3报错,external/python/cpython3/Modules/getpath.c 找到下面代码
#ifdef __APPLE__
char execpath[MAXPATHLEN + 1];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1;
#else
unsigned long nsexeclength = Py_ARRAY_LENGTH(execpath) - 1;
#endif
#endif
替换成
#ifdef __APPLE__
char execpath[MAXPATHLEN + 1];
uint32_t nsexeclength = Py_ARRAY_LENGTH(execpath) - 1;
#endif
建议 repo sync
之前先 ping 一下这个网址,目前只在 Mac 上发现 ping 不通,应该是 DNS 解析找不到或者不在同一个服务器上。所以最简单的办法就是增加 hosts。
sudo vi /private/etc/hosts
IP地址 https://mirrors.tuna.tsinghua.edu.cn
dscacheutil -flushcache
清除 DNS 缓存brew install xz
系统的 curl 版本是带 SecureTransport,而编译源码需要的是 OpenSSL 版本的。具体可以执行 curl --version
来进行查看。
curl 下载地址
查看本地 OpenSSL 版本,这个每个人版本不同,具体可以到相应的目录看一下。
ls /usr/local/Cellar/[email protected]/
下载好 curl 后,进行解压并进入目录,执行下面代码。
./configure --prefix=/usr/local/curl --with-ssl=ls /usr/local/Cellar/[email protected]/1.1.1k
make
make install
接着添加环境变量到 .zshrc 文件中。
export PATH="/usr/local/curl/bin:$PATH"
重启命令行查看 curl 版本,看看是否是 OpenSSL 版本的。