android源码下载编译-基于MAC Android 8.1源码下载编译阅读

我学习Android已经很长时间了,但是我总觉得我不太懂android的源码,因为我仔细阅读了相关书籍,对遇到的一些问题分析了源码,但我仍然认为对于Android底层代码的实现有一个半解。 很多时候,我都是处于代码开发的状态,遇到问题就去微软百度。 我对Android的整体系统还没有比较详细的了解,所以这需要一个后期的学习过程。 加强源码阅读和理解。 基于目前大部分源码都是通读的,我个人感觉似乎很容易找到,但不利于整体阅读,而且代码跳转感觉很不方便。 因此,参考官网和相关网上经验,记录下载Android源码时遇到的问题。

1.下载并编译Android源码

该过程将不再详细描述。 网上有很多官方网站和其他经验。 在这里,我简单列出一些我读过的网页。 基本上,您可以按照上述步骤下载并安装它们:

官方网站:

清华大学开源软件镜像站:(推荐给无法翻墙的朋友)

在Mac 10.12上编译Android源代码:

这篇文章虽然和官网上的步骤类似,但是是串联讲解的。 遇到的问题基本上都是在mac上下载编译的时候遇到的,所以基本都是按照这一步来的,但是也可能会遇到你没有遇到过的问题。

Android源码、内核编译:

以上文章可以对比阅读。 步骤基本相同。 如果你可以尝试去官方网站,介绍和解释都比较详细。

2、遇到的问题

这部分是我要写的主要内容。 帮我记录一下Android源码、下载、编译中遇到的问题,以便我和其他同事遇到此类问题时可以快速解决。

首先先复制几个网址,针对别人遇到的问题给出解决方案。 有我遇到的问题和我没有遇到的问题。 我将详细列出我遇到的问题。 如果您遇到其他问题,可以参考此网页进行参考。

其中,我遇到的具体问题有:

1、使用移动硬盘下载编译。

对于刚使用Mac一段时间的我来说,Mac给日常开发带来了很好的体验,而且它的硬盘存储空间比较小,所以不忍心把源码下载到本地硬盘,所以我打算使用移动硬盘进行开发。 要扩展,请将源代码下载到其中。 在这个过程中,遇到了两个问题:

(1)使用的移动硬盘是NFTS格式的,所以Mac只能读取,不能写入。 后来在网上找到了一个免费软件Mounty,参考网页:

(2)解决了Mac上写入移动硬盘的问题后,按照官网下载步骤说明一下费用,因为Mac默认文件系统是不区分大小写的,所以需要创建一个文件系统来support case,所以需要新建一个 dmg ,将官网给出的命令行新建镜像位置移到~(通常是User/用户名)文件目录下,所以需要更改文件位置。 具体步骤如下:

注意创建的文件可能是android.dmg.sparseimage,所以挂载时要具体。

(3)因为移动硬盘有时需要拔掉电源,所以希望硬盘挂载后可以手动挂载镜像,或者直接运行一个shell脚本来运行比较简单,学习下代码并上传它。

2.安装过时的Gnupg

执行命令 POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg 时,出现以下错误:

Error: gnupg has been deprecated. If you absolutely want to stay on the classic version, install the gnupg1 port. All other users are recommended to install gnupg2.
Error: Failed to configure gnupg: obsolete port
Error: See /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_mail_gnupg/gnupg/main.log for details.
Error: Follow https://guide.macports.org/#project.tickets to report a bug.
Error: Processing of port gnupg failed

由于gnupg早已过时,如果你想继续使用gnupg,请下载gnupg1; Error中建议你使用gnupg2,我使用gnupg2。 您需要先关闭gnupg1的端口。

POSIXLY_CORRECT=1 sudo port uninstall gnupg1
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg2

参考网页:

3.RPC失败; curl 18 传输已关闭,剩余未完成的读取数据

这个错误参考了网页: ,我采用了上面提到的第一种形式解决了。

4.分配的dmg空间不足

创建dmg文件时,官网强调至少25g,有的创建50g。 我将 dmg 大小设置为 80g。 后来发现空间不足,需要重新分配大小。 命令:

hdiutil resize -size g ./android.dmg.sparseimage

其实我觉得可以分配大一些,因为dmg只是限制你的最大空间,不会直接占用硬盘空间。

5.缺少对应的MacOsX sdk

internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12"]
ninja: build stopped: subcommand failed.
20:37:11 soong bootstrap failed with: exit status 1
make: *** [run_soong_ui] Error 1

这个问题网上也有报道,通常发生在 make clobber 命令之后。 这些问题的具体网页是:,但是我执行的时候并没有出现这种情况。 命令运行正常,但是我make的时候报这个错误 根据网上的解决方案,解决办法应该有两种:一是下载需要的MacOsX sdk,二是更改源码目录/build/core/combo /mac_version.mk文件并修改所需的mac环境,如下:

无论选项一还是选项二,需要解决的问题是MacOsX sdk的位置及其当前版本确认。 它位于 Xcode 安装目录中。 看来一般都是内置的。 我没有考虑。 有一些是我自己在网上安装的,所以目录一般在Application目录下。 有关详细信息android源码下载编译,请参阅此问题链接,但我的 Xcode 目录不在其中。 它所指的位置,但是它安装的目录可以通过命令 xcode-select -p 找到。 找到安装的目录后,发现我的版本是sdk 10.13,但是我需要的是10.10 10.11 10.12,所以最简单的方法是使用选项2,直接更改mac_version.mk文件,但我不能在哪个目录下找到。 ,网上没有遇到这个问题,所以只能等以后有时间再了解一下那里的改动,所以我采用第一种解决方案,下载一个10.12版本,解压放到那个目录下,记住到 sudoandroid源码下载编译,但是放进去之后好像不起作用,因为检查它的权限,多了一个@,可以通过下面的命令行清除:

xattr -c -r *

参考网页:

6. 错误:由于获取错误而退出同步

对于这个问题,网上有不同的解决方案。 目前解决的办法是使用命令:

回购同步-j8

7. bison无法正常使用

[  0% 310/89583] //external/selinux/ch...eckpolicy yacc policy_parse.y [darwin
FAILED: out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h 
BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d  --defines=out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.h -o out/soong/.intermediates/external/selinux/checkpolicy/checkpolicy/darwin_x86_64/gen/yacc/external/selinux/checkpolicy/policy_parse.c external/selinux/checkpolicy/policy_parse.y
[  0% 317/89583] //system/core/bootstat:bootstat clang++ bootstat.cpp
ninja: build stopped: subcommand failed.
12:58:42 ninja failed with: exit status 1

找到了这个问题,在这个网页上对一些7.1和8.1编译错误进行了解释,解决方案引用在这里:这个错误是由于bison没有正常使用引起的。可以使用

./prebuilts/misc/darwin-x86/bison/bison

检查源代码中的 bison 是否正常工作。

网上有一些国外的复制粘贴解决方案,但我没打通。 以下是我在微软找到的解决方案:

1.找到源码中的external/bison文件夹

cd external/bison

2.在文件夹中创建一个文本文件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] = '';

3.在控制台执行(确保当前目录为external/bison)

patch -p0 < patch-high-sierra.patch  

4.返回根目录

cd ../..  

5. 编译野牛

make bison

6.将bison复制到AOSP中,编译时找到bison的位置

cp ./out/host/darwin-x86/obj/EXECUTABLES/bison_intermediates/bison ./prebuilts/misc/darwin-x86/bison/bison 

经过我自己的验证,7.1之后的所有版本都需要用这个来解决bison失败的问题,至少现在还是这样。 对于报告的类似错误,您可以尝试此方法。

8. 使用 Jack 构建:out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex

失败:/bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp

超出 GC 开销限制

尝试使用 java 选项“-Xmx”增加堆大小

警告:这可能会产生部分或损坏的输出。

ninja:构建停止:子命令失败。

参考网页:

通过更改jack-admin文件并设置Xmx,最好设置得大一点。 网页上给出2048的时候总会出现这个错误,所以有些网页最好设置一半显存。

9、编译成功后,使用模拟器启动模拟器,可以正常启动,但是模拟器弹窗提示System UI没有响应。

这个问题可以参考:Process system isn'tresponding in android emulator,后来发现这个问题主要是在模拟器刚启动的时候会弹出,过一段时间就OK了。

10.将Android源代码导出到Intellij IDEA时,找不到某些引用(如com.android.internal.R),并且某些类重复定义。

将源码导出到Intellij,大家可以参考一下,其实基本上按照这几个步骤,应该不会有问题,但是我遇到了三个问题:

(1)导入代码后,发现源代码目录下的各个子目录中的src目录不在Idea中,但是通过移位两次可以找到对应的类。 单击项目栏中的位置,该位置没有响应。 对于这个问题,把原来的moudle去掉,然后重新make,运行sh,然后添加android.iml,所有代码就会导出到Idea中。

(2)按照参考步骤导入同步后,发现com.android.internal.R无法识别,部分代码如Activity代码有错误提示。 其实只要看源码应该是没有问题的。 也可以从源码中找到对应的位置,但是这个问题依然困扰着我,总感觉不舒服,所以花了三天时间才解决(主要是每次同步时间太长),一开始是依赖问题,了解了Idea中的设置,依靠配置还是没用的。 后来发现其他类都做成了类图标,即这个类是java图标。 当我点击具体的R文件时,出现提示:文件大小超过配置的限制,我突然意识到原来的想法设置问题,导致文件太大而无法编译。 后来作为参考,在idea中设置idea.max.intellisense.filesize=9999的值,单位是KB,然后就可以找到了。

(3)有些类是重复定义的,比如Acitivty等,其实参考教程中,一步就是把依赖的所有依赖删除,只留下jdk。 我感觉这两个问题很相似。 事实上,很多都是在编译过程中生成的。 jar文件等,会导致依赖和源码都有对应的类,所以重复定义。 我遇到的问题是,我已经按照参考步骤去掉了依赖,但是还是发现有重复定义的类。 遇到此类问题的时候,看提示看一下重复定义的位置,然后去哪个文件目录下查找,发现它被标记为源根(参考:http://blog.sina.com.cn/s/2017/12/17/14/14/14/14/14/14/17/17/14/receiver-root/),比如我的问题是Activity类是在out的一个子目录中,找到该目录,发现它被标记为

(源根目录),右键,选择取消标记源根目录,然后重新编译。

基本上下载、编译、导入遇到的问题就是这些。 调试可以参考这两篇文章。

注:写的可能比较乱,以后有时间我会继续整理。 希望对其他同事有所帮助。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 android源码下载编译-基于MAC Android 8.1源码下载编译阅读 https://www.wkzy.net/game/171501.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务