zoukankan      html  css  js  c++  java
  • 在Mac mini上编译Android源码

    参考文章

    1.Android 6.0 源代码编译实践

    2.编译Android源码致命错误解决方案

    实践过程

    1.Mac下安装Ubuntu双系统

    (1)Ubuntu版本:Ubuntu 15.10 

    注:实际上一开始我是从Ubuntu 16.04 LTS开始的,但编译过程中出现提示需要OpenJDK1.7的情况,但是Ubuntu 16.04 LTS的软件包里只有OpenJDK1.8 和OpenJDK1.9.

    于是我换成了Ubuntu 15.10,虽然它不是LTS版本,但是它的OpenJDK版本比较齐全。

    当然后来编译时又提示需要OpenJDK1.8,所以这个选择还算明智。

    可以在这里看到Ubuntu各个版本对应的软件包。

    Ubuntu的各个版本列表在这里

    (2)制作ubuntu安装U盘

    下面分别是Ubuntu和Mac下制作安装U盘的步骤。

    ---》直接在Ubuntu系统下制作安装U盘

    ---》How to install Ubuntu on MacBook using USB Stick

    (3)分盘以及安装

    参考:mac如何安装linux

    2.下载Android源码

    (1)清华大学镜像源

    https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

    (2)下载repo工具

    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo

    (3)安装git

    sudo apt-get intstall git

    (4)初始化仓库

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

    Android版本、源码和API Level对应关系

    会出现错误,提示配置git帐号。

    git config --global  user.emall "xxx@xxx.com"
    git config --global  user.name "xxx"

    配置完成后重新初始化即可。

    (5)同步

    由于首次同步需要下载 24GB 数据,过程中任何网络故障都可能造成同步失败,选择下载每月更新的初始化包。

    下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

    由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以最新的每月包中,只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

    wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
    tar xf aosp-latest.tar
    cd AOSP   # 解压得到的 AOSP 工程目录
    # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
    repo sync # 正常同步一遍即可得到完整目录
    # 或 repo sync -l 仅checkout代码

     大约4个小时,24G的文件下载完毕,开始解压,然后同步,时长大约两个小时。解压后是看不到文件里面有东西的。

    同步结束,文件夹就会出现这些内容,这就是最新的Android系统源码(不知道为什么有24G这么大!!!是因为repo吗?同步完毕后,这个文件夹已经变成约42G大小了。不想说什么,只能说这个磁盘一定要够!!!我用的分区是ext4格式,大小有86G,源码编译完,只剩2G了)。

    (6)关于移动硬盘

    由于我是在公司的Mac mini上进行编译,但是这台mac mini很老了,安装ubuntu系统,内存只有2G,编译速度非常的慢。

    打算做持久战的我,把AOSP源码复制到了我的移动硬盘上,一是做备份(毕竟24G下载下来再花两个小时同步很不容易!!!!),二是下班后可以带回家,用家里的电脑(注明:这台是普通的Acer电脑,不是苹果电脑)继续编译。。。

    一开始没想那么多,移动硬盘依然是NTFS分区,于是,出现了下面的状况:

    问题原因: AOSP文件夹在移动硬盘里面,但是分区格式是NTFS格式的,不支持Linux的文件权限,无法把文件当做Program执行。

    解决办法:参考这里

    没办法,在移动硬盘里又分了一个区,格式化为ext4格式,把AOSP文件夹复制过去,约42G大小。

     复制完发现,唉,没有root权限进行读写。

    参考这篇文章解决:ext4格式移动硬盘挂载普通用户权限控制

    获得用户权限后,将AOSP下所有文件和文件夹权限改为可读可写可执行。

    chmod -R 777 ./AOSP

    (7)关于无线网卡驱动

    在Mac mini中安装完Ubuntu 15.10后,重启系统,发现Wifi连不上~~泪目~~(注:Ubuntu 16.04 LTS安装完没有出现这种情况。)

    解决办法:Android手机通过USB共享网络,然后安装无线网卡驱动。(我没有公司的上网权限,所以只能靠Wifi和手机了~)

    参考:ubuntu14.04无线网卡驱动安装 

    无线网卡类型:

    直接按照博文的步骤进行,重启电脑,wifi就能用了。

    3.编译Android源码

    (1)配置编译环境变量

    参考博文:Android 6.0 源代码编译实践

    第一个步骤是在终端中进入源码根目录:

    cd ~/AOSP

    然后使envsetup.sh生效,用lunch选择编译版本,关于envsetup

    source ./build/envsetup.sh
    lunch

    这么多个版本如何区分,我并没有找到详细的资料,我选择的是第6个,aosp_x86_64-eng。

     更多资料:理解 Android Build 系统

    (2)编译

    make -j4

    这里直接参考文章里作者用的-j4参数,我并没有具体分析CPU/内核等与-jN的关系。能用就行。

    (3)安装必要组件

    出现了很多问题,每次编译时间较长,参考在Ubuntu-14.04.3配置并成功编译Android6_r1源码这篇文章安装了一些组件:

    sudo apt-get install -y git flex gperf build-essential libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib tofrodos python-markdown xsltproc zlib1g-dev:i386 dpkg-dev libsdl1.2-dev libesd0-dev libxml2-utils

    (4)安装OpenJDK1.8

    关于OpenJDK版本或者JDK已在前面提过,只能说,make之后,按照提示再作安装吧。

    下面还是写一下JDK 和 OpenJDK的安装过程,留着以后用。

    ------》安装OpenJDK

    官网:http://openjdk.java.net/

    sudo apt-get install openjdk-8-jdk

    安装很简单,上面一句命令就可以了。

    ------》安装JDK

     Oracle官网下载JDKWithNetbeans(jdk-8u91-nb-8_1-linux_x64.sh),也可以下载不带有netbeans的,但是这个比较快,而且万一以后要用到NetBeans呢。

    sudo chmod +x ~/jdk-8u91-nb-8_1-linux-x64.sh
    sudo ~/jdk-8u91-nb-8_1-linux-x64.sh

     在~/.bashrc中配置环境变量:

    export JAVA_HOME=/usr/local/jdk1.8.0_91
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    source ~/.bashrc

    -------》检查JAVA版本

    注意:OpenJDK和JDK最好不要一起安装,免得编译过程中一些库调用混乱,当然,配置好环境变量应该也可以避免这种情况的发生。

    java -version

     (5)安装bision

    解决办法:http://www.cnblogs.com/muhe221/articles/5047178.html

    sudo apt-get install bison

     (6)安装32位兼容库

    解决办法:prebuilts/misc/linux-x86/bison/bison: 没有那个文件或目录

    ubuntu 64位系统运行32位程序的问题,需要安装运行32位程序的兼容库

    sudo apt-get install lib32ncurses5
    sudo apt-get install lib32stdc++6

    (7)增加虚拟内存

    解决办法:

    内存不够,增加虚拟内存。

    sudo -s
    dd if=/dev/zero of=/swapfile bs=4M count=512

    保护Swap分区:

    chown root:root /swapfile
    chmod 0600 /swapfile
    ls -lh /swapfile

    启动swap分区:sudo mkswap swapfile

    sudo mkswap /swapfile 

    激活swap分区:

    swapon /swapfile

    在Ubuntu上验证:

     swapon –s

    更新/etc/fstab 文件,增加内容:

    # swap
    /swapfile none            swap    sw              0      0

     (8)使用Super User权限

    为什么权限还是不够呢?!!!!!

    不管了,简单粗暴,直接用root来进行编译好来(感觉前面白忙活了~~~呜呜呜~~~)

    sudo  passwd root 
    su root

     切换到root帐号后,如果提示没有找到java,则需要重新修改~/.bashrc,设置JAVA环境变量。

    (9)物理内存与swap分区的比率

    解决办法:Ubuntu虚拟机编译Android6.0总结

    担心内存不够,又增加了一个虚拟内存。然后配置物理内存与swap分区的比率。

    不知道这个数字是否合理,因为后面编译过程中Ubuntu十分卡顿,只能强制关机,重启后继续。

    参考:swappiness设置实际内存和swap的使用比率 /ubuntu优化

    sysctl -q vm.swappiness
    sudo sysctl vm.swappiness=10

     (10)Jack 和-Xmx

    解决办法:Android 源码编译错误

    gedit ./prebuilts/sdk/tools/jack-admin
    gedit ./out/host/linux-x86/bin/jack-admin

    还有尝试修改max-service。

    sudo gedit /root/.java-server/config.properties
    jack.server.max-service=1

    最好在make之前,启动Jack-Server:

    ./out/host/linux-x86/bin/jack-admin kill-server
    ./out/host/linux-x86/bin/jack-admin start-server

    这个问题是编译过程中最严重的一个问题,一直伴随到编译结束,有时候会一直卡顿在类似下面的语句,半小时之后没有任何更新,系统异常卡顿,鼠标无响应,这种情况下,只能强制关机后,重新继续编译。

    感觉这个问题应该是内存不足的原因,我家里电脑的内存是4G,编译速度明显会快很多,但是编译一段时候后依然会卡在这类似的地方,同样,如果强制退出无响应,就只能强制关机再重启。

    (11)编译中断后,如何继续编译?

    这个就很重要了,硬件配置不够,总是编译中断在Jack的问题上,每次编译耗时又很长,怎么办呢?

    得想办法让编译过的不再重新编译,参考: 编译android源码时,意外中断,如何能让其接着编译?

    编辑 build/core/cleanbuild.mk,

    上面的这个图没有截完整哦,else对应的if也要注释掉的。

    (12)编译完成

    在不断卡在Jack Server,不断强制关机重启电脑之后,进度条终于到了100%,编译完成。

    4.关于Jack

    Jack不是一个人名,也不是耳机~~,Jack的全称是:Jack (Java Android Compiler Kit)

    还翻不了墙的我,查不到关于Jack的详细资料,以后到墙的另一面再查查吧。

    Android源码目录结构

    编译完了,可是并不了解源码里具体是什么东西,更不知道编译出来的是什么。

    看看几篇博文,初步了解一下吧:

    最全的Android源码目录结构详解

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/tt2015-sz/p/5484733.html
Copyright © 2011-2022 走看看