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 但是
不能安装,提示找不到
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安装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
作用好像是 使用-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
大概意思是说 这个只有在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
根据如下网址,安装meld并设置到右键快捷方式,即可替代bcompare。
Ubuntu 14.04 LTS Meld对比工具添加到右键菜单方法 http://blog.csdn.net/yelangjueqi/article/details/56670957