我使用的是VirtualBox +Ubuntu
VirtualBox 版本 : 5.0.16 r105871 (使用最新版即可)
Ubuntu : ubuntu-15.10-desktop-amd64.iso
在安装的时候安装语言选择 English,不建议选择中文,方便开发。
在安装的时候,虚拟机不要联网。
配置用户的时候设定一个密码,比如1234.
记住这个密码,以后设置root登录的时候会用到这个密码。
建议有空间的选择70GB以上的空间,、我的62GB,编译完之后就剩余1GB 左右了。
以下是配置:
<1> 以root用户登录
1、先解除root锁定,为root用户设置密码
打开终端输入:sudo passwd root
Password: <--- 输入你当前用户的密码,就是之前安装Ubuntu的那个密码1234
Enter new UNIX password: <--- 新的Root用户密码
Retype new UNIX password: <--- 重复新的Root用户密码
passwd:已成功更新密码
2设置root自动登录
sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf
文件内容最终为:
[SeatDefaults]
autologin-user=root #启动后以root身份自动登录
greeter-session=unity-greeter
user-session=ubuntu
在刚修改完root权限自动登录后,发现开机出现以下提示:
Error found when loading /root/.profile
stdin:is not a tty
…………
解决方法:在终端中用命令gedit /root/.profile,打开文件后找到“mesg n”,
将其更改为“tty -s && mesg n”。
<二>虚拟机窗口大小问题 和共享文件夹的设置
这个需要安装Guest Additions(增强包) 在VirtualBox 安装目录下有这个iso
1.安装:VirtualBoxGuestAddition.iso文件
可以在VirtualBox的安装目录下找到。
直接在虚拟机的主菜单上点击“安装增强功能”,Unbuntu会自动挂载一个iso。
打开终端,cd /media/cdrom0目录下,运行sudo ./VBoxLinuxAdditions-x86.run。待完整的出现下面的信息后表示安装成功了。
Verifying archive integrity... All good.
Uncompressing VirtualBox 3.0.4 Guest Additions for Linux
installation......................................................................................................
..................................................................................................................
......
VirtualBox 3.0.4 Guest Additions installation
Building the VirtualBox Guest Additions kernel module...
Building the shared folder support kernel module...
Building the drm support kernel module...
Installing the VirtualBox Guest Additions...
Successfully installed the VirtualBox Guest Additions.
You must restart your guest system in order to complete the installation.
装完重启之后,鼠标就可以在Host主机系统和虚拟系统之间自由移动而不需按右边Ctrl键切换了,而且虚拟系统的窗口可以拉动,
位置合适的话Ubuntu桌面会自动全屏显示。如果开启了与Host系统共享剪贴板的话,还可以在Host系统与虚拟系统之间进行复制/剪切和粘贴。
2.设置共享文件夹
重启完成后点击"设备" ->分配数据空间,添加一个共享文件夹,选项固定和临时是指该文件夹是否是持久的。
共享名可以任取一个自己喜欢的,比如"vboxshd",尽量使用英文名称。
D:\Vbox\shd ,这个是windows 的目录,以后共享文件可以放在这个路径下。
3.挂载共享文件夹
若要使用共享文件夹功能,必须安装linux guest additions,安装增强功能,.如果你不想每一次手动挂载,可以使用以下方法,在系统启动时执行挂接脚本,成功自动挂接
# gedit /etc/rc.local
1. 在文件的最后加入上面手动挂接的命令:
mount -t vboxsf vboxshd /mnt/shd // vboxshd 是共享数据空间的名称
2. cd /mnt/
mkdir shd
注意:一定要在mount之前,确定已经加载了vboxsf模块。
如果不加载的话,会出现mount出错的情况。
/sbin/mount.vboxsf: mounting failed with the error: No such device
Ubuntu启动后 一般会在 /media/ 目录下挂载共享文件夹。
<三>添加国内 Ubuntu 源
如果不添加,接下来安装 Android 编译需要的工具的时候,有几个无法安装。
cp /etc/apt/sources.list /etc/apt/sources.list_bak
gedit /etc/apt/sources.list
在最后加上:
deb http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ wily-proposed main restricted universe multiverse deb http://mirrors.163.com/ubuntu/ wily-backports main restricted universe multiverse deb-src http://mirrors.163.com/ubuntu/ wily main restricted universe multiverse deb-src http://mirrors.163.com/ubuntu/ wily-security main restricted universe multiverse deb-src http://mirrors.163.com/ubuntu/ wily-updates main restricted universe multiverse deb-src http://mirrors.163.com/ubuntu/ wily-proposed main restricted universe multiverse deb-src http://mirrors.163.com/ubuntu/ wily-backports main restricted universe multiverse之后, sudo apt-get update
加其他国内源也是一样的方法。
<四>安装Android源代码编译所需的软件包
Ubuntu 默认安装后是不带软件开发相关的组件的,因此需要先安装一系列的软件开发组件,
请先保存你的电脑能正常访问互联网络。
第一步,先从Tiny4412 光盘中拷贝 tools 目录下的 ubuntu 目录到tmp 。
第二步,安装jdk6 :
# cd /tmp/ubuntu/jdk6/
# chmod 755 install-sun-java6.sh
# ./install-sun-java6.sh
第三步,通过执行install-devel-packages.sh 脚本,联网安装软件开发相关的软件包:
# cd /tmp/ubuntu/
# chmod 755 install-devel-packages.sh
# ./ install-devel-packages.sh
中途会询问是否下载软件包,输入Y 回车即可。
最后一步,Android5.0.2 的编译 需要使用的是openjdk-7-jdk,
但是,friend 官方没提这个事情,坑。。。
apt-get install openjdk-7-jdk
之后:执行./ install-openjdk7,sh
附送一个shell 脚本 install-openjdk7,sh 来设置 Java jdk:
=================================================================================================================================
#!/bin/sh
# Update symbolic links for Java
update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/java-7-openjdk-amd64/bin/java" 1
update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/java-7-openjdk-amd64/bin/javac" 1
update-alternatives --install "/usr/bin/javadoc" "javadoc" "/usr/lib/jvm/java-7-openjdk-amd64/bin/javadoc" 1
update-alternatives --install "/usr/lib/mozilla/plugins/libjavaplugin.so" "mozilla-javaplugin.so" "/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/libnpjp2.so" 1
update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/java-7-openjdk-amd64/bin/javaws" 1
update-alternatives --install "/usr/bin/jar" "jar" "/usr/lib/jvm/java-7-openjdk-amd64/bin/jar" 1
# Choose the java you installed as default
update-alternatives --config java
update-alternatives --config javac
update-alternatives --config javadoc
update-alternatives --config mozilla-javaplugin.so
update-alternatives --config javaws
update-alternatives --config jar
# Verify installation
java -version
javac -version
==============================================================================================================
<五>安装交叉编译器GCC
使用的是官方的 arm-linux-gcc-4.5.1 (和Mini210 相同),它在编译内核时会自动采用 armv7
指令集,支持硬浮点运算,下面是安装它的详细步骤。
Step1:将光盘Android 目录中的arm-linux-gcc-4.5.1-v6-vfp-YYYYMMDD.tgz 复制到/tmp 目
录,然后进入到该目录,执行解压命令:
#cd /tmp
#tar xvzf arm-linux-gcc-4.5.1-v6-vfp-YYYYMMDD.tgz –C /
注意:C 后面有个空格,并且C 是大写的,它是英文单词“Change ”的第一个字母,在此
是改变目录的意思。
执行该命令,将把arm-linux-gcc 安装到/opt/FriendlyARM/toolschain/4.5.1 目录
Step2:把编译器路径加入系统环境变量,运行命令
#gedit ~/.bashrc
编辑~/.bashrc 文件,注意“bashrc ”前面有一个“. ”,修改最后一行为 export
PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin ,注意路径一定要写对,否则将不会有效。
保存退出。
重新登录系统 ,使以上设置生效,在命令行输入
arm-linux-gcc –v ,会出现GCC 相关信息,这说明交叉编译环境已经成功安装
<六>解压安装Android 内核源代码 并编译:
在工作目录/opt/FriendlyARM/tiny4412/android 中执行:
#cd /opt/FriendlyARM/tiny4412/android
#tar xvzf /tmp/Android-5.0.2/linux-3.0.86-YYYYMMDD.tgz
将创建生成linux-3.0.86 目录,里面包含了完整的内核源代码
说明:YYYYMMDD 是发行更新日期标志,请以光盘中实际日期尾缀为准。
(2)解压安装Android 源代码包
在工作目录/opt/FriendlyARM/tiny4412/android 中执行:
#cd /opt/FriendlyARM/tiny4412/android
#tar xvzf /tmp/Android/Android-5.0.2/android-5.0.2-fs-YYYYMMDD.tar.gz
将创建android-5.0.2 目录。
说明:YYYYMMDD 是发行或更新日期标志,请以光盘中实际日期尾缀为准。
ps: android-5.0.2 源码放在那里都无所谓,因为编译工具都加入到 环境变量里边了。
我把源码放在了 /root/aa\文件夹下,fandroid目录中,
android5 就是android5.0.2 源码目录,kernel 是Linux3.0.86 内核 源码 目录。
注意还有两个 编译脚本 bandroid.sh 和 bernel.sh 分别是 android 和kernel 的编译脚本.
编译的时候直接
cd /home/fandroid
./bandroid.sh 和 ./bkernel.sh 就OK了。
这两个文件记得加X权限。
自己写的 bandroid.sh:
======================================================================================
set -e -o pipefail
exec > >(tee android.log)
exec 2>&1
cd ./android5
. setenv
make -j4
./gen-img.sh
rm -rf /media/sf_vboxshd/bin/
mkdir /media/sf_vboxshd/bin/
cd ..
mv ./android5/*.img /media/sf_vboxshd/bin/
mv ./kernel/arch/arm/boot/zImage /media/sf_vboxshd/bin/
======================================================================================
bkernel.sh
======================================================================================
set -e -o pipefail
exec > >(tee kernel.log)
exec 2>&1
cd ./kernel
cp tiny4412_android_defconfig .config
make -j4
======================================================================================
编译 android 的时候 可能会遇到如下问题:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Error: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar: unknown package name of class file com/slsi/sec/android/HdmiService.class
target Symbolic: libgui (out/target/product/tiny4412/symbols/system/lib/libgui.so)
target Symbolic: libskia (out/target/product/tiny4412/symbols/system/lib/libskia.so)
out/target/common/obj/PACKAGING/public_api.txt:20: error 5: Added public field android.Manifest.permission.BACKUP
out/target/common/obj/PACKAGING/public_api.txt:81: error 5: Added public field android.Manifest.permission.INVOKE_CARRIER_SETUP
out/target/common/obj/PACKAGING/public_api.txt:105: error 5: Added public field android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
out/target/common/obj/PACKAGING/public_api.txt:115: error 5: Added public field android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST
******************************
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
1) You can add "@hide" javadoc comments to the methods, etc. listed in the
errors above.
2) You can update current.txt by executing the following command:
make update-api
To submit the revised current.txt to the main Android repository,
you will need approval.
******************************
build/core/tasks/apicheck.mk:57: recipe for target 'out/target/common/obj/PACKAGING/checkapi-current-timestamp' failed
make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] Error 38
make: *** Waiting for unfinished jobs....
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决方法:进入 源码目录
cd /root/fandroid/android5/
make update-api
之后 cd ..
./bandroid.sh
重新编译即可。
《七》 配置和编译Linux内核
编译Linux3.0.86 内核:
#cd /opt/FriendlyARM/tiny4412/android/linux-3.0.86
#cp tiny4412_android_defconfig .config ;注意config 前面有个”.”
你可以执行make menuconfig 对配置进行修改,修改完成后,输出make 进行编译:
# make
最后会在arch/arm/boot 目录下生成zImage ,将它替换掉SD 卡images/Android/下的zImage
烧写到Tiny4412 即可。
使用我的脚本:
cd /root/fandroid/android5/
./bkernel.sh
OK
bkernel.sh
======================================================================================
set -e -o pipefail
exec > >(tee kernel.log)
exec 2>&1
cd ./kernel
cp tiny4412_android_defconfig .config
make -j4
======================================================================================
晒一下我编译成功的图:
android开机后的第一个图是官方系统,第二个图是我编译的系统,去掉了 Youtube 等几个 apk。
建议不要使用虚拟机 编译太费时间了,我是 I7 的处理器 +SSD,虚拟机分配了10GB RAM, 完整编译 android 需要2个小时,完整编译 kernel 需要 半个小时。
当然以后单独编译模块会快很多,应该几分钟的事情。
大家酌情使用吧。