下面是android学习手册,可以查看编译源码,360手机助手中下载,
编译环境:ubuntu9.10,widnows平台目前不被支持。
1)安装必要的软件环境
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
官方推荐的就是上面这些,如果在编译过程中发现某些命令找不到,就apt-get它。可能需要的包还有:
$ sudo apt-get install make
$ sudo apt-get install gcc
$ sudo apt-get install g++
$ sudo apt-get install libc6-dev
$ sudo apt-get install patch
$ sudo apt-get install texinfo
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install valgrind
$ sudo apt-get install python2.5(或者更高版本)
需要注意的是,官方文档说如果用sun-java6-jdk可出问题,得要用sun-java5- jdk。经测试发现,如果仅仅make(make不包括make sdk),用sun-java6-jdk是没有问题的。而make sdk,就会有问题,严格来说是在make doc出问题,它需要的javadoc版本为1.5。
因此,我们安装完sun-java6-jdk后最好再安装sun-java5-jdk,或者只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装,并只修改javadoc.1.gz和javadoc。因为只有这两个是make sdk用到的。这样的话,除了javadoc工具是用1.5版本,其它均用1.6版本:
$ sudo apt-get install sun-java6-jdk
修改javadoc的link:
$ cd /etc/alternatives
$ sudo rm javadoc.1.gz
$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz
$ sudo rm javadoc
$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc
2)设置环境变量
$ emacs ~/.bashrc
在.bashrc中新增或整合PATH变量,如下:
#java 程序开发/运行的一些环境变量
JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};
保存后,同步更新:
source ~/.bashrc
3)安装repo(用来更新android源码)
创建~/bin目录,用来存放repo程序,如下:
$ cd ~
$ mkdir bin
并加到环境变量PATH中,在第2步中已经加入。
下载repo脚本并使其可执行:
$ curlhttp://android.git.kernel.org/repo>~/bin/repo
$ chmod a+x ~/bin/repo
4)初始化repo
repo是android对git的一个封装,简化了一些git的操作。
创建工程目录:
$ mkdir android
$ cd android
repo初始化:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
在此过程中需要输入名字和email地址。初始化成功后,会显示:
repo initialized in /android
在~/android下会有一个.repo的隐藏目录。
5)同步源代码
$ repo sync
这一步要很久很久。
6)编译android源码,并得到~/android/out目录
$ cd ~/andoird
$ make
这一过程很久。
7)在模拟器上运行编译好的android
编译好android之后,emulator在~/android/out/host/linux-x86/bin下,ramdisk.img,system.img和userdata.img则在~/android/out/target/proct/generic下。
$ cd ~/android/out/host/linux-x86/bin
增加环境变量
$ emacs ~/.bashrc
在.bashrc中新增环境变量,如下
#java 程序开发/运行的一些环境变量
export ANDROID_PRODUCT_OUT=~/android/out/target/proct/generic
ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};
最后,同步这些变化:
$ source ~/.bashrc
$ cd ~/android/out/target/proct/generic
$ emulator -system system.img -data userdata.img -ramdisk ramdisk.img
最后进入android桌面,就说明成功了。
8)编译模块
android中的一个应用程序可以单独编译,编译后要重新生成system.img。
在源码目录下执行
$ . build/envsetup.sh (.后面有空格)
就多出一些命令:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
可以加—help查看用法。
我们可以使用mmm来编译指定目录的模块,如编译联系人:
$ mmm packages/apps/Contacts/
编完之后生成两个文件:
out/target/proct/generic/data/app/ContactsTests.apk
out/target/proct/generic/system/app/Contacts.apk
可以使用
$ make snod
重新生成system.img,再运行模拟器。
9)编译SDK
直接执行make是不包括make sdk的。make sdk用来生成SDK,这样,我们就可以用与源码同步的SDK来开发android了。
a)修改/frameworks/base/include/utils/Asset.h
‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改为 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’
原因是eclipse编译工程需要大于1.3M的buffer;
b)编译ADT
由于本人不使用eclipse,所以没有进行这步;
c)执行make sdk
注意,这里需要的javadoc版本为1.5,所以你需要在步骤1中同时安装sun-java5-jdk
$ make sdk
编译很慢。编译后生成的SDK存放在out/host/linux-x86/sdk/,此目录下有android-sdk_eng.xxx_linux- x86.zip和android-sdk_eng.xxx_linux-x86目录。android-sdk_eng.xxx_linux-x86就是 SDK目录。
实际上,当用mmm命令编译模块时,一样会把SDK的输出文件清除,因此,最好把android-sdk_eng.xxx_linux-x86移出来。
此后的应用开发,就在该SDK上进行,所以把7)对于~/.bashrc的修改注释掉,增加如下一行:
export PATH=${PATH}:~/android/out/host/linux-x86/sdk/android-sdk_eng.xxx_linux-x86/tools
注意要把xxx换成真实的路径;
d)关于环境变量、android工具的选择
目前的android工具有:
A、我们从网上下载的Android SDK,如果你下载过的话( tools下有许多android工具,lib/images下有img映像)
B、我们用make sdk编译出来的SDK( tools下也有许多android工具,lib/images下有img映像)
C、我们用make编译出来的out目录( tools下也有许多android工具,lib/images下有img映像)
那么我们应该用那些工具和img呢?
首先,我们一般不会用A选项的工具和img,因为一般来说它比较旧,也源码不同步。其次,也不会用C选项的工具和img,因为这些工具和img没有经过SDK的归类处理,会有工具和配置找不到的情况;事实上,make sdk产生的很多工具和img,在make编译出来out目录的时候,已经编译产生了,make sdk只是做了而已。
e)安装、配置ADT
略过;
f)创建Android Virtual Device
编译出来的SDK是没有AVD(Android Virtual Device)的,我们可以通过android工具查看:
$ android list
创建AVD:
$ android create avd -t 1 -n myavd
可以android –help来查看上面命令选项的用法。创建中有一些选项,默认就行了。
再执行android list,可以看到AVD存放的位置。
以后每次运行emulator都要加-avd myavd或@myavd选项:
$ emulator -avd myavd
10)编译linux内核映像
a)准备交叉编译工具链
android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。
b)设定环境变量
$ emacs ~/.bashrc
增加如下两行:
export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
export ARCH=arm
保存后,同步变化:
$ source ~/.bashrc
c)获得合适的内核源代码
$ cd ~/android
获得内核源代码仓库
$ git clone git://android.git.kernel.org/kernel/common.git kernel
$ cd kernel
$ git branch
显示
* android-2.6.27
说明你现在在android-2.6.27这个分支上,也是kernel/common.git的默认主分支。
显示所有head分支:
$ git branch -a
显示
* android-2.6.27
remotes/origin/HEAD -> origin/android-2.6.27
remotes/origin/android-2.6.25
remotes/origin/android-2.6.27
remotes/origin/android-2.6.29
remotes/origin/android-goldfish-2.6.27
remotes/origin/android-goldfish-2.6.29
我们选取最新的android-goldfish-2.6.29,其中goldfish是android的模拟器模拟的CPU。
$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ git branch
显示
android-2.6.27
* android-goldfish-2.6.29
我们已经工作在android-goldfish-2.6.29分支上了。
d)设定交叉编译参数
打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器.
CROSS_COMPILE ?= arm-eabi-
把
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,
$(call ld-option, -Wl$(comma)–build-id,))
这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:
LDFLAGS_BUILD_ID =
e)编译内核映像
$ cd ~/android/kernel
$ make goldfish_defconfig
$ make
f)测试生成的内核映像
$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage
② 关于android和x86的几点疑问。 android基因linux内核,系统除了内核还有其他什么
android 除了基于 Linux 内核,他的上层运行环境和相关函数库,命令程序都是自己的。
其实 android 就是一个基于 Linux 内核的 JAVA 虚拟机环境。
实际 Android 程序都是基于 JAVA 虚拟机跑的解释型语言程序。
但解释型语言程序性能肯定不如本地二进制程序。所以 Android 还有一种 NDK 程序。
也就是 Android 里面有部分本地二进制程序的内容。这样本地程序方式运行,效率可以最高而且可以根据 CPU 功能做优化(比如 neon )。
指令集不同,但他的 JAVA 虚拟机是解释型语言,基于 JAVA 语言的程序是可以无差别运行的。只要能保证 Android 上面的 JAVA 虚拟机可以在 x86 上面成功运行就行了。
但 Android 有个另外的问题,就是 JAVA 虚拟机是针对 ARM 做性能优化的,在 X86 上面,这种性能优化都没了,需要另外在 x86 上面重新优化。但听说 Android 的 JAVA 虚拟机的语言里面,也有针对 ARM 硬件进行的修改设计,所以这种针对 ARM 性能优化的 JAVA 程序,在 X86 的系统上面性能也有损失。
所以 Android 出来很久后,在 x86 上面的运行效率都一直不怎么样。
而且现在还有 NDK 程序的出现, ARM 的二进制程序在 x86 上面是不能运行的。这些程序都不能运行。
不过 x86 有个优势就是自己的性能很强,而且模拟器技术现在也很强了。在 x86 上面,可以借助虚拟机(qemu 的 user mode 就值得看看)来运行 ARM 的二进制程序。
不过虚拟机其实还是有性能损失的。
所以未来,Android 的跨 CPU 架构依然还是问题。纯 JAVA 程序好说,用了 NDK 的程序就是问题了。
不过 llvm 这个编译器又给了另外一条路,既可以虚拟机方式运行,又可以编译成本地程序而成为二进制程序来优化性能运行。或许 Android 会考虑使用这种方法或者类似的让 NDK 程序可以跨 CPU 实现。代价是 Android 要自带一个编译器,体积也不小的。
MAC OS X 还有一种方法。在 MAC 放弃 IBM 的 Power CPU 而改用 Intel 的 CPU 后,他的程序都是里面附带两套二进制程序,老的 G4 CPU 的机器,就用程序里面的 power 指令集的程序代码。新的 Intel CPU 的机器,就自动用里面的 x86 指令来运行程序。从而实现完美的双指令集运行。不过代价是这样的程序都是两套指令集的内容,体积翻倍。
目前来说,似乎用了 NDK 的程序还都不能用的。不排除现在某些 x86 的手机,使用了虚拟机技术来实现运行 NDK 程序。现在 Linux 下面的 qemu 的 usermode 配合内核的 binfmt_misc 功能,可以让系统自动识别某个架构的程序,去调用 qemu 来执行。
③ 安卓内核下载什么软件安卓内核下载
android内核是?
大家听过和Android内核最多的词语应该是“AndroidFramework”以及“Dalvik虚拟机”,那么,这两个核心部分从内部运行机制的角度来看,到底扮演着什么角色,彼此之间如何协同工作呢?了解清楚了这些,也就了解了所谓Android的核心价值,即Android内核。
从进程的角度来看,当Linux内核启动后,此时系统的状态和普通的Linux系统基本相同,通过配置Linux中的init.rc文件,可以指定内核启动后都要执行什么程序,而这之后所启动的程序才是Android系统和普通Linux应用系统的区别。
android怎样编译kernel命令make?
1.准备工作:(ubuntu111032位)
ubuntu等linuxOS,下载好eclipse,安装好JDK,安装好android的SDK,在eclipse中成功打开android手机模拟器即OK。
2.初始化编译环境:
关注该网页上的“installingrequiredpackages”,其中有的软件包因为版本问题而安装不上,不用管它,之后遇到错误再单独解决。
3.下载内核源码:
android2.3内核下载需要等待一段时间。
4.下载交叉编译器:
该步骤有可能耗费大量时间,依据网速不同,几个小时到几天不等,或许可以尝试gitclone后面的地址只下载prebuilt/linux-x86/toolchain
5.设置参数以及编译:
$exportARCH=arm
$exportSUBARCH=arm
$exportCROSS_COMPILE=arm-eabi-
$cdgoldfish//进入下载的源代码目录
$gitcheckout
$makegoldfish_defconfig
$make
安卓手机的内核是什么意思?详细点?
手机内核也是Linux内核,Android系统是基于Linux研发的,它负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定着系统的性能和稳定性,内核以独占的方式执行最底层任务,保证系统正常运行,协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等.
安卓系统如何换内核?
可以的,以Virtuous_S4A-2为例1、从网上下载Virtuous_S4A-2内核。
(注:此内核只是作为例子,并不适用于所有机型。
你要替换的内核要对应自己的机型以及版本!)
2、然后解压Virtuous_S4A-2,得到4个文件夹,分别是data,kernel,meta-inf,system。
3、在进入厨房选择0进入高级操作菜单,选择20,boot.img工具4、选择S查看一下内核信息,用笔记录相关信息以便完成后核对数据。特别是基址。
5、复制完文件后,我们回到厨房工具,选择b,新建boot.img6、建完后,查看新的boot.img信息。看基址是否一样。
7、替换内核后,我们也要选择23把update-script格式转换为updater-script格式。
然后和上面一样,打包!签名!
如何给手机安装内核?
无法手动安装,浏览器内核是固定的,可以升级官方更新好的,内核可能会自动升级,或者重新下载高版本。
④ 自己可以编译安卓源码吗
用最新的Ubuntu 16.04,请首先确保自己已经安装了Git.没安装的同学可以通过以下命令进行安装:
sudo apt-get install git git config –global user.email “[email protected]” git config –global user.name “test”
其中[email protected]为你自己的邮箱.
简要说明
android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.下文也将按照该流程讲述.
源码下载
由于某墙的原因,这里我们采用国内的镜像源进行下载.
目前,可用的镜像源一般是科大和清华的,具体使用差不多,这里我选择清华大学镜像进行说明.(参考:科大源,清华源)
repo工具下载及安装
通过执行以下命令实现repo工具的下载和安装
mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo
补充说明
这里,我来简单的介绍下repo工具,我们知道AOSP项目由不同的子项目组成,为了方便进行管理,Google采用Git对AOSP项目进行多仓库管理.在聊repo工具之前,我先带你来聊聊多仓库项目:
我们有个非常庞大的项目Pre,该项目由很多个子项目R1,R2,...Rn等组成,为了方便管理和协同开发,我们为每个子项目创立自己的仓库,整个项目的结构如下:
这里写图片描述
执行完该命令后,再使用make命令继续编译.某些情况下,当你执行jack-admin kill-server时可能提示你命令不存在,此时去你去out/host/linux-x86/bin/目录下会发现不存在jack-admin文件.如果我是你,我就会重新repo sync下,然后从头来过.
错误三:使用emulator时,虚拟机停在黑屏界面,点击无任何响应.此时,可能是kerner内核问题,解决方法如下:
执行如下命令:
通过使用kernel-qemu-armv7内核 解决模拟器等待黑屏问题.而-partition-size 1024 则是解决警告: system partion siez adjusted to match image file (163 MB >66 MB)
如果你一开始编译的版本是aosp_arm-eng,使用上述命令仍然不能解决等待黑屏问题时,不妨编译aosp_arm64-eng试试.
结束吧
到现在为止,你已经了解了整个android编译的流程.除此之外,我也简单的说明android源码的多仓库管理机制.下面,不妨自己动手尝试一下.
⑤ eBPF on Android之编译内核与打补丁(解决触摸和WIFI失效问题)
本文为看雪论坛优秀文章
看雪论坛作者ID:seeeseee
一、前言在之前尝试ptach内核时,配置CONFIG_KRETPROBES后遇到了触摸和WIFI失效的问题。后经missking指导,发现修改内核编译选项的操作不正确。正确的步骤如下:
但即便如此,编译出的内核仍然导致触摸和WIFI失效。后续参考多个帖子,解决了触摸问题,但WIFI问题未能解决。
刷自编译内核导致的触摸屏失灵问题、正确的自编译内核操作及解决触摸屏问题的步骤、内核编译问题、单独编译内核的方法、解决触摸屏失灵问题的实践篇、内核编译内文以及相关补丁操作等,均被提及。在一系列操作后,触摸功能得以修复,但WIFI问题仍然悬而未决。
经过进一步探索,发现单独编译内核且包含boot.img的正确方式,这与之前的操作有所区别。对于BUILD_BOOT_IMG的设定和其中的GKI_RAMDISK_PREBUILT_BINARY、VENDOR_RAMDISK_BINARY的理解,以及boot.img解包和生成所需文件的过程,都有了更深入的了解。
通过分析build/build.sh脚本,明确当BOOT_IMAGE_HEADER_VERSION为3时,需指定GKI_RAMDISK_PREBUILT_BINARY和KERNEL_VENDOR_CMDLINE。解包boot.img后,根据文件信息调整BUILD_BOOT_IMG、BASE_ADDRESS、PAGE_SIZE、KERNEL_CMDLINE和KERNEL_BINARY的值,确保正确生成initramfs.cpio和VENDOR_RAMDISK_BINARY。补丁添加bpf_probe_read_user功能,确保内核能正常读取用户空间数据。
进行内核编译配置调整,包括修改内核编译配置选项,确保触摸屏和WIFI功能正常。操作步骤包括进入内核源码目录、生成floral_defconfig、打开内核编译配置界面、保存并退出配置、覆盖floral_defconfig文件、删除.config文件等。最终,通过正确编译命令生成可正常使用的boot.img文件,解决触摸屏和WIFI失效问题。
二、环境搭建环境时,请根据需要添加代理连接。首先,根据官方指南安装所需库和软件,并创建工作目录。选择与手机内核版本对应的分支(如Pixel 4XL对应的android-msm-coral-4.14-android13),同步内核源代码并使用官方说明操作。注意,如果没有设置编译工具,可手动同步代码或使用官方提供的工具。
三、步骤操作步骤包括:
通过解决触摸屏失灵和WIFI失效问题,了解到单独编译内核并生成boot.img的正确方法。在内核编译过程中,明确相关选项和参数的重要性,确保生成的内核能正常运行触摸和WIFI功能。通过实践操作,内核可实现正常启动、触摸和WIFI功能正常,同时支持eBPF设定。