导航:首页 > 源码编译 > androidlinux内核源码编译

androidlinux内核源码编译

发布时间:2022-09-11 00:03:49

A. 如何编译android手机源码

编译android系统源码准备工作:
下载android源码
在windows上用gitbash ,git clone 下载代码
linux上这样下载
创建~/bin目录,用来存放repo程序,如下:

$ cd ~
$ mkdir bin
初始化repo
repo是android对git的一个封装,简化了一些git的操作。
创建工程目录:
$ mkdir android
$ cd android
下载repo脚本并使其可执行:
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
repo初始化:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
在此过程中需要输入名字和email地址。初始化成功后,会显示:
repo initialized in /android
在~/android下会有一个.repo的隐藏目录。
5)同步源代码
$ repo sync
这一步要很久很久。
安装linux系统,推荐ubuntu,图形界面
安装编译需要的支持包
$ 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
安装java6.0
$ sudo apt-get install sun-java6-jdk
配置java环境
sudo gedit ~/.bashrc

末尾加上

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};
sudo source ~/.bashrc
是环境变量生效

编译android源码,并得到~/android/out目录

$ cd ~/andoird
$ make
这一过程很久。
这就编译结束了

B. 如何在32位ubuntu11.10 下编译android 4.0.1源码和goldfish内核

一准备工作

1安装javasdk6
(1)从jdk官方网站http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html下载jdk-6u29-linux-i586.bin文件。
(2)执行jdk安装文件

[html] view plain
$chmod a+x jdk-6u29-linux-i586.bin
$jdk-6u29-linux-i586.bin

(3)配置jdk环境变量

[html] view plain
$sudo vim /etc/profile
[html] view plain
#JAVAEVIRENMENT
exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
exportJRE_HOME=$JAVA_HOME/jre
exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

保存后退出编辑,并重启系统。
2安装依赖包

[html] view plain
$sudo apt-get install git-core gnupg flex bison gperf build-essential\
zipcurlzlib1g-devlibc6-devlib32ncurses5-devia32-libs\
x11proto-core-devlibx11-devlib32readline5-devlib32z-dev\
libgl1-mesa-devg++-multilibmingw32tofrodospython-markdown\
libxml2-utils

3用repo工具下载源码
(1)初始化repo

[html] view plain
$cd ~
$mkdir bin
$curlhttps://dl-ssl.google.com/dl/googlesource/git-repo/repo>~/bin/repo
$chmod a+x ~/bin/repo
$exportPATH=$PATH:~/bin(导出环境变量)

(2)下载android最新源码

[html] view plain
$mkdir android
$cd android
$ repo init -u https://android.googlesource.com/platform/manifest -bandroid-4.0.1_r1
...(输入用户名和邮箱名)
$repo sync -j5
...(此处用5个线程开始下载源码,下载过程及其漫长,需要耐心等待)

二 编译源码
1开始编译

[html] view plain
$source build/envsetup.sh
includingdevice/samsung/maguro/vendorsetup.sh

includingdevice/samsung/tuna/vendorsetup.sh

includingdevice/ti/panda/vendorsetup.sh

includingsdk/bash_completion/adb.bash

$make-j4(此处用4个线程编译)

编译完成后,会看到类似的输出:

[html] view plain
Targetramdisk:out/target/proct/generic/ramdisk.img
Targetuserdatafsimage:out/target/proct/generic/userdata.img
Installedfilelist:out/target/proct/generic/installed-files.txt

2编译遇到的问题
编译错误:

[html] view plain
<命令行>:0:0:错误:“_FORTIFY_SOURCE”重定义[-Werror]

<built-in>:0:0:附注: 这是先前定义的位置

cc1plus:所有的警告都被当作是错误

make:*** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o]错误 1

原因:
因机器上的gcc版本过高,需替换成4.4.6重新进行编译。
解决方法:
1)安装4.4版本的gcc和g++

[html] view plain
$ sudo apt-get install gcc-4.4
$ sudo apt-get install g++-4.4

2)设置gcc版本,使gcc链接到gcc-4.4

[html] view plain
$ ls -l /usr/bin/gcc*

lrwxrwxrwx 1 root root 7 2011-11-01 23:56 /usr/bin/gcc -> gcc-4.6

-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 /usr/bin/gcc-4.4

-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 /usr/bin/gcc-4.6

$ cd /usr/bin
$ sudo mv gcc gcc.bak
$ sudo ln -s gcc-4.4 gcc

3)设置g++版本,使g++链接到g++-4.4

[html] view plain
$ sudo mv g++ g++.bak
$ sudo ln -s g++-4.4 g++

4)设置完毕后,重新进行编译即可

3从模拟器启动编译后的镜像文件
1)设置环境变量:

[html] view plain
export PATH=~/android/out/host/linux-x86/bin:$PATH

export ANDROID_PRODUCT_OUT=~/android/out/target/proct/generic

其中linux-x86/bin存放模拟器emulator工具,proct/generic存在编译后的镜像文件。

2)启动模拟器

[html] view plain
$emulator

emulator:WARNING: system partition size adjusted to match image file (162 MB >66 MB)

启动后的截图:

三 编译androidgoldfish内核
1)进入android4.0.1源码目录,下载goldfish内核源码

[html] view plain
$ mkdir kernel
$ cd kernel
$ git clone http://android.googlesource.com/kernel/goldfish.git
$ cd goldfish
$ git branch -a
* (no branch)

master

remotes/origin/HEAD -> origin/master

remotes/origin/android-goldfish-2.6.29

remotes/origin/master

$ git checkout remotes/origin/android-goldfish-2.6.29

2)修改Makefile

[html] view plain
goldfish$ gedit Makefile

修改

[html] view plain
ARCH ?=$(SUBARCH)
CROSS_COMPILE ?=



[html] view plain
ARCH ?=arm
CROSS_COMPILE ?=arm-eabi-

3)导出交叉编译器目录为环境变量
$ export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

4)编译内核

[html] view plain
goldfish$ make goldfish_armv7_defconfig

goldfish$ make

编译完成后,可看到类似如下的输出:

[html] view plain
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready

5)从模拟器中启动内核镜像

[html] view plain
$emulator -kernel ~/android/kernel/goldfish/arch/arm/boot/zImage &

启动模拟器后,可从Settings->System->AboutPhone中查看内核版本信息。

C. 如何在 Android 源码环境下增大 Linux 内核的 kernel log 的缓存...

需要修改 Linux 内核源码中的一个控制 log buffer size 的宏:CONFIG_LOG_BUF_SHIFT,buffer size 是 2 ^ shift,加大这个就可以。

一、配置

$ make menuconfig

General setup
(18)Kernel log buffer size (16 => 64KB,17 => 128KB)

二、源码

kernel/printk.c

#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)

static char __log_buf[__LOG_BUF_LEN];

可以看到,是已经在编译时定死的一块静态空间,不能动态调整了。对于内核日志,唯一可以调整的在:/proc/sys/kernel/printk*

三、限制

init/Kconfig

config LOG_BUF_SHIFT
int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
range 12 21
default 17
help
Select kernel log buffer size as a power of 2.
Examples:
17 => 128 KB
16 => 64 KB
15 => 32 KB
14 => 16 KB
13 => 8 KB
12 => 4 KB

可以看到 shift 最大值限制到了 21,也就是:2 M

$ echo "(2^21)/1024/1024" | bc
2

如果再要加大,只能改源码了。

D. android 怎样编译kernel 命令 make

方法如下:
在Linux的环境下:
建立目录:

mkdir ~/android-kernel cd android-kernel

下载源代码, 大概有280MB, 慢慢等哈~~~ (当然你要先安装git) git clone git://git.linuxtogo.org/home/groups/mobile-linux/kernel.git
类似的屏幕信息:
Initialized empty Git repository in /home/user/android-kernel/kernel/.git/ remote: Counting objects: 908251, done.
remote: Compressing objects: 100% (153970/153970), done.
remote: Total 908251 (delta 755115), reused 906063 (delta 753016) Receiving objects: 100% (908251/908251), 281.86 MiB | 292 KiB/s, done. Resolving deltas: 100% (755115/755115), done. Checking out files: 100% (22584/22584), done.
然后去到htc-msm branch: cd kernel
git checkout -b htc-msm origin/htc-msm
屏幕信息:
Branch htc-msm set up to track remote branch refs/remotes/origin/htc-msm. Switched to a new branch "htc-msm"

下载ARM的toolchain, 大概64MB左右, 下到~/android-kernel: 下

:
http://www.codesourcery.com/gnu_toolchains/arm/portal/package2549/public/arm-none-linux-gnueabi/arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

cd ~/android-kernel
tar xjf arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
编译kernel

准备缺省的Kaiser 配置文件.config
cd ~/android-kernel/kernel

make htckaiser_defconfig ARCH=arm
然后编译zImage:
export PATH=~/android-kernel/arm-2008q1/bin:$PATH
make zImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
编译好的在: ~/android-kernel/kernel/arch/arm/boot/zImage

如果你的机器是多核的, 可以编译的时候用-j <cores/cpus_number>来加速:
比如, 双核的可以:
make -j 2 zImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi
满意请采纳谢谢

E. 编译android 源码需要sdk环境吗

下面是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

F. 按android官网下载的android源码里面有linux内核kernel吗

从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是使用预先编译好的内核,也就是prebuilt/android-arm/kernel/kernel-qemu文件。

G. 如何编译android kernel

1.准备工作: (ubuntu1110 32位)
ubuntu等linuxOS,下载好eclipse,安装好JDK, 安装好android的SDK, 在eclipse中成功打开android 手机模拟器即OK。

2.初始化编译环境 :
关注该网页上的“installing required packages”,其中有的软件包因为版本问题而安装不上,不用管它,之后遇到错误再单独解决。

3.下载内核源码:
android 2.3 内核 下载需要等待一段时间。

4.下载交叉编译器:
该步骤有可能耗费大量时间,依据网速不同,几个小时到几天不等,或许可以尝试git clone 后面的地址只下载prebuilt/linux-x86/toolchain

5.设置参数以及编译:
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ cd goldfish // 进入下载的源代码目录
$ git checkout <commit_from_first_step> //这个步骤我没有做,不知道干嘛用的
$ make goldfish_defconfig
$ make

6.报错信息:
若有报错说找不到 (arm-eabi-gcc command not found)等等,尝试使用http://blog.csdn.net/davidbeckham2901/article/details/7397447 中说到的解决方案即可(即采用另外一个交叉编译器)。

7.测试:

最后,测试一下刚才编译的内核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系统找不到,可以去android SDK中某文件夹找到,加入系统PATH即可。 -avd后面的参数 myavd即为模拟器的名字,这个我是在eclipse中的模拟器管理中新建的一个模拟器,用那个模拟器的名字即可。 -kernel后面的参数就找到刚才编译出的内核的路径。
若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间,3分钟到15分钟不等。

H. 如何编译Android的kernel

1.准备工作: (ubuntu1110 32位)
ubuntu等linuxOS,下载好eclipse,安装好JDK, 安装好android的SDK, 在eclipse中成功打开android 手机模拟器即OK。

2.初始化编译环境 :
关注该网页上的“installing required packages”,其中有的软件包因为版本问题而安装不上,不用管它,之后遇到错误再单独解决。

3.下载内核源码:
android 2.3 内核 下载需要等待一段时间。

4.下载交叉编译器:
该步骤有可能耗费大量时间,依据网速不同,几个小时到几天不等,或许可以尝试git clone 后面的地址只下载prebuilt/linux-x86/toolchain

5.设置参数以及编译:
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ cd goldfish // 进入下载的源代码目录
$ git checkout <commit_from_first_step> //这个步骤我没有做,不知道干嘛用的
$ make goldfish_defconfig
$ make

6.报错信息:
若有报错说找不到 (arm-eabi-gcc command not found)等等,尝试使用采用另外一个交叉编译器。

7.测试:

最后,测试一下刚才编译的内核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系统找不到,可以去android SDK中某文件夹找到,加入系统PATH即可。 -avd后面的参数 myavd即为模拟器的名字,这个我是在eclipse中的模拟器管理中新建的一个模拟器,用那个模拟器的名字即可。 -kernel后面的参数就找到刚才编译出的内核的路径。
若启动模拟器失败,可尝试关闭后再启动。第一次启动模拟器时可能需要等待比较长的时间。

I. 怎么在Android程序里加载linux内核模块

工具/原料

Android程序里加载linux内核模块
方法/步骤

java层。 java.lang.Runtime's exec() methods:native层就是jni了。
可以用popen() 。
但指令知否支持就得看bionic了。
也可以尝试system() and pipe。
普通apk不可能有root权限,除非机器被root了,使用Runtime.exec之类的执行su -c insmod xx.kosu为root的象征,配合superuser使用 。
在终端下使用su进入root用户,然后insmod xx.ko这个肯定可以成功的,因为insmod在root用户下执行的。但是Java的Runtime.exec()也好,Native层execl()也好,只能用su -c命令临时在root用户下执行一条指令。adb shell进入终端,普通用户下执行su -c insmod xx.ko,会发现命令执行失败,失败原因就是需要注意的地方,su的-c参数只把下一个变量作为可执行的指令,因此其执行的命令是insmod而参数并没有传递过去,xx.ko作为了su的参数,因此如果想执行成功我们需要使用su -c "insmod xx.ko",将传递给insmod的参数和命令组合成一个参数。这样的话在Java层和Native层执行失败的问题也可以解决了,在Runtime.exec()中将命令格式进行格式化,比如Runtime.exec(“su -c ” + "\"insmod xx.ko\"" ),或者在Native中执行execl("/sytem/bin/su","/sytem/bin/su","-c","insmod xx.ko", NULL),这样最终传递给shell的命令就是su -c "insmod xx.ko"了。

J. 编译linux内核和编译linuxROM有什么区别

如果我没理解错的话,你的“linux
内核”是针对PC,intel处理器;“linux
ROM”是针对移动设备(比如adnroid
内核),ARM处理器。那区别就是编译器把内核翻译成intel能懂的机器语言,还是arm能懂得,他们架构完全不一样以及使用完全不同的指令集。
//////////////////////////////////////////////////////////////////////////////
android内核是指google
基于linux
kernel定制的操作系统内核,主要添加了一些android设备驱动,是具备跨平台能力的源码;android
ROM是指编译好的整个android操作系统,不光光是内核了,还有外围的一些库,等等;andriod源码是指整个android
操作系统的源码,包括内核,各种库,java层封装,sdk等等。

阅读全文

与androidlinux内核源码编译相关的资料

热点内容
卡尔曼滤波算法书籍 浏览:768
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:843
安卓怎么下载60秒生存 浏览:802
外向式文件夹 浏览:233
dospdf 浏览:430
怎么修改腾讯云服务器ip 浏览:387
pdftoeps 浏览:492
为什么鸿蒙那么像安卓 浏览:735
安卓手机怎么拍自媒体视频 浏览:185
单片机各个中断的初始化 浏览:723
python怎么集合元素 浏览:480
python逐条解读 浏览:832
基于单片机的湿度控制 浏览:498
ios如何使用安卓的帐号 浏览:882
程序员公园采访 浏览:811
程序员实战教程要多长时间 浏览:974
企业数据加密技巧 浏览:134
租云服务器开发 浏览:813
程序员告白妈妈不同意 浏览:335
攻城掠地怎么查看服务器 浏览:600