编译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
解释如果你完成编译之后,还在执行编译的那个终端中执行
补充编译过程中出现的问题:
第一、
编译了大约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
(把这个文件变成swap文件)
3.#swapon /opt/swap1
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
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
3.#swapon /opt/swap1
(启用这个swap文件)
4.为了使每次开机时都能正常使用swap文件,所以这里需要把swap文件增加到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
相关文章推荐
- 使用csc命令将.cs文件编译成.dll的过程
- 使用csc命令将.cs文件编译成.dll的过程
- Android 编译命令及选项
- android编译全过程
- 【转】分享编译Android源码的全过程
- 使用csc命令将.cs文件编译成.dll的过程
- android编译全过程
- android获取源代码、编译、命令
- Ubuntu上编译Android过程
- Ubuntu 下编译Android源码全过程
- 使用csc命令将.cs文件编译成.dll的过程
- 使用csc命令将.cs文件编译成.dll的过程
- Ubuntu上编译Android过程
- android获取源代码、编译、命令 .
- Ubuntu 8.04下编译Android源码全过程
- 使用csc命令将.cs文件编译成.dll的过程
- Ubuntu上编译Android过程
- Ubuntu 8.04下编译Android源码全过程
- android获取源代码、编译、命令
- android 源码下载编译全过程必读