开发文章

android 编译打包烧录

16年底,从深圳转战到杭州,当然也重新换了份工作,记得刚来的时候非常的辛苦,因为10月份广东还是比较热的,到杭州这边好冷,那时候严重的不适应,很严重的感冒… 这段时间尝试去了解了下源码,还是收获很多的,现在努力学习cpp中,准备往这方面转了。因为新公司都是在源码上编译的,所以或多或少也学习研究了下,记得刚开始下载Android源码的时候,那个蛋疼,折腾了我一个多星期,现在写篇文章总结下。

安装ubuntu系统,我选择的是在window上安装虚拟机,我知道好多人用mac去编译,穷屌丝也有穷屌丝的门路,钱不是我们阻止我们学习的障碍,充分利用window和linux各自的优势,我觉得并不比mac逊色多少。安装好了如下图所示:

安装好了如下图所示.png

  • 安装相应的库支持。

    sudo apt-get install Git-core gnupg flex bison gperf build-essential zip curl zliblg-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

根据我惨痛的经历,一般编译不成功基本都是环境有问题,代码有问题的可能性是非常的小的。如果有些库安装不了,使用 sudo apt-get update 一下,如果还是不行,就得自行搜索解决一下了。另外还要安装交叉编译器和jdk,其中如果对交叉编译器不明白的或者不知道如何配置的请看这篇文章 arm-linux-gcc搭建过程图解,其中jdk需要注意的是在android5.0之后就要使用openjdk了,具体原因就是因为Oracle和google的那场官司了,使用命令 apt-get install openjdk-7-jdk.安装完成之后得配置下环境变量,可以在 etc/profile 或者是 ~/.bashrc文件最后输入:

复制内容到剪贴板
  1. export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64  
  2. export PATH=$JAVA_HOME/bin:$PATH  
  3. export CLASSPATH=.:$JAVA_HOME/lib  

配置成功后,应该如下图所示:

应该如下图所示.png

另外,交叉编译器安装成功之后,要将Linux根目录的Makefile文件中cpu架构改成arm的,如下图所示:

改成arm的.png

编译

编译linux,执行build.sh config配置环境

config配置环境.png

然后直接执行 ./build.sh 命令开始编译

命令开始编译.png

编译android
首先要切换到我们的android目录下,然后执行envsetup.sh脚本配置我们的环境,然后选择我们要编译的分支,具体步骤如图:

脚本配置我们的环境.png

接下来,我们要把linux编译好的uboot和kenel拷贝到我们android目录下,因为我们已经执行过我们的envsetup.sh脚本了,而envsetup.sh脚本又执行了我们的device/softwinner/common/vendorsetup.sh脚本,vendorsetup.sh的脚本中有个函数叫做extract-bsp(),我们来看下这个函数:

复制内容到剪贴板
  1. function extract-bsp()  
  2. {  
  3.   
  4.     CURDIR=$PWD  
  5.   
  6.     get_lichee_out_dir  
  7.     get_device_dir  
  8.   
  9.     cd $DEVICE  
  10.   
  11.     #extract kernel  
  12.     if [ -f kernel ] ; then  
  13.         rm kernel  
  14.     fi  
  15.     cp $LINUXOUT_DIR/bImage kernel  
  16.     echo "$DEVICE/bImage copied!"  
  17.   
  18.     #extract linux modules  
  19.     if [ -d modules ] ; then  
  20.         rm -rf modules  
  21.     fi  
  22.     mkdir -p modules/modules  
  23.     cp -rf $LINUXOUT_MODULE_DIR modules/modules  
  24.     echo "$DEVICE/modules copied!"  
  25.     chmod 0755 modules/modules/*  
  26.   
  27.   
  28. # create modules.mk  
  29. (cat << EOF) > ./modules/modules.mk   
  30. # modules.mk generate by extract-files.sh, do not edit it.  
  31. PRODUCT_COPY_FILES += \\  
  32.     \$(call find-copy-subdir-files,*,\$(LOCAL_PATH)/modules,system/vendor/modules)  
  33. EOF  
  34.   
  35.     cd $CURDIR  
  36. }  

可以看到从linux目录拷贝kernel和一些modules,需要主要的是get_lichee_out_dir()函数,Linux目录一定要放在android目录上层目录下,自己查看源码即可。接下来,我们便可以执行我们的make命令来编译我们的android系统了,make后面可以带个参数表示执行编译的线程条数,如果 make -j8,后面的数字一般都是你电脑cpu的核数乘以2。

cpu的核数乘以2.png

我的电脑是6核的,所以我可以用 make -j12,但是我就使用了make -j8,整个编译的过程很漫长,中途可能会报错,报错的原因90%以上都是环境没有配置好,大概一般的3个小时50分钟左右就会编译结束,当然这个时间也是根据你计算机cpu的能力的,像用公司的编译服务器编译,只需要十几分钟…

编译成功后,我们使用vendorsetup.sh脚本里面的pack函数将编译出来的镜像文件打包成rom,如图所示,红色部分表示生成的路径。

vendorsetup.sh脚本里面的pack函数.png

烧录

具体每个厂商都会提供烧录软件的,即使没有提供也会把烧录的步骤的脚本发给你的,比如芯灵图家的A33板子就是用PhoenixSuit烧录的,我们公司的是在fastboot模式下,烧录rom的。按照具体的步骤做就行了,接下来发张将自己编译过的android6.0系统烧录到硬件的效果图,很是有成就感,有么有。

android6.0系统烧录到硬件的效果图.png

android6.0系统烧录到硬件的效果图.png

android6.0系统烧录到硬件的效果图.png

访问虚拟机

毕竟是两个系统,操作起来也不是很方面,文件互访有很多方案,但是我觉得基于samba服务是最方便的,window本身就集成了samba服务,所以只需要在ubuntu系统上安装下即可,首先sudo apt-get install samba,安装完成之后,敲入命令vim /etc/samba/smb.conf , 在这个文件末尾添加几句话,如图所示:

访问虚拟机.png

接下来设置root的密码,敲入命令 smbpasswd -a root ,然后重新启动samba服务, service smb restart,查看samba进程是否启动 ps -ef。注意有点非常的重要,我们需要设置虚拟机网络为桥接模式,这样就会自动获取ip连接网络了。最后在window上映射我们Linux的磁盘,如图所示:

最后在window.png

最后在window.png

 

输入我们虚拟机的ip就行了,进入Z盘就很方便的访问我们linux中的文件系统了。可以看到这就是我们的Linux文件系统的根目录。当然你也可以通过ssh访问我们的linux,下面是我通过Xshell访问我们的虚拟机。

Xshell访问我们的虚拟机.png

 

感谢 Nipuream 支持 磐实编程网 原文地址:
blog.csdn.net/yanghuinipurean/article/details/61618719

文章信息

发布时间:2017-03-12

作者:Nipuream

发布者:aquwcw

浏览次数: