您的位置:首页 > 移动开发 > Android开发

编译Android4.4.4过程中,命令讲解

2016-11-27 21:20 302 查看
第一、先安装jdk1.6(jdk-6u45-linux-x64.bin)

 sudo mkdir /usr/local/java/  //创建Java文件夹,其中/usr/local/下一般是你安装软件的目录,这个目录就相当于在
windows下的programefiles这个目录。

cd /usr/local/java

sudo mv /桌面/jdk-6u45-linux-x64.bin
/usr/local/java

chmod
u+x jdk-6u45-linux-x64.bin

 ./jdk-6u45-linux-x64.bin//在普通用户下不行的话,切换到root下,执行jdk-6u45-linux-x64.bin,将JDK6的相关文件解包至jdk1.6.0_33目录下

第二、配置JDK环境变量

cd ~ //退出到最外面路径

sudo gedit
/etc/profile//这个文件是每个用户登录时都会运行的环境变量设置,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

打开之后在最下面添加jdk在系统的地址,并点击保存:

export
JAVA_HOME=/usr/local/java/jdk1.6.0_45  
export JRE_HOME=/usr/local/java/jdk1.6.0_45/jre   
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH  
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH

第三、.手动设置系统默认JDK,这个位置是你自己解压jdk的地址

 sudo
update-alternatives --install /usr/bin/java java
/usr/local/java/jdk1.6.0_45/bin/java 300

解释update-alternatives是dpkg的实用工具,用来维护系统命令的符号链接,以决定系统默认使用什么命令。Linux
发展到今天,软件定期都会进行升级,现在java版本已经升级到JDK8.0,还有open-jdk各种版本。由于软件需要安装了很多java版本,又不想每次使用都去修改环境变量。Debian 提供了一种机制来解决这个问题,而 update-alternatives 就是用来实现这种机制的。这个命令会建立很软链接,当切换版本的时候,只需要更改软链接的指向。
现在开始配置,我下载的JDK8在/home/mec/Android/jdk1.8.0_73。下载这个在这里就不细讲了,你也可以配置~/.bashrc或是/etc/profile中的环境变量。由sudo
update-alternatives --list java我们上面查看只有/usr/lib/jvm/java-6-oracle/jre/bin/java现在使用/usr/lib/jvm/java-6-oracle/jre/bin/java

sudo update-alternatives --install /usr/bin/java java /home/mec/Android/jdk1.8.0_73/bin/java 300

update-alternatives  --install link name path priority其中link为系统中功能相同软件的公共链接目录,比如/usr/bin/java(需绝对目录);name为命令链接符名称,如java path为你所要使用新命令、新软件的所在目录 priority为优先级,当命令链接已存在时,需高于当前值,因为当alternative为自动模式时,系统默认启用priority高的链接;#
整数 根据版本号设置的优先级(更改的优先级需要大于当前的)

现在使用sudo update-alternatives --list java查看下发现多了一项/home/mec/Android/jdk1.8.0_73/bin/java /usr/lib/jvm/java-6-oracle/jre/bin/java

sudo update-alternatives --config javaThere
are 2 choices for the alternative java (providing /usr/bin/java).*号代表我们正在使用的。选择1后查看Java版本。 sudo
update-alternatives --remove java /home/mec/Android/jdk1.8.0_73/bin/java    移除刚来配置。mec@mac:~/Android/jdk1.8.0_73$
java -version   测试下版本,发现又切换回来了1.6

 sudo
update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.6.0_45/bin/javac
300

解释系统repository提供的应用程序放在/usr/bin, 众多的应用程序
 sudo update-alternatives --install /usr/bin/javaws javaws /usr/local/java/jdk1.6.0_45/bin/javaws
300
 sudo update-alternatives --install /usr/bin/jar jar /usr/local/java/jdk1.6.0_45/bin/jar
300
 sudo update-alternatives --install /usr/bin/javap javap /usr/local/java/jdk1.6.0_45/bin/javap
300
 sudo update-alternatives --config java

第四、运行下 java -version 看下是不是切换到你装的那个jdk1.6去了

接下来要提前安装编译源码需要的工具,按顺序都装上

第一、sudo apt-get install
git git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev

第二、sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 

          sudo apt-get install lib32ncurses5 ia32-libs <=>sudo apt-get install lib32ncurses5 lib32zl
(补充)

          解释如果没有补充的命令,会在编译Android过程中出现错误:

                 make:***[out/host/linux-x86/obj/STATIC_LIBRAIES/libinput_intermediates/Input.o]Error 1

                 make:***[out/host/linux-x86/obj/STATIC_LIBRAIES/libinput_intermediates/Keyboard.o]Error
1

第三、sudo apt-get install lib32zl-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown 

或者sudo apt-get install  g++-multilib
 tofrodos python-markdown

第四、sudo apt-get install libxml2-utils xsltproc gcc-multilib lib32readline5-dev

或者sudo apt-get install libxml2-utils xsltproc gcc-multilib 

或者sudo apt-get install libxml2-utils xsltproc unzip

       解释:如果没有此命令,会在编译Android过程中出现错误:

                /bin/bash:xmllint:未找到命令

                build/core/Makefile:32:recipe for target 'out/target/product/generic/system/etc/apns-conf.xml'failed.

                make:***[out/target/product/generic/system/etc/apns-conf.xml]Error 127

下载Android4.4并解压(在编译之前,必须保证linux系统中已经分配了空间比较大的swap空间,具体做法见最后的“补充编译过程中出现错误”部分)

切换到含有Android4.4.4.tar.gz的目录下,文件夹的名字不能有中文比如
android4.4源码

tar zxvf android4.4.4.tar.gz
cd android4.4.4
chmod u+x -R android4.4.4
或者chmod 777 -R android4.4.4
解释一定要加-R ,否则,chmod 仅仅修改了最外层的android4.4.4文件夹,然而在make的时候会出现android4.4.4中的某些文件夹不法访问,没权限问题。打开android4.4.4文件夹发现里面的所有文件夹均是root权限,所以加上-R代表将递归修改android4.4.4中的所有文件夹/文件的权限
source build/envsetup.sh

解释可以引入到shell环境中。下面整理并简述。特别,envsetup.sh还同时会引入vendor/和device
/目录下的vendorsetup.sh脚本。
命令-也就是envsetup.sh中的函数。source 是用来运行 shell
脚本的命令  功能和 "."  和相同,因此 也可以写作: . build/envsetup.sh

在运行envsetup .sh以后 就可以使用 hmm命令了,此时终端会输出命令帮助提示。简单来说,envsetup.sh  给我们提供了一组自定义的 shell命令,而lunch 就是这些自定义命令中的一个。

lunch //回车   然后选择相应平台(1)

解释lunch
[product] 示例: lunch
cm_i9100-userdebug  ;选择产品product格式:
build-build_variant 不再从网上下载产品列表, 如果[product]为空,意味着未选择编译产品,也会弹出许多product,让用户选择,这里的product列表是用户在执行source
build/envsetup.sh时,including了一些shell脚本,从而添加至产品列表的 
make  或者 make -j4 (四线程编译)

emulator

解释如果你完成编译之后,还在执行编译的那个终端中执行
emulator
,那么是可以直接执行这个命令的。但是你关闭了原先的终端,在其它的终端里边执行上述命令,会提示你这个命令找不到。

补充编译过程中出现的问题:

第一、

编译了大约6小时后,开始编译libwebviewchromium模块,此时,终端屏幕显示如下提示信息:

targetSharedLib:libwebviewchromium(out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so)

经过大约2个小时后,终端有了如下的错误信息提示:



build/core/shared_library_internal.mk:68 recipe for target 'out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so' failed

make: ** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so] Error 1

make: ** Deleting file 'out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so'

make: Leaving directory 'home/username/android'

#### make failed to build some target (07:53:05 (hh:mm:ss)) ####

网上有老师说是因为没有设置Linux的swap原因,我看过之后感觉挺有道理,就如下操作了一番。 

# dd if=/dev/zero of=/opt/other/swapfile bs=1024 count=512K

# mkswap /opt/other/swapfile

# swapon /opt/other/swapfile

# swapon -s

# sudo gedit /etc/fstab

/opt/other/swapfile                     file        524280    0    -1

(详细意义及说明可以上网搜索"linux dd"得到相关信息)

重新再次编译。又是七八个小时的苦苦等待,结果还是失败了。

后来又仔细研究了一下swap,感觉还是刚才设置的swap文件太小,从而导致libwebviewchromium模块编译不过。

所以,我又重新设置了一次swap,这次还用了两个swap文件,每个swap的大小都设置为1G,使用了下面的命令:

1.#dd if=/dev/zero of=/opt/swap1 bs=1024 count=1024000


(count的值等于1024 x 你想要的文件大小, 4096000是4G,1024000是1G)

          



2.#mkswap /opt/swap1



 (把这个文件变成swap文件)

3.#swapon /opt/swap1




(启用这个swap文件)

4.为了使每次开机时都能正常使用swap文件,所以这里需要把swap文件增加到fstab文件中



 #sudo vi /etc/fstab

 在最后一行增加如下内容

 /opt/swap1 swap swap defaults 0 0

重复上述4步,再次增加一个/opt/swap2的文件。



这样再次重新编译源码,耗时11小时57分钟,成功完成。

后话,编译到libwebviewchromium模块或其他模块停止不动时,网上有人说从硬件上增加自己电脑的内存也是可以的,这个没试过。

第二、

编译过程中出现的问题:make版本问题

build/core/main.mk:45:
********************************************************************************

build/core/main.mk:46:
* You are using version 4.1 of make.

build/core/main.mk:47:
* Android can only be built by versions 3.81 and 3.82.

build/core/main.mk:48:
* see https://source.android.com/source/download.html
build/core/main.mk:49:
********************************************************************************

build/core/main.mk:50:
*** stopping. Stop.

解决方法:

去android4.4.4/build中打开main.mk文件修给部分shell

ifeq
(,$(findstring CYGWIN,$(shell uname -sm)))

ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.81))

ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.82))
ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 4.1))

$(warning ******************************************************************************* *)

$(warning *  You are using version $(MAKE_VERSION) of make.)

$(warning *  Android can only be built by versions 3.81 and 3.82.)

$(warning *  see https://source.android.com/source/download.html)
$(warning ******************************************************************************* *)

$(error stopping)

endif

endif

endif
endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android ubuntu jdk