学Android也有比较长的一段时间了,但是对于android源码的认识自己总感觉似懂非懂,因为自己也仔细看过相关的书籍、对于遇到过的一些问题也分析过源码,但还是觉得对于Android底层代码的实现存在一只半解,很多时候都处于代码开发、遇到问题再去谷歌百度的状态,没有对Android有个相对细节性的系统整体认识,所以这就需要以后在学习的过程中加强源码阅读和理解。基于目前大多数看源代码都是通过http://androidxref.com/ 看的,个人感觉虽然方便查找,但是不利于整体性阅读,代码跳转感觉特别不方便。因此参考官网和相关网上经验,记录下载Android源代码遇到的问题。

一、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/

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

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

对于刚使用Mac的不久的我来讲,Mac给日常开发带来很好的体验,然后其硬盘存储空间相对比较小,因此不忍心将源码下载到本地硬盘中,因此准备采用移动硬盘进行扩展,将源码下载进去。在此过程中遇到两个问题:

(1)使用的移动硬盘是NFTS格式,所以对于Mac来讲只能读取, 不能写入,后来在网上找到一个免费软件Mounty,参考网页:https://jingyan.baidu.com/article/a3aad71aa1dde7b1fb0096ab.html

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

  • 进入移动硬盘目录下
  • 创建镜像文件:hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ./android.dmg
  • 挂载镜像文件:hdiutil attach ./android.dmg -mountpoint /Volumes/android;
注意创建的文件可能为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 portError: 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
  • 1
  • 2
  • 3
  • 4
  • 5

由于gnupg已经过时,如果要继续使用gnupg的话,改为下载gnupg1;Error中建议大家使用gnupg2,我用的就是gnupg2。需要先关闭gnupg1的端口。

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

参考网页:https://blog.csdn.net/dengjiamingcsu/article/details/79695657

3.RPC failed; curl 18 transfer closed with outstanding read data remaining

这个错误参考网页:https://blog.csdn.net/it_liuchengli/article/details/77040806 ,我是采用上面所说的第一种方式就解决了。

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 1make: *** [run_soong_ui] Error 1
  • 1
  • 2
  • 3
  • 4
这个问题网上也报过,而且一般发生在make clobber命令之后,具体出现这种问题网页有:https://www.jianshu.com/p/1513fc9e1a74 ,但是我在执行的时候并没有发生,命令正常运行,但是在我make的时候报了这个错误,依照网上的解决方案应该有两个:一是下载其需要的MacOsX sdk,二是修改源码目录/build/core/combo/mac_version.mk文件,修改其所需要的mac环境,如下: 基于MAC Android 8.1源码下载编译阅读_第1张图片 不管方案一还是方案二需要解决的问题就是MacOsX sdk位置及其当前版本确认。这是在Xcode安装目录下,好像一般都是自带的,具体没有深究,在网上看有的是自己安装的,所以目录一般是Application目录下,具体看这个问题链接,但是我的Xcode目录并不是在其所指的位置,但可以通过命令xcode-select -p找到其所安装的目录。找到其安装的目录之后,发现我的版本是sdk 10.13,而需要的是10.10 10.11 10.12的,所以最简单的方法采用方案二,直接修改mac_version.mk文件,然而我去那个目录下找却没有找到,网上也没有遇到这个问题, 所以只能等以后有时间的时候再具体了解哪里修改,所以采用方案一,下载一个10.12版本,解压放在那个目录下,记得需要sudo,但是放进去之后好像还不行,因为查看其权限,多了个@,可通过如下命令行去除:   xattr -c -r *

参考网页:https://blog.csdn.net/buyueliuying/article/details/77604225

6.error: Exited sync due to fetch errors

关于这个问题网上有不同的解决方法,目前采用https://blog.csdn.net/txl19881019/article/details/44081865方案使用命令: repo sync -j8

7.bison不能正常使用

[  0% 310/89583] //external/selinux/ch...eckpolicy yacc policy_parse.y [darwinFAILED: 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.cppninja: build stopped: subcommand failed.12:58:42 ninja failed with: exit status 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这个问题通过https://blog.csdn.net/h649305597/article/details/80322488找到,在这个网页上说明一些7.1,8.1编译时的错误,在此引用其解决办法:这个错误都是由于bison不能正常使用导致的。可以使用

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

检测一下你的源码中的bison是否正常工作。 

网上有一些国内复制粘贴的解决办法但我没有走通,下面是我在谷歌搜索到的解决方案:

1、定位到源码中external/bison文件夹

cd external/bison

2、在文件夹创建文本文件patch-high-sierra.patch并把下面代码复制进去()

With format string strictness, High Sierra also enforces that %n isn't usedin dynamic format strings, but we should just disable its use on darwin ingeneral.--- 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';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3、在控制台(保证当前目录是external/bison)执行

patch -p0 < patch-high-sierra.patch  
  • 1

4、返回根目录

cd ../..  
  • 1

5、编译bison

make bison
  • 1

6、复制bison到AOSP编译时寻找bison的位置

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

经过我自己的验证在7.1以后的版本都需要使用这个来解决bison失效的问题,至少现在还是这样的。报的类似错误都可以用这个方式试试。

8.

Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex
FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
GC overhead limit exceeded
Try increasing heap size with java option '-Xmx'
Warning: This may have produced partial or corrupted output.
ninja: build stopped: subcommand failed.

参考网页:https://blog.csdn.net/brightming/article/details/49763515/ 通过修改jack-admin文件,设置Xmx,其最好设置大一点,网页上给的2048仍然会出现这个错误,所以在有的网页上看最好设置内存的一半。

9.编译成功后,使用emulator启动模拟器出现启动正常,但是模拟器弹窗提示System UI isn't responding。

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

10.将Android源码导入Intellij IDEA中,出现有的引用(如com.android.internal.R)找不到,有些类重复定义。

将源码导入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太慢了,所以就没有尝试了,之后再急需吧。

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

更多相关文章

  1. android 调用系统文件管理器
  2. Android屏幕锁定实例源码详解教程一
  3. 如何编译Android内核源码
  4. Android 为【apk】文件签名,增加修改系统时间等权限
  5. Android AsyncTask 源码分析详解
  6. android 根据res文件夹下(如res/raw)文件名获取其id
  7. [Android Pro] android 混淆文件project.properties和proguard-p

随机推荐

  1. Android平台开发指导(Android Porting Gui
  2. 新书内容连载(1):自定义Android组件之带图像
  3. Android工具箱之文件目录
  4. hello world 第一个android程序
  5. Android数据加密之Rsa加密
  6. C#开发Android应用的必备——Mono for An
  7. Android(安卓)应用设置全局Exception处理
  8. Android布局控件属性
  9. android使用android:ellipsize="end"无效
  10. Android布局文件中常用的属性