技术标签: android 4.4 源码编译
1. 学习前言
最近换了台电脑,只能重新装虚拟机重新编译android源码以及内核了。源码按照网上的流程(经典的老罗之旅以及其他)基本上可以编译通过。我再网上下载了一个别人压缩好的包,配置一下javap基本上一次编译就通过。但是android内核编译却遇到了不少问题。
尽管,这些编译过程看似只要动动手就可以了,但是我发现重复几次以后对其中的一些问题还是有了很多新的感性的认识。很突出的一点就是遇到问题的第一个反应不是直接到网上找答案,而是参考一下别人的自己想一想然后自己慢慢的去解决掉。这算是一次次的重复动手的一个小小收货吧。下面把这次编译碰到的一些问题稍微记录一下。
2. 内核编译步骤
(1) 下载内核源码:这个由于google被墙了,但是还可以通过各种途径下载到。我的android是4.4.2的,内核源码下载的是android-goldfish-3.4。下载完成以后,将内核源码加压缩到android源码目录中。模仿网上的路径,在android源码根目录下创建kernel/common,然后解压缩到该目录下.
解压命令:tar –xzvf android-goldfish-3.4.tar.gz XXX/kernel/common(xxx代表android根目录)
(2) 修改内核源码文件权限:由于编译的时候会涉及到不少权限的问题,所以为了偷个懒我就把解压缩的内核文件全部改为777了,
权限修改命令:sudo chmod 777 –Rkernel/common/
(3) 编译配置:编译配置这个地方很重要,配置不好后面会编译不通过。
首先最重要的是配置gcc,配置的命令是:export PATH=$PATH:(gcc所在的目录bin),gcc所在的目录bin在不同的版本中又差别很大,一般的是在XXX/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin目录下,但是我下载的4.4.2的还真不在这里,配置了以后运行make直接报错。待会综合下面的配置讲解这里的错误问题。
然后,修改Makefile文件,将Makefile中的
ARCH ?= (SUBARCH) 改为:ARCH ?= (SUBARCH)
CROSS_COMPILE?= CROSS_COMPILE?=arm-eabi-
(4) 内核编译:进入XXX/kernel/common/执行make goldfish_defconfig运行完以后执行make,不过有人严肃的提出来用4.4.0以上的用make goldfish_defconfig会有很多问题,要用make goldfish_armv7_defconfig 我就直接用了后面这个,即执行make goldfish_armv7_defconfig 然后直接make ,最后可以看到arch/arm/boot/zImageis ready。
(5) 编译问题:编译的过程中会出现很多问题了,最主要的是(3)中的配置问题。
首先:如果4.4.2中的gcc所在的bin目录是XXX/prebuilts/gcc/linux-x86/arm/arm-eabi-4.X/bin。这个路径也不是绝对的,如果这里配置不好会报出arm-eabi-gcc命令找不到。所以最好如果找不到arm-eabi-gcc所在的路径的话,可以在内核源码目录通过find命令查找:
===》find ./XXXandroid根目录 -name arm-eabi-*
当然网上也有说是新的arm-eabi-gcc不适合用于4.4以上的编译,可以自己去下载一个新的gcc环境编译,我没试过,不过我觉得android自带的应该可以搞定的,只要配置正确。然后到查到到的路径下面,前面的路径可能不同,但是后半部分的路径基本上是linux-x86/arm/arm-eabi-4.X,这个地方可能会有很多个目录,可以进到每个目录里看看是不是每个目录下的bin中都有gcc这个文件,如果有就可以通过export选择一个配置的path下。
然后,将上面的路径环境配置好了以后,可能还会报一下莫名其妙的错误,比如某个文件permission denied等等,还有
scripts/kconfig/conf -s arch/arm/Kconfig
*** Error during writing of the kernel configuration.
make[2]: *** [silentoldconfig] Error 1
make[1]: *** [silentoldconfig] Error 2
CHK include/linux/version.h
make: *** No rule to make target `include/config/auto.conf',needed by `include/asm-arm/.arch'. Stop
类似的错误,这个奇怪的错误应该是跟权限有关系的,如果我们用普通用户配置了上面的gccb所在的bin目录,但是修改Makefile的时候却用sudo gedit Makefile的话,就会报这些莫名其妙的错误,通过实验把所有的文件全部设置为777,再用普通用户配置路径,修改Makefile等文件去编译就基本没问题了。
(6)ps 虚拟机打开:编译完成以后迫不及待的配置好环境以后打开模拟器,但是输入emulaotr以后却报出如下的错误:
emulator: ERROR: You did not specify a virtualdevice name, and the system directory could not be found.
If you are an Android SDK user, please use'@' or '-avd '
to start a given virtual device (see-help-avd for details).
Otherwise, follow the instructions in-help-disk-images to start the emulator
上网上查了一下,这个错误解决方法可以通过输入:
. build/envsetup.sh
lunch aosp_arm-eng
最后再输入emulator命令即可解决上述问题,(参考网址忘记记录了)。
模拟器的打开可以采用默认的内核,也可以用自己编译好的内核,整体打开的步骤如下:
==》export PATH=$PATH:~/XXXandroid根目录/out/host/linux-x86/bin
==》exportANDROID_PRODUCT_OUT=~/android目录/out/target/product/generic
==》emulator(用默认的内核,下面的命令是用自己刚刚编译好的内核)
==》emulator -kernel./kernel/common/arch/arm/boot/zImage &
==》报上述提出的错误:
==》. build/envsetup.sh
==》lunch aosp_arm-eng
==》emulaotr的命令
==》模拟器打开成功
(7) ps单独子模块的编译:单独子模块的编译,参照老罗的Android之旅方法是:
==》. build/envsetup.sh
==》mmm /需要编译的子模块
==》make snod
但是这个方法在2.X版本的时候测试的是可以,但是我用4.4.2的版本用这个的时候,最后出了一个大大的错误,编译完成以后提示你system.img没了,需要rebuild,没办法只能重新编译android源码,但是编译子模块是不能再用上述的方法了,查了一下别人的提供的方法,并对email的app的名字在配置文件中做了修改,修改完重新编译email子模块,问题解决,该方法步骤如下:
==》. build/envsetup.sh
==》mmm packages/apps/Email/
==》make showcommandsWITH_DEXPREOPT=false
然后,在运行enulator发下email的名字改成我之前修改的名字了。
参考网站(http://blog.csdn.net/xueerfei008/article/details/21456321)。
(8) ps需要补充的留白……
3. 总结
内核编译基本这些内容了,学习还要深入一些,最近的东西都学得半截拉快的,JNI和NDK的学习过程一直没间断,但是每次想记录自己写的东西都感觉很吃力,可能自己懂了跟有条理的整理下来中间还需要很多功夫和功力的。所以也非常佩服那些专栏的技术博客大牛,不但自己能懂还能系列化地写出来要别人看懂,真不简单!后面计划把前面学习过的NDK和JNI学习心得blog写完。不管自己写的怎么样,每次记录都是一次旅行,在这个过程中会发现很多细节的问题,也会发现自己对技术整体把握的欠缺。我想就算像蜗牛一样慢,也要一步一步往上爬。
继续努力,Keep moving!!!
梅森素数Problem : 120Time Limit : 1000msMemory Limit : 65536Kdescription由于梅森学识渊博,才华横溢,为人热情以及最早系统而深入地研究2p-1 型的数(其中p为素数),为了纪念他,数学界就把这种数称为“梅森
布雷柯蒂斯距离(Bray Curtis Distance)主要用于生态学和环境科学,计算坐标之间的距离。该距离取值在[0,1][0,1][0,1]之间,也可以用来计算样本之间的差异。nnn维空间中的布雷柯蒂斯距离为:d(x,y)=∑i=1n∣xi−yi∣∑i=1nxi+∑i=1nyid(x, y)=\frac{\sum_{i=1}^n|x_i-y_i|}{\sum_{i=1}^nx_i+\sum_{i=1}^ny_i}d(x,y)=∑i=1nxi+∑i=1nyi∑i=1n∣xi−yi∣下
总结了一下关于Halcon的 Object-Recognition-3D:1. 基于控制点的位姿估计:首先,得确定相机的内外参,其次,选择三个或以上容易和准确地从图像中提取的点作为控制点,通过确定控制点的三维坐标来确定物体的位姿2. 基于形状的匹配:利用三维计算机辅助设计(CAD)模型生成三维形状模型,三维形状模型由从不同视图中看到的三维物体的二维投影组成,需要限制形状模型的允许姿态范围,从而最小...
人们每天平均有8个小时在睡觉,但一般都会有超过8个小时在工作。占据人们时间的场景,总会形成这样或者那样的商业价值。办公空间诞生了WeWork这样的现象级公司,打印机由惠普、爱普生等巨头主宰,网络通信则由三大运营商和华为中兴们的服务,我对着的PC是苹果、微软、戴尔们的世界。PC内更有一揽子软件服务,来满足办公室内用户文档、沟通、协作、审批、日程、安全相关的诸多办公需求。办公,是一个庞大的刚性需求市场...
(一)QODBC数据库编程连接详细介绍QT自带有QODBC Driver,在Windows平台上通过系统提供的ODBC Driver可以访问支持ODBC的数据库,如Ms Access、SQL Server等 (Windows XP 自带有Access和SQL Server的ODBC Driver)。 QT QODBC数据库编程连接详细介绍是本文所介绍的内容,QT为数据库编程提供
问题描述:用牛顿迭代法求解方程2x3-4*x2+3x-6=0在1.5附近的近似解,误差小于1e-5#include <stdio.h>#include <math.h>int main () { float x,x0, f1, f2; printf("请输入一个近似解:\n"); scanf("%f", &x); do { x0 = ...
《How Tomcat Works》这本书的读书笔记,及主要内容感想。作为一个世界范围广泛使用的强大框架,Tomcat必然有非常多的设计思想、设计模式,让我们学习。不看这种包含设计思想的框架,只看关于设计的书籍,只做业务应用系统的开发,比较难提高设计能力,因为,业务系统更关注业务问题,可能比较常会遇到大数据、高并发类问题的解决,但是设计思想很少。从高层到底层,从业务应用到通用框架,最后都会回到底层上来,底层的东西,更像技术。越往高层,业务占得比重越大,越容易脱离技术本身。底层的东西有什么呢?比如
这个算子的作用就是从图像中提取出零交叉点。所谓零交叉点,是指在正弦函数图像中的过零点,也就是上一刻为正,下一刻就变成负的那个点,这样一想自然就是x轴上的点了。但是在图像中稍微有些不同。 那么在图像中什么是zero-crossing?答:图像中灰度值为0的点,以及那些4-邻域中至少有一个点的灰度值和该点的灰度值有不同符号的那些点。其实更深刻地理解,就是二阶导数一个正值点和一个负值点相连之后与x轴的交...
1.通过select 进行定位下拉框下拉框如图所示 通过代码定位#通过index进行选择Select(driver.find_element_by_id("cardType")).select_by_index(1)#通过value进行选择#Select(driver.find_element_by_id("cardType")).select_by_value(1)#通过选项文字进行选择#Se...
介绍见http://zh.wikipedia.org/wiki/MeshLab
一、引言本来想记录一下关于用户登陆和登陆之后的权限管理、菜单管理的问题,想到解决这个问题用到Interceptor,但想到了Interceptor,就想到了Filter,于是就想说一下它们的执行顺序和区别。关于Interceptor解决权限和菜单管理的问题,在放在下一篇写吧,就酱紫。二、区别1、过滤器(Filter)首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下...
为什么80%的码农都做不了架构师?>>> ...