Ubuntu 16.04 Android 5.1编译环境搭建记录

Ubuntu 16.04 编译Android 5.1
在论坛看到很多人都已经在Ubuntu 16.04上编译Android了,为了以后Android编译,我尝试搭建Ubuntu 16.04 编译环境。
动手之前,先在网络查看了先驱们的帖子,发现先驱们都已经给出了解决方案,于是决定安装Ubuntu 16.04。
按照正常程序,安装Ubuntu 16.04 
首先安装 git 
    sudo apt install git 
接着安装vim配置(因为下一步操作大部分环境均需要vim来编辑,也可以使用gedit):
    下载 https://github.com/sky8336/vimcfg_bundle 马宁配置,
    sudo apt install gitk
    sudo ./install.sh 安装VIM配置。(用vi打开系统文件是提示 /home/zhangbei/.vim_mru_files 只读,使用chmod命令添加权限即可)
根据MTK 官方Ubuntu 14.04编译环境指定手册Android_Based_Product_Build_Environment_on_Ubuntu_14.04_64-bit_Installation_SOP_decrypted.pdf,来经行配置编译环境。
添加源    
    $ sudo vi /etc/apt/sources.list
    deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
     deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse 
    sudo apt update 可能出现没有下载速度一项,可以多尝试几次,即可更新成功,一切顺利只要20分钟即可,不顺利的话需要时间更久
安装编译环境:  
    sudo apt-get install bison g++-multilib
    sudo apr-get install gperf libxml2-utils make python-networkx build-essential 
    sudo apt-get insatll zlib1g-dev:i386 zip 
    sudo apt-get install flex  tofrodos libswitch-perl  (mingw32没有安装,无法定位)
安装JDK1.7:
    sudo apt-get install openjdk-7-jdk  MTK文档要求 openjdk1.7 但是 不能安装,提示找不到  
参考  :Ubuntu16.04安装openjdk-7-jdk  http://blog.sina.com.cn/s/blog_13128e92c0102wqpb.html  
    sudo add-apt-repository ppa:openjdk-r/ppa  
    sudo apt-get update 
    sudo apt-get install openjdk-7-jdk  
安装openjdk时遇到问题,依赖环境为ubuntu14..4,现在系统为16.04,不满足,不能安装 openjdk1.7  更换为安装oracle jdk 
     sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    JDK 7:
    sudo apt-get install oracle-java7-installer  安装成功,下载速度较慢,安装过程大概需要两小时
安装wine:
参考资料:
ubuntu16.04安装最新版本的wine   http://blog.csdn.net/miaoqiucheng/article/details/52724040 
Ubuntu下wine1.7升级到最新版  http://blog.csdn.net/Mungo/article/details/51447579 
Ubuntu 16.04 LTS 降级安装GCC 4.8  http://www.linuxidc.com/Linux/2017-03/142299.htm 
Ubuntu 16.04安装QQ国际版图文详细教程   http://www.linuxidc.com/Linux/2016-09/134923.htm  
ubuntu16.04下安装wine1.8.2  http://blog.csdn.net/u010652906/article/details/51627516  
    sudo add-apt-repository ppa:wine/wine-builds  、、、、、、、、、
    sudo apt-get update   
    sudo apt-get install --install-recommends wine-staging 此行多次安装方可成功,经常卡在下载时没有下载速度
    sudo apt-get install winehq-staging
此间执行了以上命令,WINE安装成功,但重启后会不能进入系统,后多方查找,发现需要安装如下库文件:
    sudo apt-get install  libgtk2.0-0:i386   必须安装
    sudo apt-get install lib32ncurses5   必须安装
如果是amd64则需要执行这个:
    sudo dpkg --add-architecture i386   需要执行一下,默认情况下Ubuntu已经带这个了
经过以上操作,发现编译环境已经安装完成了,但环境差异如下:
             Ubuntu 12.04     Ubuntu 16.04  
Make            3.81           4.1
python-perl       5.18.4         5.22.1
python          2.7.6          2.7.12
wine           1.6            2.4
Gcc/G++         4.8.4          5.4.0
JDK(java/javac)   1.7.0.65        1.7.0.81

经我分析认为应该不影响编译,于是:拉代码,开始编译。
    编译10分钟左右停止, log信息显示,环境检测已经通过,
     一个Android.mk文件报错,信息:recipe commences before first target stop! 编译停止
查找资料后发现,应该是由于make版本太高(16.04为4.1,12.04为3.81)
参考: Ubuntu 16.04 64bit 编译 Android 4.4 源码  http://www.jianshu.com/p/2b2c723825a9 
安装make V3.82:
    由于ubuntu16.04自带make版本过高,无法编译。因此需要将make降至3.81或3.82版本
    下载地址 ftp://ftp.gnu.org/gnu/make/ ,下载 make3.8.2.tar.gz
    下载后到Downloads下将文件拷到其他目录(home下即可),然后解压
    tar -zxvf make3.8.2.tar.gz
    解压后进入到make3.8.2的目录下
    ./configure
    make
    make install
    执行完后在/usr/local/bin中可得到新版本的make,复制到/usr/bin中即可
    注:make过程中可能会出现错误,不用理会,只要make install能够成功执行即可。

make -v 版本为3.82后,清空代码,重新编译。

以上即为android 5.1编译环境搭建,以下两处错误是由于Ubuntu 16.04 系统特性引起的,也可以说是谷歌bug,合入谷歌patch即可解决。

编译一个小时左右,编译出错,关键信息如下:
/home/zhangbei/compile/b609-battery/mtk_v2.95_b609_ufans_code/main/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/bin/../lib/gcc/x86_64-linux/4.6/../../../../x86_64-linux/bin/ld: error: out/host/linux-x86/obj32/STATIC_LIBRARIES/libcompiler_rt_intermediates/libcompiler_rt.a(eprintf.o): unsupported reloc 43 against global symbol stderr
external/compiler-rt/lib/builtins/eprintf.c:32: error: unsupported reloc 43
网络搜索参考:
Ubuntu16 编译源码出错 unsupported reloc 43   http://www.cnblogs.com/blowing-in-the-wind/p/6518076.html    
Ubuntu16.04编译Android6.0/cm13.0教程及相关错误解决办法   http://www.cnblogs.com/dinphy/p/5840709.html 
    执行 
    cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld 
    后继续编译,编译后提示make updat-api,执行make update-api后继续编译,编译后的软件下载后第一次开机会重启,故此解决方案不行。

查看环境记录,并与同事版本进行对比,怀疑gcc,g++版本不对。 安装gcc 4.6 4.8 ,g++ 4.6 4.8,并切换到4.6版本经行编译(因为其他同事gcc为4.6),重新拉代码编译,还是会出现同样的错误。
根据网友推荐,采用搜狗,搜索英文网页,发现如下:
参考: Android build error on Ubuntu 16.04 LTS  http://oopsmonk.github.io/blog/2016/06/07/android-build-error-on-ubuntu-16-04-lts  
  Ubuntu 16.04 Android 5.1编译环境搭建记录_第1张图片
作用好像是 使用-B告诉编译器,从正确的地方加载GCC前缀(版本?)

添加上图patch后, 清除代码,重新编译,编译后提示update-api,执行后正常。
由于编译时 提示update-api,故 怀疑为JDK版本问题(同事均为1.7.0.65 我的为1.7.0.81),安装 1.7.0.65,再次编译
    Ubuntu16.04 64位系统下面安装JDK1.7  http://blog.csdn.net/zth1002/article/details/51383508  
安装1.7.0.65后,再次编译,仍然提示update-api。编译完成后,发现:
frameworks\base\api\current.txt文件增加一下内容(与 1.7.0.81现象一致 ):
   field public static final java.lang.String BACKUP = "android.permission.BACKUP";
    field public static final java.lang.String INVOKE_CARRIER_SETUP = "android.permission.INVOKE_CARRIER_SETUP";
    field public static final java.lang.String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE";
    field public static final java.lang.String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST";
搜狗 搜英文网页,发现:
API Change error when building AOSP 5.1  http://stackoverflow.com/questions/30998666/api-change-error-when-building-aosp-5-1 
Ubuntu 16.04 Android 5.1编译环境搭建记录_第2张图片
 大概意思是说 这个只有在Ubuntu16上会出现,是谷歌的一个bug。  连接未打开,张亮打开了连接,连接如下:
a/libutils/String8.cpp b/libutils/String8.cpp   system/core/下
index 9092cbc..3323b82 100644
--- a/libutils/String8.cpp
+++ b/libutils/String8.cpp
@@ -424,7 +424,7 @@
             next = len;
         }
 
-        memcpy(buf + tail, buf + index + skip, next - index - skip);
+        memmove(buf + tail, buf + index + skip, next - index - skip);
         tail += next - index - skip;
         index = next;
     }
 大概含义是:当发生内存数据重叠时,使用memcpy拷贝数据不能保证数据被完全正常的拷贝,而 memmove能够保证数据被完全正确的拷贝
添加此patch后,Ubuntu 16.04 编译通过,并且并没有提示 make update-api

Ubuntu 16.04 工作优化:
可以在Ubuntu软件管理中 搜索 iptux 来安装信使。
启动栏移动:(只能为底部或左侧)
gsettings set com.canonical.Unity.Launcher launcher-position Bottom  底部
gsettings set com.canonical.Unity.Launcher launcher-position Left 左侧
开启工作区域  显示桌面:(Ctrl+Alt+方向 切换工作区 , 点击启动栏 桌面 图标,快速回到桌面):
    依次打开 系统设置 -> 外观 -> 行为, 在中间有 开启工作区 和 添加“显示桌面”图标到启动器,两个小选项,勾上后一项就可以看到在左侧的启动栏多个一个显示桌面的图标/按钮。 在启动栏出现 显示桌面 图标后,鼠标放在图标上,按下左键,向下拖动鼠标可以调整 图标 在 启动栏 的位置。
在此处,勾选 窗口菜单栏 在窗口的标题栏 ,即可将不同窗口的标题栏跟随窗口移动。

Ubuntu 16.04 安装 bcompare
     bcompare 3.2 3.3 3.4 ,我使用各种方法进行了安装,一些版本安装不成功,会提示缺少依赖关系  ia32-libs,但他不会被安装(依赖Ubuntu12.04)。一些 bcompare  版本能够正常安装,但是打开时,不能打开,会提示 缺少依赖关系  ia32-libs。
基本上网络上所有的 安装  bcompare  的方法我都尝试过,均不能正常安装或工作,在英文网站上看到需要安装  bcompare  4.0以上版本才可以,但 bcompare  4.0以上版本没有Ubuntu 破解版,不能安装。
  ia32-libs error [Cant install on amd64]ia32-libs error [Cant install on amd64]  https://ubuntuforums.org/showthread.php?t=2025560  
以上网址方法,来源于外国网友,尝试结果:还是不可以的,ia32-libs安装失败,不能安装。并且,执行过此步骤后,安装其他软件会提示错误,导致其他软件也不能正确安装。

    由于Ubuntu 16.04 不能正常安装 bcompare,所以我找到了一个代替工具meld,软件界面简单,功能能够满足日常使用,是 bcompare的完美替代品。
安装比较工具meld:
根据如下网址,安装meld并设置到右键快捷方式,即可替代bcompare。
Ubuntu 14.04 LTS Meld对比工具添加到右键菜单方法 http://blog.csdn.net/yelangjueqi/article/details/56670957  

你可能感兴趣的:(Ubuntu 16.04 Android 5.1编译环境搭建记录)