-
安卓系统源码编译系列(2)——安卓系统源码编译教程
2015-02-15 10:34:51安卓系统源码编译系列(二)——安卓系统源码编译教程 折腾了两天终于完成了安卓系统源码的下载,虽然说中间遇到了不少波折,但总算顺利完成,有兴趣的朋友可以参考我的上一篇博文《安卓系统源码编译系列(一)...安卓系统源码编译系列(二)——安卓系统源码编译教程
折腾了两天终于完成了安卓系统源码的下载,虽然说中间遇到了不少波折,但总算顺利完成,有兴趣的朋友可以参考我的上一篇博文《安卓系统源码编译系列(一)——下载安卓系统源码教程》。完成了源码下载之后,本人又马不停蹄的开始了源码编译的旅途,抱着与上篇文章同样的目的,写下这篇博文,那就是希望大家可以通过本人的教程一次性完成安卓系统源码的编译!
同时,也欢迎大家将编译过程中遇到的问题及解决方案告诉我,一起完善本教程。
编译前的准备
由于在上一篇博文中我们已经对编译环境做了一些配置,如安装jdk、git、python等,所以这里就不再重复。
首先,如果是按照我上一篇博文配置jdk环境的朋友,可以再执行以下命令增加几个映射,避免出现找不到命令的情况:
cd /usr/bin ln -s -f /usr/local/java/jdk1.6.0_31/bin/javah ln -s -f /usr/local/java/jdk1.6.0_31/bin/jar ln -s -f /usr/local/java/jdk1.6.0_31/bin/javadoc
其次,因为Ubuntu12.04自带的gcc和g++是4.6版本的,我们需要安装4.4版本的gcc和g++,避免出现版本兼容性问题,在终端依次输入以下命令:
sudo apt-get install gcc-4.4 sudo apt-get install g++-4.4 cd /usr/bin sudo mv gcc gcc.bak sudo ln -s gcc-4.4 gcc sudo mv g++ g++.bak sudo ln -s g++-4.4 g++
执行完成可以在终端输入以下命令来检查版本是否正确:gcc -v g++ -v
然后,我们可以进行USB访问的权限配置。个人感觉这是在将编译好的系统放到真机上时使用的,如果仅仅是在模拟器上运行自己编译的系统可以跳过。以下内容是对官方教程的翻译:
在GNU/Linux系统下(特别是Ubuntu系统),默认一般用户是不能直接访问USB设备的。我们需要对系统进行一些配置来允许USB访问。
推荐的做法是以root的身份创建一个文件(路径是/etc/udev/rules.d/51-android.rules),并将以下内容拷贝到里面。其中<username>应该被替换为需要授权通过USB访问手机的用户名称。
# adb protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username$amp;>amp;$quot; # fastboot protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username$amp;>amp;$quot; # adb protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username$amp;>amp;$quot; # fastboot protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username$amp;>amp;$quot; # adb protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username$amp;>amp;$quot; # fastboot protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username$amp;>amp;$quot; # adb protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username$amp;>amp;$quot; # fastboot protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username$amp;>amp;$quot; # adb protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username$amp;>amp;$quot; # adb protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username$amp;>amp;$quot; # fastboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username$amp;>amp;$quot; # usbboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username$amp;>amp;$quot; # usbboot protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username$amp;>amp;$quot; # adb protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username$amp;>amp;$quot; # fastboot protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username$amp;>amp;$quot; # adb protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username$amp;>amp;$quot; # fastboot protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username$amp;>amp;$quot;
这些规则将在设备下一次连接到系统的时候生效,因此需要将设备拔掉重新连接。这个方法在Ubuntu Hardy Heron(8.04 x LTS)和Lucid Lynx(10.04 x LTS)系统上有效。其他版本的Ubuntu或者其他的Linux系统可能需要不同的配置。
接下来,我们需要配置编译使用的缓存。以下内容是对官方教程的翻译:
在编译的过程中我们可以让编译器使用编译缓存池Ccache。编译缓存池可以加快二次编译的速度。当你经常使用“make clean”操作或者经常在不同版本之间切换来编译,编译缓存池会给你带来很大的效率提升。
将以下内容放到你的.bashrc(路径:~/.bashrc)或者相同作用的文件中:
export USE_CCACHE=1
缓存默认存储在~/.ccache路径下。如果你的源码存储在网络服务器上,或者其他非本地的文件系统中,你可以在.bashrc文件中设置缓存的目录:export CCACHE_DIR=<path-to-your-cache-directory>
推荐的缓存大小是50-100G,你可以在下载完源码后在源码目录下运行以下命令:prebuilts/misc/linux-x86/ccache/ccache -M 50G
当你需要编译Ice Cream Sandwich(4.0.x)或者更老的安卓系统时,Ccache文件的路径在另一个位置,可以运行以下命令:prebuilt/linux-x86/ccache/ccache -M 50G
这个设置会保存在CCACHE_DIR路径下,并且是永久的。最后,我们可以设置一下swap文件,避免出现“其他问题”中的第四个:
mkdir /opt/other sudo dd if=/dev/zero of=/opt/other/swapfile bs=1024 count=512K mkswap /opt/other/swapfile swapon /opt/other/swapfile swapon -s
除此之外,官网教程中还提到了“使用单独的输出目录”(Using a separate output directory),个人感觉意义不是很大,如果有需要的话可以到官网上查看。
开始编译
在完成了以上配置后,我们就可以开始进行源码编译了。请大家在编译之前再次确认虚拟机的配置,内存最好是2个G以上(本人是用的4个G),硬盘空间100G以上(本人用的是200G,反正VMware硬盘空间是动态增长的,设多点没坏处)。
首先,我们需要在源码根目录运行一个脚本进行初始化:
$ source build/envsetup.sh
然后是选择需要编译的目标,如:$ lunch full-eng
该命令主要由两个参数组成,第一个参数可选的值有full、full_maguro、full_panda,分别代表模拟器、手机和开发板PandaBoard(开发板是一个单片机或者称为开发板,如果不好理解的话你可以将它想象成一个没安外壳的设备,这是专门提供给开发者的开发工具)。第二个参数可选的值有user、userdebug和eng。user版本没有root权限,类似于手机上的操作系统;userdebug版本类似于user版本,但是有root权限,可以用于调试;eng版本主要用于调试,同时带有很多调试工具。在这里,我们选择在模拟器上运行的调试版本,所以使用参数full-eng。
最后,我们需要运行一个命令来开始编译:
make -j4
make之后的参数jN代表编译使用的线程数,与CPU的内核总数有关,正好是CPU内核总数的两倍。如果你的CPU是单核的就应该运行make -j2,当然线程数越多编译的速度越快,所以如果是用虚拟机的话,可以在电脑配置允许的情况下使用尽量多的核数。注意,线程数越高的话需要的内存也越高,如果内存不足编译到一半会出错,所以如果内存比较小的话,虽然时间长一些,但是建议直接使用make。
最后编译成功的截图如下:
运行编译结果
走到这里,我们历尽千难万苦成功下载并编译完成了安卓系统,终于到了最激动人心的时刻了,让我们把编译完成的系统运行起来。
这时只要在源码目录下输入emulator即可,但是直接输入会报错,所以我们先运行两个命令:
source build/envsetup.sh lunch full-eng
最后运行:emulator
就可以看到模拟器运行起来的效果了
总结
从开始编译到编译成功,中间两次出错重新编译,最后一次编译成功花了3个半小时。编译完成源码目录共35G,虚拟机物理文件大小为74G(包括两次快照)。
个人感觉整个下载编译过程还是比较顺利的,如果按照本教程的话,应该一天就可以走完整个流程。
其他问题
1.jar、javadoc或者javah命令找不到
/bin/bash: jar: command not found
make: *** [out/host/common/obj/JAVA_LIBRARIES/antlr-runtime_intermediates/javalib.jar] Error 127/bin/bash: javah: command not found
可以执行以下命令:cd /usr/bin ln -s -f /usr/local/java/jdk1.6.0_31/bin/javah ln -s -f /usr/local/java/jdk1.6.0_31/bin/jar ln -s -f /usr/local/java/jdk1.6.0_31/bin/javadoc
2.
collect2: ld terminated with signal 9 [Killed] make: *** [out/host/linux-x86/obj/EXECUTABLES/clang_intermediates/clang] Error 1 make: *** Waiting for unfinished jobs....
内存不足,建议增加虚拟机内存或者改用“make”进行编译。3.
mon/docs/api-stubs-timestamp] Error 45
执行以下命令:make clean make
4.
target SharedLib: libwebcore (out/target/product/generic/obj/SHARED_LIBRARIES/libwebcore_intermediates/LINKED/libwebcore.so) collect2: error: ld terminated with signal 9 [Killed] make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebcore_intermediates/LINKED/libwebcore.so] Error 1
这是由于没有创建swap文件引起的,可以执行以下命令创建一个:mkdir /opt/other sudo dd if=/dev/zero of=/opt/other/swapfile bs=1024 count=512K mkswap /opt/other/swapfile swapon /opt/other/swapfile swapon -s
如果还是不行的话,可以考虑增加虚拟机内存之后重新编译
之后遇到问题会持续补充。
-
安卓系统源码编译系列(二)——安卓系统源码编译教程
2013-10-13 22:39:00折腾了两天终于完成了安卓系统源码的下载,虽然说中间遇到了不少波折,但总算顺利完成,有兴趣的朋友可以参考我的上一篇博文《安卓系统源码编译系列(一)——下载安卓系统源码教程》。完成了源码下载之后,本人又...折腾了两天终于完成了安卓系统源码的下载,虽然说中间遇到了不少波折,但总算顺利完成,有兴趣的朋友可以参考我的上一篇博文《安卓系统源码编译系列(一)——下载安卓系统源码教程》。完成了源码下载之后,本人又马不停蹄的开始了源码编译的旅途,抱着与上篇文章同样的目的,写下这篇博文,那就是希望大家可以通过本人的教程一次性完成安卓系统源码的编译!
同时,也欢迎大家将编译过程中遇到的问题及解决方案告诉我,一起完善本教程。
编译前的准备
由于在上一篇博文中我们已经对编译环境做了一些配置,如安装jdk、git、python等,所以这里就不再重复。首先,如果是按照我上一篇博文配置jdk环境的朋友,可以再执行以下命令增加几个映射,避免出现找不到命令的情况:cd /usr/bin ln -s -f /usr/local/java/jdk1.6.0_31/bin/javah ln -s -f /usr/local/java/jdk1.6.0_31/bin/jar ln -s -f /usr/local/java/jdk1.6.0_31/bin/javadoc
其次,因为Ubuntu12.04自带的gcc和g++是4.6版本的,我们需要安装4.4版本的gcc和g++,避免出现版本兼容性问题,在终端依次输入以下命令:
执行完成可以在终端输入以下命令来检查版本是否正确:sudo apt-get install gcc-4.4 sudo apt-get install g++-4.4 cd /usr/bin sudo mv gcc gcc.bak sudo ln -s gcc-4.4 gcc sudo mv g++ g++.bak sudo ln -s g++-4.4 g++
gcc -v g++ -v
然后,我们可以进行USB访问的权限配置。个人感觉这是在将编译好的系统放到真机上时使用的,如果仅仅是在模拟器上运行自己编译的系统可以跳过。以下内容是对官方教程的翻译:在GNU/Linux系统下(特别是Ubuntu系统),默认一般用户是不能直接访问USB设备的。我们需要对系统进行一些配置来允许USB访问。推荐的做法是以root的身份创建一个文件(路径是/etc/udev/rules.d/51-android.rules),并将以下内容拷贝到里面。其中<username>应该被替换为需要授权通过USB访问手机的用户名称。
这些规则将在设备下一次连接到系统的时候生效,因此需要将设备拔掉重新连接。# adb protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>" # fastboot protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>" # adb protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>" # fastboot protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>" # adb protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>" # fastboot protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>" # adb protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>" # fastboot protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>" # adb protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>" # adb protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>" # fastboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>" # usbboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>" # usbboot protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>" # adb protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>" # fastboot protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>" # adb protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>" # fastboot protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
这个方法在Ubuntu Hardy Heron(8.04 x LTS)和Lucid Lynx(10.04 x LTS)系统上有效。其他版本的Ubuntu或者其他的Linux系统可能需要不同的配置。接下来,我们需要配置编译使用的缓存。以下内容是对官方教程的翻译:在编译的过程中我们可以让编译器使用编译缓存池Ccache。编译缓存池可以加快二次编译的速度。当你经常使用“make clean”操作或者经常在不同版本之间切换来编译,编译缓存池会给你带来很大的效率提升。将以下内容放到你的.bashrc(路径:~/.bashrc)或者相同作用的文件中:
缓存默认存储在~/.ccache路径下。如果你的源码存储在网络服务器上,或者其他非本地的文件系统中,你可以在.bashrc文件中设置缓存的目录:export USE_CCACHE=1
推荐的缓存大小是50-100G,你可以在下载完源码后在源码目录下运行以下命令:export CCACHE_DIR=<path-to-your-cache-directory>
当你需要编译Ice Cream Sandwich(4.0.x)或者更老的安卓系统时,Ccache文件的路径在另一个位置,可以运行以下命令:prebuilts/misc/linux-x86/ccache/ccache -M 50G
这个设置会保存在CCACHE_DIR路径下,并且是永久的。prebuilt/linux-x86/ccache/ccache -M 50G
最后,我们可以设置一下swap文件,避免出现“其他问题”中的第四个:mkdir /opt/other sudo dd if=/dev/zero of=/opt/other/swapfile bs=1024 count=512K mkswap /opt/other/swapfile swapon /opt/other/swapfile swapon -s
除此之外,官网教程中还提到了“使用单独的输出目录”(Using a separate output directory),个人感觉意义不是很大,如果有需要的话可以到官网上查看。开始编译
在完成了以上配置后,我们就可以开始进行源码编译了。请大家在编译之前再次确认虚拟机的配置,内存最好是2个G以上(本人是用的4个G),硬盘空间100G以上(本人用的是200G,反正VMware硬盘空间是动态增长的,设多点没坏处)。首先,我们需要在源码根目录运行一个脚本进行初始化:
然后是选择需要编译的目标,如:$ source build/envsetup.sh
该命令主要由两个参数组成,第一个参数可选的值有full、full_maguro、full_panda,分别代表模拟器、手机和开发板PandaBoard(开发板是一个单片机或者称为开发板,如果不好理解的话你可以将它想象成一个没安外壳的设备,这是专门提供给开发者的开发工具)。第二个参数可选的值有user、userdebug和eng。user版本没有root权限,类似于手机上的操作系统;userdebug版本类似于user版本,但是有root权限,可以用于调试;eng版本主要用于调试,同时带有很多调试工具。$ lunch full-eng
在这里,我们选择在模拟器上运行的调试版本,所以使用参数full-eng。最后,我们需要运行一个命令来开始编译:
make之后的参数jN代表编译使用的线程数,与CPU的内核总数有关,正好是CPU内核总数的两倍。如果你的CPU是单核的就应该运行make -j2,当然线程数越多编译的速度越快,所以如果是用虚拟机的话,可以在电脑配置允许的情况下使用尽量多的核数。make -j4
注意,线程数越高的话需要的内存也越高,如果内存不足编译到一半会出错,所以如果内存比较小的话,虽然时间长一些,但是建议直接使用make。最后编译成功的截图如下:运行编译结果
走到这里,我们历尽千难万苦成功下载并编译完成了安卓系统,终于到了最激动人心的时刻了,让我们把编译完成的系统运行起来。这时只要在源码目录下输入emulator即可,但是直接输入会报错,所以我们先运行两个命令:
最后运行:source build/envsetup.sh lunch full-eng
emulator
就可以看到模拟器运行起来的效果了
总结
从开始编译到编译成功,中间两次出错重新编译,最后一次编译成功花了3个半小时。编译完成源码目录共35G,虚拟机物理文件大小为74G(包括两次快照)。个人感觉整个下载编译过程还是比较顺利的,如果按照本教程的话,应该一天就可以走完整个流程。其他问题
1.jar、javadoc或者javah命令找不到/bin/bash: jar: command not found
make: *** [out/host/common/obj/JAVA_LIBRARIES/antlr-runtime_intermediates/javalib.jar] Error 127 或者
可以执行以下命令:/bin/bash: javah: command not found
cd /usr/bin ln -s -f /usr/local/java/jdk1.6.0_31/bin/javah ln -s -f /usr/local/java/jdk1.6.0_31/bin/jar ln -s -f /usr/local/java/jdk1.6.0_31/bin/javadoc
2.
内存不足,建议增加虚拟机内存或者改用“make”进行编译。collect2: ld terminated with signal 9 [Killed] make: *** [out/host/linux-x86/obj/EXECUTABLES/clang_intermediates/clang] Error 1 make: *** Waiting for unfinished jobs....
3.
执行以下命令:mon/docs/api-stubs-timestamp] Error 45
make clean make
4.
这是由于没有创建swap文件引起的,可以执行以下命令创建一个:target SharedLib: libwebcore (out/target/product/generic/obj/SHARED_LIBRARIES/libwebcore_intermediates/LINKED/libwebcore.so) collect2: error: ld terminated with signal 9 [Killed] make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebcore_intermediates/LINKED/libwebcore.so] Error 1
mkdir /opt/other sudo dd if=/dev/zero of=/opt/other/swapfile bs=1024 count=512K mkswap /opt/other/swapfile swapon /opt/other/swapfile swapon -s
如果还是不行的话,可以考虑增加虚拟机内存之后重新编译
之后遇到问题会持续补充。
如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)转载请注明出处,谢谢! -
安卓系统源码编译系列(1)——下载安卓系统源码教程
2015-02-15 10:33:50安卓系统源码编译系列(一)——下载安卓系统源码教程 最近需要编译安卓系统,咨询了一个编译过安卓系统的朋友,说是下载源码就得下载两天,于是做好了长期抗战的准备,开始了下载安卓源码的旅程。在刚开始下载...安卓系统源码编译系列(一)——下载安卓系统源码教程
最近需要编译安卓系统,咨询了一个编译过安卓系统的朋友,说是下载源码就得下载两天,于是做好了长期抗战的准备,开始了下载安卓源码的旅程。在刚开始下载时,可以参照的内容只有官方教程,于是跟着官方教程一步一步走,遇到问题就百度谷歌,结果发现自己因为经验不足走了很多弯路,写下这篇教程是为了让以后打算下载安卓源码的朋友提供一些建议和思路。本篇教程会不断更新,力求弥补其他教程的不足并覆盖所有问题,希望大家看完本教程后可以一次性下载成功!
同时,也欢迎大家将遇到的问题以及解决方案告诉我,一起完善这个教程。
配置虚拟机
首先是搭建下载源码的环境,官方推荐是使用64位的Ubuntu,版本是12.04。如果使用Mac OSX的话,编译的时候还需要解决大小写问题,所以建议使用Ubuntu系统。另外由于之后还要编译源码,进行各种配置,所以建议配置一个虚拟机。本人使用的是Mac OSX Mountain Lion 10.8.5系统,VMware 5.03,使用的Ubuntu镜像是ubuntu-12.04-desktop-amd64.iso。
安装完VMware之后,下载好Ubuntu之后就可以开始配置虚拟机了,由于之后还要编译安卓系统,建议大家配置虚拟机磁盘空间为200G,内存为2G(如果电脑内存不足的话1G也行,但是编译的时候可能会慢一些)。
注意:
1.VMware默认为动态分配磁盘空间,所以不一定在创建的时候就要有200G的磁盘空间,但由于之后编译安卓源码需要一百多个G(具体等我编译完会告诉大家),所以请大家预留足够的空间。
2.虽然VMware支持动态增加磁盘空间,但请一次性分配200G,避免之后空间不够用。本人第一次下载源码的时候就只分配了20G,结果下载到一半提示空间不足。关闭虚拟机扩展磁盘空间之后,开机就再也无法进入系统了,只能通过新建虚拟机再挂载的形式恢复数据,所以请大家谨记。
3.由于下载或者编译源码中间可能会与外部系统有交互,方便起见,建议大家安装VMware Tools,可以自由复制以及进行文件共享。
配置下载源码环境
接下来是配置下载源码的环境,先看看官方网站上的要求:
- Python 2.6 -- 2.7, which you can download from python.org.
- GNU Make 3.81 -- 3.82, which you can download from gnu.org,
- JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. You can download both fromjava.sun.com.
- Git 1.7 or newer. You can find it at git-scm.com.
Python、GNU Make都是Ubuntu12.04自带的,而且版本都符合要求,所以不用管。
下面就需要安装JDK,官网提供的步骤是:
$ sudo add-apt-repository "deb ; $ sudo apt-get update $ sudo apt-get install sun-java6-jdk
但是按照该步骤可能会报错如下:Package sun-java6-jdk is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source E: Package sun-java6-jdk has no installation candidate
网上给出了两种解决办法,第一种是:sudo add-apt-repository ppa:ferramroberto/java sudo apt-get update sudo apt-get install sun-java6-jdk
第二种是:1. 在终端输入:sudo gedit /ect/apt/sources.list文件 2. 在sources.list最后添加一行 deb 保存关闭gedit 4. 运行 sudo apt-get update 5. 再次运行sudo apt-get install sun-java6-jdk。
但很不幸的是,以上两种方法对本人都无效,所以无奈之下,只得手动下载jdk进行安装。如果大家的情况和我一样,建议手动安装,安装步骤可以参见这篇文章。安装完JDK后,再安装Git:
sudo apt-get install git
最后配置一下其他必需的包:$ sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
官网上教程中的Configuring USB Access好像用不着,Setting up ccache和Using a separate output directory都是编译的时候用的。安装下载源码的工具
由于安卓的源码很大而且很多,所以需要用到一个下载工具repo,可以直接按照官网的步骤:
$ mkdir ~/bin $ PATH=~/bin:$PATH
$ curl ; ~/bin/repo $ chmod a+x ~/bin/repo
安装完下载工具之后,可以创建一个存放源码的目录,这里用WORKING_DIRECTORY代替:$ mkdir WORKING_DIRECTORY $ cd WORKING_DIRECTORY
下载源码
现在万事俱备,只欠东风了。我们即将开始下载安卓系统源码。首先可以在这里选择要下载的安卓版本,例如本人选的是android-4.3_r2.3。
根据官网的说明,如果下载最新版本可以直接输入:
$ repo init -u
指定版本可以输入:$ repo init -u
这个过程中会提示你输入名字和邮箱,名字随意,邮箱建议输入gmail的邮箱。最后执行:$ repo sync
即可开始下载。需要说明的是,repo支持断点续传,如果中间下载中断了或者出错了,可以再次执行repo sync来继续下载。但是先不要急,由于下载过程还会遇到各种各样的问题,所以请大家稍安勿躁,再做一些准备工作,首先我们需要创建一个自动下载脚本,确保出错了之后会自动执行repo sync,可以省掉我们很多重复劳动。脚本如下:
#!/bin/bash echo "======start repo sync======" ../bin/repo sync while [ $ == 1 ]; do echo "======sync failed, re-sync again======" sleep 3 ../bin/repo sync done
将以上脚本放入一个sh文件中(例如dw.sh),在终端中cd到该脚本的目录下,运行以下命令即可:sudo sh ./dw.sh
需要注意的是,这个脚本并不能解决下载中间卡住的问题,如果在一个地方卡住超过10分钟以上,建议ctrl+z停掉以后重新运行脚本。本人就曾经第二天早上起来发现还卡在前天晚上的位置。
接下来,我们需要再增加一个验证。由于访问都是匿名的,为了防止连接过多,谷歌对同一个ip的访问次数进行了限制。用浏览器登录,输入谷歌账号,点击允许访问,会进入一个信息页面,里面可以得到类似以下内容:
machine androi login git-jack password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA machine android-revie login git-jack password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA
在~(/home/username/.netrc)目录下创建一个.netrc文件,将以上两行内容粘贴进去,保存。repo init的时候地址需要加上/a
repo init -u
需要注意的是,这两行内容每次登录有可能得到的不一样,但似乎不会有差别。
其他问题
1. 重新启动虚拟机之后有可能会出现repo命令出错:
No command 'repo' found, did you mean: Command 'rep' from package 'rep' (universe) Command 'repl' from package 'nmh' (universe) Command 'repl' from package 'mailutils-mh' (universe) repo: command not found
出现这个错误的话,建议将~/bin目录下的repo文件夹删除,重新安装repo。注意,不是将安卓源码目录下的.repo文件删除,否则就需要重新下载之前下过的源码!本人就曾经误删除过.repo文件导致所有文件都要重新下载。2.安装其他必需的包时候遇到错误:
E: Sub-process /usr/bin/dpkg returned an error code (1)
执行:cd /var/lib/dpkg sudo mv info info.bak sudo mkdir info
再次运行命令,遇到错误:Errors were encountered while processing: libc6-dev:i386 E: Sub-process /usr/bin/dpkg returned an error code (1)
执行:apt-get install linux-libc-dev:i386 apt-get install libc6-dev:i386
最后再次运行安装其他必需包命令,就没有错误了3.如果中间出现类似以下错误的话:
error: Failed connect to androi:443; Connection timed out while accessing
可以尝试ping一下androi,如果ping不通的话,可以修改hosts。方法为,在终端中输入:sudo gedit /etc/hosts
在host文件中增加以下内容:74.125.31.82 74.125.31.82 androi 203.208.46.172 cach 59.24.3.173 cach
注意,一定要检查该域名是否能ping通,ping不通的话再改,本人就是本来能ping通的,改完就出错了4.下载过程中出错:
error: gnutls_handshake() failed: A TLS packet with unexpected length was received. while accessing uest failed
5.关闭Ubuntu虚拟机之后无法启动系统
本人就曾经遇到过这个问题,还是在基本下载完成的时候,眼看着就要重新下载了,一个师兄给我提供了解决方案,真是山重水复疑无路,柳暗花明又一村啊。可以新建一个虚拟机,将旧的虚拟机作为硬盘挂载到新的虚拟机上。再将旧虚拟机上的安卓源码目录复制到新的虚拟机上,继续执行脚本下载即可。
6.下载结束时出错:
error: frameworks/base/: platform/frameworks/base checkout 4b77609a983b08f163853df2a77e1d535d684aec
进入到frameworks/base目录,执行:git reset --hard
7.下载过程中出错:
Fetching projects: 0% (1/363) Fetching project platform/hardware/samsung_slsi/exynos5 fatal: Invalid gitfile format: /home/zhaoxy/develop/.repo/repo/.git/clone.bundle fatal: The remote end hung up unexpectedly
再次repo sync即可
之后遇到问题会持续补充。
-
安卓系统源码编译系列(一)——下载安卓系统源码教程
2013-10-12 23:36:28在刚开始下载时,可以参照的内容只有官方教程,于是跟着官方教程一步一步走,遇到问题就百度谷歌,结果发现自己因为经验不足走了很多弯路,写下这篇教程是为了让以后打算下载安卓源码的朋友提供一些建议和思路,希望...最近需要编译安卓系统,咨询了一个编译过安卓系统的朋友,说是下载源码就得下载两天,于是做好了长期抗战的准备,开始了下载安卓源码的旅程。在刚开始下载时,可以参照的内容只有官方教程,于是跟着官方教程一步一步走,遇到问题就百度谷歌,结果发现自己因为经验不足走了很多弯路,写下这篇教程是为了让以后打算下载安卓源码的朋友提供一些建议和思路。本篇教程会不断更新,力求弥补其他教程的不足并覆盖所有问题,希望大家看完本教程后可以一次性下载成功!
同时,也欢迎大家将遇到的问题以及解决方案告诉我,一起完善这个教程。
配置虚拟机
首先是搭建下载源码的环境,官方推荐是使用64位的Ubuntu,版本是12.04。如果使用Mac OSX的话,编译的时候还需要解决大小写问题,所以建议使用Ubuntu系统。另外由于之后还要编译源码,进行各种配置,所以建议配置一个虚拟机。本人使用的是Mac OSX Mountain Lion 10.8.5系统,VMware 5.03,使用的Ubuntu镜像是ubuntu-12.04-desktop-amd64.iso。
安装完VMware之后,下载好Ubuntu之后就可以开始配置虚拟机了,由于之后还要编译安卓系统,建议大家配置虚拟机磁盘空间为200G,内存为2G(最好是2G或以上,本人曾经用1G结果各种问题),CPU核数为2核(核数多的话之后的编译速度会快很多)。
注意:
1.VMware默认为动态分配磁盘空间,所以不一定在创建的时候就要有200G的磁盘空间,但由于之后编译安卓源码需要占用很大空间(我编译完成后源码目录是35G),所以请大家预留足够的空间。
2.虽然VMware支持动态增加磁盘空间,但请一次性分配200G,避免之后空间不够用。本人第一次下载源码的时候就只分配了20G,结果下载到一半提示空间不足。关闭虚拟机扩展磁盘空间之后,开机就再也无法进入系统了,只能通过新建虚拟机再挂载的形式恢复数据,所以请大家谨记。
3.由于下载或者编译源码中间可能会与外部系统有交互,方便起见,建议大家安装VMware Tools,可以自由复制以及进行文件共享。
配置下载源码环境
接下来是配置下载源码的环境,先看看官方网站上的要求:- Python 2.6 -- 2.7, which you can download from python.org.
- GNU Make 3.81 -- 3.82, which you can download from gnu.org,
- JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. You can download both fromjava.sun.com.
- Git 1.7 or newer. You can find it at git-scm.com.
Python、GNU Make都是Ubuntu12.04自带的,而且版本都符合要求,所以不用管。下面就需要安装JDK,官网提供的步骤是:
但是按照该步骤可能会报错如下:$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk
网上给出了两种解决办法,第一种是:Package sun-java6-jdk is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source E: Package sun-java6-jdk has no installation candidate
第二种是:sudo add-apt-repository ppa:ferramroberto/java sudo apt-get update sudo apt-get install sun-java6-jdk
但很不幸的是,以上两种方法对本人都无效,所以无奈之下,只得手动下载jdk进行安装。如果大家的情况和我一样,建议手动安装,安装步骤可以参见这篇文章。1. 在终端输入:sudo gedit /ect/apt/sources.list文件 2. 在sources.list最后添加一行 deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse 3. 保存关闭gedit 4. 运行 sudo apt-get update 5. 再次运行sudo apt-get install sun-java6-jdk。
安装完JDK后,再安装Git:
最后配置一下其他必需的包:sudo apt-get install git
官网上教程中的Configuring USB Access好像用不着,Setting up ccache和Using a separate output directory都是编译的时候用的。$ sudo apt-get install git gnupg flex bison gperf build-essential \ zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ libgl1-mesa-dev g++-multilib mingw32 tofrodos \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386 $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
安装下载源码的工具
由于安卓的源码很大而且很多,所以需要用到一个下载工具repo,可以直接按照官网的步骤:$ mkdir ~/bin $ PATH=~/bin:$PATH
安装完下载工具之后,可以创建一个存放源码的目录,这里用WORKING_DIRECTORY代替:$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo
$ mkdir WORKING_DIRECTORY $ cd WORKING_DIRECTORY
下载源码
现在万事俱备,只欠东风了。我们即将开始下载安卓系统源码。首先可以在这里选择要下载的安卓版本,例如本人选的是android-4.3_r2.3。
根据官网的说明,如果下载最新版本可以直接输入:
指定版本可以输入:$ repo init -u https://android.googlesource.com/platform/manifest
这个过程中会提示你输入名字和邮箱,名字随意,邮箱建议输入gmail的邮箱。最后执行:$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.3_r2.3
即可开始下载。需要说明的是,repo支持断点续传,如果中间下载中断了或者出错了,可以再次执行repo sync来继续下载。$ repo sync
但是先不要急,由于下载过程还会遇到各种各样的问题,所以请大家稍安勿躁,再做一些准备工作,首先我们需要创建一个自动下载脚本,确保出错了之后会自动执行repo sync,可以省掉我们很多重复劳动。脚本如下:
将以上脚本放入一个sh文件中(例如dw.sh),在终端中cd到该脚本的目录下,运行以下命令即可:#!/bin/bash echo "======start repo sync======" ../bin/repo sync while [ $? == 1 ]; do echo "======sync failed, re-sync again======" sleep 3 ../bin/repo sync done
sudo sh ./dw.sh
需要注意的是,这个脚本并不能解决下载中间卡住的问题,如果在一个地方卡住超过10分钟以上,建议ctrl+z停掉以后重新运行脚本。本人就曾经第二天早上起来发现还卡在前天晚上的位置。
接下来,我们需要再增加一个验证。由于访问都是匿名的,为了防止连接过多,谷歌对同一个ip的访问次数进行了限制。用浏览器登录https://android.googlesource.com/new-password,输入谷歌账号,点击允许访问,会进入一个信息页面,里面可以得到类似以下内容:
在~(/home/username/.netrc)目录下创建一个.netrc文件,将以上两行内容粘贴进去,保存。machine android.googlesource.com login git-jacky.rg4.net password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA machine android-review.googlesource.com login git-jacky.rg4.net password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA
repo init的时候地址需要加上/a
repo init -u https://android.googlesource.com/a/platform/manifest
需要注意的是,这两行内容每次登录有可能得到的不一样,但似乎不会有差别。
下载输出说明
下面对下载过程中终端的输出做一个说明,由于安卓源码是由很多个子工程组成的,repo会依此对各个工程调用命令下载。每次终端输出Fetching project则说明开始一个工程的下载,后面跟的是该工程的名称。每下载完几个工程,终端会输出Fetching projects则说明已经下载完成若干工程,后面跟的是当前进度,如92%(334/362)说明总共有362个工程,目前下载到334个,进度是92%。中间如果出现error: The requested URL returned error: 403 while accessing https://...,则说明下载该工程时服务器没有响应,不会有什么影响,只要下次同步的时候该工程不出错就行。最后下载完成会同步整个工程目录,出现以下两行内容时,则说明下载成功。Fetching projects: 100% (362/362), done. Syncing work tree: 100% (362/362), done.
总结
本人从开始下载到下载成功总共花了两天多的时间,其中误删除数据重新下载一次,Ubuntu系统崩溃一次。网速好的话(本人在教育网,不需要开VPN),实际下载过程大概半天左右,最后下载完虚拟机共29.36G,估计下载的数据有15G左右,加上配置环境总共花费流量20G左右。下载完成的效果见截图:其他问题
1. 重新启动虚拟机之后有可能会出现repo命令出错:
出现这个错误的话,建议将~/bin目录下的repo文件夹删除,重新安装repo。注意,不是将安卓源码目录下的.repo文件删除,否则就需要重新下载之前下过的源码!本人就曾经误删除过.repo文件导致所有文件都要重新下载。No command 'repo' found, did you mean: Command 'rep' from package 'rep' (universe) Command 'repl' from package 'nmh' (universe) Command 'repl' from package 'mailutils-mh' (universe) repo: command not found
2.安装其他必需的包时候遇到错误:
执行:E: Sub-process /usr/bin/dpkg returned an error code (1)
再次运行命令,遇到错误:cd /var/lib/dpkg sudo mv info info.bak sudo mkdir info
执行:Errors were encountered while processing: libc6-dev:i386 E: Sub-process /usr/bin/dpkg returned an error code (1)
最后再次运行安装其他必需包命令,就没有错误了apt-get install linux-libc-dev:i386 apt-get install libc6-dev:i386
3.如果中间出现类似以下错误的话:
可以尝试ping一下android.googlesource.com,如果ping不通的话,可以修改hosts。方法为,在终端中输入:error: Failed connect to android.googlesource.com:443; Connection timed out while accessing https://android.googlesource.com/a/platform/sdk/info/refs fatal: HTTP request failed
在host文件中增加以下内容:sudo gedit /etc/hosts
注意,一定要检查该域名是否能ping通,ping不通的话再改,本人就是本来能ping通的,改完就出错了74.125.31.82 www.googlesource.com 74.125.31.82 android.googlesource.com 203.208.46.172 cache.pack.google.com 59.24.3.173 cache.pack.google.com
4.下载过程中出错:error: gnutls_handshake() failed: A TLS packet with unexpected length was received. while accessing https://android.googlesource.com/a/platform/packages/screensavers/WebView/info/refs fatal: HTTP request failed
5.关闭Ubuntu虚拟机之后无法启动系统本人就曾经遇到过这个问题,还是在基本下载完成的时候,眼看着就要重新下载了,一个师兄给我提供了解决方案,真是山重水复疑无路,柳暗花明又一村啊。可以新建一个虚拟机,将旧的虚拟机作为硬盘挂载到新的虚拟机上。再将旧虚拟机上的安卓源码目录复制到新的虚拟机上,继续执行脚本下载即可。6.下载结束时出错:
进入到frameworks/base目录,执行:error: frameworks/base/: platform/frameworks/base checkout 4b77609a983b08f163853df2a77e1d535d684aec
git reset --hard
7.下载过程中出错:Fetching projects: 0% (1/363) Fetching project platform/hardware/samsung_slsi/exynos5 fatal: Invalid gitfile format: /home/zhaoxy/develop/.repo/repo/.git/clone.bundle fatal: The remote end hung up unexpectedly
再次repo sync即可8.下载结束时出错:
是由于中间本人更换过虚拟机引起的权限问题,执行以下命令修复文件所有者及权限即可:fatal: Unable to create '/home/zhaoxy/develop/system/media/.git/index.lock': Permission denied
sudo chgrp -R zhaoxy /home/zhaoxy/develop sudo chmod -R g+w /home/zhaoxy/develop
之后遇到问题会持续补充。编译过程见下一篇博文《安卓系统源码编译系列(二)——安卓系统源码编译教程》下载完成一个版本的源码后,如果需要下载其他版本的源码,可以见《安卓系统源码编译系列(三)——常用命令》如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)转载请注明出处,谢谢! -
安卓系统源码编译系列(3)——常用命令
2015-02-15 10:36:52安卓系统源码编译系列(二)——安卓系统源码编译教程 在下载编译完成安卓源码之后,我们在阅读、调试、修改安卓源码时,可能还需要对源码进行一系列操作,如切换分支、重置等,下面我们就来看看如何对源码... -
安卓7.0源码编译
2017-05-11 11:50:16Android7.0源码编译 作者 RichsJeson 关注 2016.09.25 08:49* 字数 4625 阅读 3444评论 3喜欢 10 本人邮箱:richsjeson@gmail.com 欢迎转载,请注明出处。 本文出自自己动手编写... -
安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
2014-01-30 15:06:44本文主要对从安卓系统源码中抽取出WebView相关源码进行单独编译的流程进行说明。 -
安卓apk 反编译为 Java源码图文教程
2018-08-02 17:33:19近来在模仿写一个app,可惜只有apk,没找到源码,只好进行反编译,特记录于此,供人参考。 测试环境:win10 64位 工具: apktool(链接:https://pan.baidu.com/s/1AChm3bl6yyBJfHp4qEow6A 密码:tyol) 作用:... -
linux下使用bazel编译tensorflow安卓源码
2017-12-13 10:45:53决定学习tensorflow了,听了实验室同学的建议,安装个linux系统,然后先把安卓源码编译一下。安装AnacondaAnaconda集成了python、tensorflow、spyder(pythonIDE) 教程戳这里安装bazelgit clone ... -
安卓Android反编译教程
2019-08-21 09:37:181、自行下载反编译并解压得到以下文件并解压 apktool——可以反编译软件的布局文件、图片等资源,方便...dex2jar——将apk反编译成java源码(classes.dex转化成jar文件); http://sourceforge.net/projects/dex2... -
安卓反编译全套工具+教程
2018-01-09 11:08:33Android反编译查看资源文件及源码 在Android学习与开发的路上,我们总会遇到一些好看的界面与设计,就像旅途中遇到美丽的风景想拍下来,而作为开发者你想看看别人的界面是怎么做的,这时候反编译就排上用场了。 ... -
最新最全网络首发安卓4.0源码及内核下载编译教程(图文详解)
2011-12-20 09:45:14最新最全网络首发安卓4.0源码及内核下载编译教程(图文详解) {本教程由TD屋(WWW.TDWU.NET )提供} QQ群:183940436日期:2011-12-19 作者:TD-龙王 □未测试 ■已测试 简介:安卓4.0×××及编译,内核下载及... -
安卓 apk反编译教程
2015-09-14 14:40:23发扬 开源精神,废话不多说,下面为大家带来详细教程。 一,首先准备工具: 我已经为大家收集了工具,上传在我的github上 下载地址:https://github.com/modulemax/apk-decompile-tools/ 另附一个我自己写的app... -
CM12同步源码及编译教程
2015-10-30 21:56:00同时提供基于安卓5.0的MKL魔趣猪扒饭编译教程~【玩机组出品】魔趣猪扒饭MKL50.1编译教程http://www.oneplusbbs.com/forum.php?mod=viewthread&tid=578692 环境搭建1.安装64位Ubuntu系统(实体安装、... -
《暗黑世界》安卓APK 编译流程详细说明教程
2019-10-03 13:41:49关于开发环境的搭建,之前的相关文档已经很详细的说明,对环境的搭建请参考以前的相关文档,如有问题,及时在论坛(http://www.9miao.comm)里提问,会有管理人员快速解答,此文档主要针对eclipse下安卓编译. 首先肯定是... -
ubuntu20.4编译AOSP安卓源码(AndroidP android-9.0.0_r9)
2020-07-29 23:15:18win10预览版+ubuntu20.4LTS编译安卓aosp android-9.0.0_r9(Android P),本教程比网上绝大多数教程下载快,且占用硬盘资源至少少50G,大大节省了硬盘资源 -
android学习教程 第二期:安卓的编译方式
2015-11-03 16:33:35这一期呢主要讲的就是安卓开发前的一些环境搭建,首先是有一台Ubuntu的pc机,然后是相关命令的安装,及源码的下载编译,和源码目录的介绍 [size=10.5000pt]一、Ubuntu的安装 Ubuntu的安装其实就是一个系统的... -
CyanogenMod移植教程的安卓源码总体结构解说
2013-06-05 00:26:00解说CyanogenMod移植教程的安卓源码总体结构 – Makefile (全局的Makefile文件) – bionic (Bionic含义为仿生,这里面是一些基础的C库源代码) – bootloader (引导加载器) build目录中的... -
《暗黑世界》安卓APK 编译流程详细说明教程!(图文)
2014-08-10 12:18:00关于开发环境的搭建,之前的相关文档已经很详细的说明,对环境的搭建请参考以前的相关文档,如有问题,及时在论坛里提问,会有管理人员快速解答,此文档主要针对eclipse下安卓编译. 首先肯定是把暗黑世界的源码导入... -
Ubuntu下载编译android7.0源码教程从安装到编译
2020-08-11 12:00:34Ubuntu下载编译安卓源码 踩坑指南: 一定要使用 Ubuntu或者MAC ,至少官方推荐是这样的。Liunx中是 Ubuntu14.04 较好,其他的版本也行。其他Liunx开发版不是不可以,只是错误需要自己排除,大神随意,有时间... -
永利红色版棋牌系统安卓端苹果端服务器端等编译教程
2019-01-17 22:29:32但是,全源码的情况下搭建就不那么简单了,要进行环境的搭建,服务器端的编译,手机安卓端的编译,手机苹果端的编译,管理后台、网站前台、代理后台、api接口的编译。这些中间也会有很多坑。 先看图一,大概的目录.... -
安卓apk反编译
2019-09-21 07:59:57在win环境反编译安卓APP的.apk文件安卓apk 反编译为 Java源码图文教程Android安全攻防战,反编译与混淆技术完全解析(上) 转载于:https://www.cnblogs.com/jing1617/p/11429822.html...
-
移动端设计的思维模式
-
rtl88x2ce网卡驱动.zip
-
分布式事务之解决方案(XA和2PC)
-
C/C++字符串总结
-
A data hiding approach for the self-security of iris recognition
-
BufferedInputStream的使用
-
MonoTouch:用.NET开发iPhone应用(上)
-
vue-cli3移动端自适应配置 Vant组件库
-
物联网基础篇:快速玩转MQTT
-
Shader Forge 1.3.8 最新版
-
2021 年该学的 CSS 框架 Tailwind CSS 实战视频
-
nodebotsday:国际NodeBots日-7292017-源码
-
产品功能的场景式设计
-
EntityFramework并发处理详解
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
Measurement of nonlinear coefficient of optical fiber based on small chirped soliton transmission
-
用于无线胶囊内窥镜系统的具有极化分集的定向不敏感天线
-
MySQL Router 实现高可用、负载均衡、读写分离
-
MySQL 管理利器 mysql-utilities
-
MySQL NDB Cluster 负载均衡和高可用集群