记一次Android源码编译过程

实验环境

  • MacOS Mojave 10.14; RAM 16G
  • SSD硬盘 960G
  • 能访问google的网络环境

第一步:准备环境

可参考官网说明:https://source.android.com/setup/build/initializing

  1. 准备磁盘

    1. 磁盘镜像方式(官方推荐25G,建议60G+)
      # 创建一个 .dmg(也可能是 .dmg.sparseimage)文件hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 60g ~/android.dmg# 调整大小hdiutil resize -size 100g ~/android.dmg.sparseimage# 在 .bash_profile 中添加挂载辅助函数mountAndroid() { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }umountAndroid() { hdiutil detach /Volumes/android; }
    2. 外置硬盘方式:直接格式外外置硬盘(MAC OS拓展 (区分大小写,日志式))
  2. 安装Xcode命令行工具:这一步一般会需要最新的MacOS大版本(目前需要MoJave)

    # 安装Xcode命令行工具 ,直接使用最新版本会有一些问题,可以在下面的链接下载旧版本的命令行工具即可(9.4.1)# 建议从这里下:https://developer.apple.com/download/more/xcode-select --install
  3. 安装MacPorts:https://www.macports.org/install.php

    # 从上面的链接选择合适版本安装后,编辑 ~/.bash_profile,确保 /opt/local/bin 必须显示在 /usr/bin 前面:export PATH=/opt/local/bin:$PATH
  4. 用MacPorts准备相关编译工具

    # 分别是gmake,libsdl,gnupg(gnupg1过时了,这里选择gnupg2),gitPOSIXLY_CORRECT=1 sudo port install gmake libsdl gnupg2 git
  5. 设置文件符数量上限

    # ~/.bash_profile:  set the number of open files to be 1024ulimit -S -n 1024
  6. 配置Repo与下载源码

    mkdir ~/binPATH=~/bin:$PATH# 下载Repocurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo# 挂载磁盘并创建源码存放路径mountAndroidmkdir /Volumes/android/aospcd /Volumes/android/aosp# 检出分支 默认master 加 -b android-8.1.0_r64 可切换到8.1repo init -u https://android.googlesource.com/platform/manifest# 长达一个小时+的下载过程repo sync# 切换分支到repo start android-8.1.0_r64 --all

第二步:编译源码

到这里,如果image镜像是在模拟器运行就可以开始编译了,否则还需按官网说明下载驱动。

# 清空输出目录cd /Volumes/android/aospmake clobber# 生成编译脚本. build/envsetup.sh# 选择构建目标lunchaosp_x86_64-eng# aosp:Android Open Source Project,可供进行编译使用;# _x84_64: Binder支持64位;# -eng:拥有各种调试工具的开发版设置,拥有root跟debug权限# 编译;make jN,一般N为当前CPU核心数的1~2倍,这个过程应该需要一点时间 :)make -j4# 经过漫长莫约3h+后,我这边已经build好了,由于没有原生真机只能模拟器运行了# 关闭命令行后,可以先跑下面两个命令:# . build/envsetup.sh# lunchemulator

导入源码到AS调试Java层代码

由于导入源码占内存较大,可先在 /应用程序/Android Studio⁩/Contents⁩/⁨bin⁩/studio.vmoptions 中配置内存参数:-Xmx2048m

# 初始化命令工具. build/envsetup.sh #编译 idegen 模块,生成idegen.jarmmm development/tools/idegen/# 生成针对 Android 开发工具的配置文件./development/tools/idegen/idegen.sh# 这样会在源码路径下生成以下三个熟悉的文件# android.ipr:编译器配置、入口,相关的libraries等。也是导入源码的入口。# android.iml:描述了modules和依赖关系等,有确认不需要导入的文件夹可在这里设置。# android.iws:工作区的设置。android.ipr# 一段时间后,就能导入进来了,配置一下依赖跳转# File -> Project Structure 打开 Module,然后选中 Dependencies:# 保留 JDK 跟 Module Source 项,并添加源码的 external 和 frameworks 依赖# 启动模拟器,就可以 Attach Debugger to Android process 调试了。# 调试可以参考:http://weishu.me/2016/05/30/how-to-debug-android-framework/

使用gdbclient调试C层代码

gdb操作可参考:https://blog.csdn.net/dream_cs/article/details/78847065

# 通过 shell ps + grep 过滤进程adb shell ps -A | grep calculator# gdbclient  可以通过 gdbserver 调试对应的进程gdbclient 2341# r:run# b ::breakpoint# c:continue# s:step# p :print(gdb) c

问题记录

  1. MacOS 编译Android源码提示找不到tools.jar

    build/core/config.mk:663: error: Error: could not find jdk tools.jar at /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/../lib/tools.jar, please check if your JDK was installed correctly.

    解决:可以保证设备是有JDK的,查一下文件发现,还需要在 .bash_profile 中配置变量 export ANDROID_JAVA_HOME=$JAVA_HOME,好了了以后需要刷新一下:. ~/.bash_profile

  2. 找不到对应的macOS.sdk:internal error: Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13”]
    解决:

    # 先查看XCode 中 mac sdk的版本,我的是 10.14cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ls# 方式一、在源码目录 darwinSupportedSdkVersions 中添加(这个方式我试过,后续在我的设备还是编译不过去)vim build/soong/cc/config/x86_darwin_host.godarwinSupportedSdkVersions = []string{                "10.10",                "10.11",                "10.12",                "10.13",                "10.14",            }# 方式二、在 https://github.com/phracker/MacOSX-SDKs/releases 下载 Command_Line_Tools_macOS_10.13_for_Xcode_9.4.1.dmg (这个以前是10.13的)安装即可。

另外有参考:
https://www.cnblogs.com/liumce/p/8027559.html
https://blog.csdn.net/yemao_guyue/article/details/80871390
https://www.jianshu.com/p/063a0bcdc7f5

更多相关文章

  1. Android 网络请求简单使用方式
  2. 从HandlerThread 的使用来分析HandlerThread的源码
  3. Android 8.0 SystemUI 源码分析(一):图文并茂的介绍 :D
  4. android 自动化测试工具 Monkey
  5. android 截取验证码的两种实现方式
  6. Android源码内部编译过程总结(Make)(转)
  7. android的消息处理机制(图+源码分析)——Looper,Handler,Message (
  8. 解析 ViewTreeObserver 源码,体会观察者模式、Android消息传递(下)
  9. Android中程序与Service交互的方式

随机推荐

  1. Android display system overview
  2. 有关Android(安卓)Bluetooth - OBEX OPP
  3. android控件之ProgressBar进度条
  4. Android基站定位——通过手机信号获取基
  5. Android(安卓)Notification(Android(安卓)
  6. 2018-08-17 Android(安卓)Gradle(1)
  7. 你需要知道的Android(安卓)View的测量
  8. Android(安卓)修改framework实现 全局唯
  9. Android(安卓)开发 Adb等常用指令集
  10. Android(安卓)进程状态的概念