学Android也有比较长的一段时间了,但是对于android源码的认识自己总感觉似懂非懂,因为自己也仔细看过相关的书籍、对于遇到过的一些问题也分析过源码,但还是觉得对于Android底层代码的实现存在一只半解,很多时候都处于代码开发、遇到问题再去谷歌百度的状态,没有对Android有个相对细节性的系统整体认识,所以这就需要以后在学习的过程中加强源码阅读和理解。基于目前大多数看源代码都是通过http://androidxref.com/ 看的,个人感觉虽然方便查找,但是不利于整体性阅读,代码跳转感觉特别不方便。因此参考官网和相关网上经验,记录下载Android源代码遇到的问题。
这个过程就不仔细叙述,官网和其他经验网上很多,在此,我就简单列举一些我看过的网页,基本按照上述步骤就可以下载安装完成:
官网:https://source.android.com/setup/
清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ (推荐给不能的同学)
Mac 10.12编译Android源码:https://www.jianshu.com/p/1513fc9e1a74
这篇文章其实跟官网的步骤差不多,但是分系列解释,遇到的问题基本在mac上下载编译都遇到过,所以基本完全按照这个步骤进行,但也可能遇到其所没有遇到的问题。
Android源码、内核编译:https://www.cnblogs.com/palance/p/5187103.html
上面几篇文章可以对比看一下,步骤基本一致,如果可以尽量去官网,介绍和解释都比较详细。
这部分是我要写的主要内容,帮我记录一下在Android源码、下载、编译遇到的问题,方便以后我及其他同学遇到这些问题时能够快速解决。
首先,先复制几个网址,给出其他人遇到的问题的解决方法,其中都有我遇到的问题和没有遇到的问题,针对我遇到的问题后续我会详细列出,如果遇到的其他问题,可以参考这些网页进行借鉴吧。
https://blog.csdn.net/it_liuchengli/article/details/77040806
https://blog.csdn.net/dengjiamingcsu/article/details/79695657
https://blog.csdn.net/yanzi1225627/article/details/69941284
https://blog.csdn.net/h649305597/article/details/80322488
https://blog.csdn.net/txl19881019/article/details/44081865
https://source.android.com/setup/
其中,具体我遇到的问题有:
对于刚使用Mac的不久的我来讲,Mac给日常开发带来很好的体验,然后其硬盘存储空间相对比较小,因此不忍心将源码下载到本地硬盘中,因此准备采用移动硬盘进行扩展,将源码下载进去。在此过程中遇到两个问题:
(1)使用的移动硬盘是NFTS格式,所以对于Mac来讲只能读取, 不能写入,后来在网上找到一个免费软件Mounty,参考网页:https://jingyan.baidu.com/article/a3aad71aa1dde7b1fb0096ab.html
(2)解决了移动硬盘在Mac上写入问题之后,根据官网下载步骤说明支出,因为Mac默认文件系统是不区分大小写的,因此需要创建一个文件系统来支持大小写,因此需要新建一个dmg,官网给出的命令行新建的镜像位置放在~(通常是User/用户名)文件目录下,所以需要修改文件位置,具体步骤如下:
(3)因为移动硬盘有时候需要插拔,所以希望能够在硬盘挂载之后自动就把该镜像挂载,或者更简单直接运行一个shell脚本运行,代码后面学习再上传。
在执行命令 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
参考网页:https://blog.csdn.net/dengjiamingcsu/article/details/79695657
这个错误参考网页:https://blog.csdn.net/it_liuchengli/article/details/77040806 ,我是采用上面所说的第一种方式就解决了。
在创建dmg文件时候,官网上指出最少25g,有的创建50g,我就设置dmg大小为80g,后来发现空间不足,因此需要重新分配大小,命令:
hdiutil resize -sizeg ./android.dmg.sparseimage
其实我认为可以分配大点,因为dmg只是限制你最大空间,不会直接占用硬盘空间。
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
参考网页:https://blog.csdn.net/buyueliuying/article/details/77604225
[ 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
这个问题通过https://blog.csdn.net/h649305597/article/details/80322488找到,在这个网页上说明一些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] = '\0';
3、在控制台(保证当前目录是external/bison)执行
patch -p0 < patch-high-sierra.patch
4、返回根目录
cd ../..
5、编译bison
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失效的问题,至少现在还是这样的。报的类似错误都可以用这个方式试试。
这个问题可以参考:Process system isn't responding in android emulator ,但是后来我发现,这个问题主要在模拟器刚启动的时候会弹出,过一会就OK了。
将源码导入Intellij中,可参考https://www.jianshu.com/p/1d1b8d0de1ed,其实基本按这步骤去操作,应该没什么问题,但是我偏偏遇到三个问题:
(1)导入代码之后,发现源代码目录下各个子目录中src目录没有在Idea中,但是通过两次shift却能找到相应的类,点击工程栏中的定位,定位没有反应。这个问题通过把原来的moudle移除,然后重新make、运行sh,再添加android.iml,所有代码就全部导入Idea中了。
(2)导入之后按照参考步骤sync之后,发现com.android.internal.R识别不了,有些代码如Activity代码出现错误提示,其实对于只是看源码来讲,应该没什么问题,自己也可以从源代码中找到相应的位置,但是这个问题一直膈应我,总觉不舒服,所以花了两天时间解决(主要还是每次sync时间太长了),刚开始是依赖问题,了解Idea中的设置,依赖配置,还是没有用,后来发现其他类都变成类的图标,就是这个类是java图标,点进具体的R文件中有个提示:file size exceeds configured limit , 才恍然大悟,原来的idea设置问题,导致这个文件太大编译不了,后来参考https://blog.csdn.net/u013659732/article/details/68942207?ref=myread,设置idea中的idea.max.intellisense.filesize=9999值,单位是KB,然后就能找到了。
(3)有的类重复定义,如Acitivty等,其实在参考教程,有一步是把dependence的依赖全部删除,只留下jdk,这两个问题我觉得类似,其实在编译的时候生成很多jar文件等,这样会导致依赖和源码都有对应的类,所以重复定义,我遇到的问题是,我已经按照参考步骤去除依赖,但是还是发现有重复定义类,遇到这类问题看提示看重复定义位置,然后去那个文件目录发现其被标记为源根(参考:https://blog.csdn.net/zx48822821/article/details/78640041),如我的问题是Activity类在out一个子目录下,去找到那个目录,发现被标记为(源根),右击,选择unmark source root,然后重新编译即可。
基本上下载、编译、导入遇到的问题就这些,调试可以参考https://www.jianshu.com/p/7c2ab3d9498c、https://www.cnblogs.com/Lefter/p/4176991.html这两篇文章,我尝试一下,启动模拟器和monitor太慢了,所以就没有尝试了,之后再急需吧。
注:写的可能比较乱,以后有时间再继续进行整理,希望对其他同学有所帮助。