修改boot.img文件的工具,mkbootfs,mkbootimg,unpackbootimg

来源:互联网 发布:淘宝改打折影响权重吗 编辑:程序博客网 时间:2024/05/01 04:31


转载
#编译mkbootfs,mkbootimg,unpackbootimg
#首先要得到android_system_core的源代码,从github.com上面下载得到
#其中要编译的三个文件分别位于CyanogenMod-android_system_core-***的目录里面的不同文件夹中。
下面的代码是经过我修改的:

http://pan.baidu.com/share/link?shareid=104897&uk=2265432600

CyanogenMod-...m-core-sn.zip

其中mkbootfs的源代码位于cpio文件夹中
mkbootimg和unpackbootimg位置mkbootimg文件夹中
#使用的工具是linux系统的gcc
PS:如果需要交叉编译,就需要下载我制作的交叉编译器
下面讲解一下编译的过程:
一 讲解编译mkbootfs文件
1.分析Android.mk(此文件位于cpio目录里面)
目录路径如下:
/home/username/CyangenMod-android_system_core-***(其中的*代表的是标识码)/cpio/Android.mk
使用gedit打开此文件,
得到的内容如下:
----------cut here-----------------------
# Copyright 2005 The Android Open Source Project

LOCAL_PATH:= $(call my-dir)    #得到本目录的位置
include $(CLEAR_VARS)         #其中这句表示声明编译的开始。

LOCAL_SRC_FILES := \           #源代码文件
 mkbootfs.c

LOCAL_MODULE := mkbootfs        #生成的文件名

include $(BUILD_HOST_EXECUTABLE)     #生成在本机使用的可执行文件

$(call dist-for-goals,droid,$(LOCAL_BUILT_MODULE))   #这句就不知道是什么意思了
--------------------------------------------------

2.制作自己使用的makefile
从上面的Android.mk文件中得到如下的信息:
编译用到的源代码文件是mkbootfs.c,生成的文件是一个可执行的文件,
没有加入编译参数,生成的文件在本机运行。
所以我制作的makefile如下所示:
----------------cut here------------------------
#makefile for arm-mkbootimg
#create by sn

 #arm-linux-androideabi- #这句是我在编译android版本的mkbootfs用到的。
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
EXEC = arm-mkbootfs
OBJ = mkbootfs.o
SRC = mkbootfs.c
$(EXEC):$(OBJ) ;$(CC) -o $@ $<
$(OBJ):$(SRC) ;$(CC) -fPIC -c -o $@ $<

clean:
 rm -f $(OBJ) $(EXEC)

-------------------------------------------

--------------------------------------------------
3.查看源代码中的头文件关链问题。
/*mkbootfs.c */中的头文件声明问题如下
------------------cut here-----------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

#include <stdarg.h>
#include <fcntl.h>

#include <private/android_filesystem_config.h>
--------------------------------------------
为了能让编译通过,得修改最后一个头文件声明位置,修改为如下:
---------------
#include "android_filesystem_config.h"  
-------------------------------------
最后要做的是,把CyangenMod-android_system_core-**/include/private/android_filesystem_config.h文件复制到当前的目录即是CygenMod-android_system_core-**/cpio目录里面。
4.在终端里面使用make,来编译生成mkbootfs
5.如果需要交叉编译的,就把makefile中的
CROSS_COMPILE =  #这句补充完整。

二 编译mkbootimg和unpackbootimg
1.分析mkbootimg文件夹中的Android.mk文件
-------------------cut here--------------
LOCAL_PATH:= $(call my-dir)  #这句是声明当前的目录
include $(CLEAR_VARS)

LOCAL_SRC_FILES := mkbootimg.c       #要用到的源代码是mkbootimg.c
LOCAL_STATIC_LIBRARIES := libmincrypt   #此句声明要使用的静态库文件是libmincrypt.a

LOCAL_MODULE := mkbootimg

include $(BUILD_HOST_EXECUTABLE)    #上当的内容是编译mkbootimg的命令。

include $(CLEAR_VARS)             #从这里开始到是编译unpackbootimg的部分
LOCAL_MODULE_TAGS := eng
LOCAL_SRC_FILES := unpackbootimg.c
LOCAL_MODULE := unpackbootimg
include $(BUILD_HOST_EXECUTABLE)      #编译unpackbootimg的部分

include $(CLEAR_VARS)                   #下面的部分也是编译mkbootimg和unpackbootimg的,但是加载的库文件就多了一个libcutils.so。所以我主要要上面的部分为规则。
LOCAL_SRC_FILES := mkbootimg.c
LOCAL_STATIC_LIBRARIES := libmincrypt libcutils libc
LOCAL_MODULE := utility_mkbootimg
LOCAL_MODULE_STEM := mkbootimg
LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
LOCAL_UNSTRIPPED_PATH := $(PRODUCT_OUT)/symbols/utilities
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE_TAGS := eng
include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := unpackbootimg.c
LOCAL_STATIC_LIBRARIES := libcutils libc
LOCAL_MODULE := utility_unpackbootimg
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_STEM := unpackbootimg
LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES
LOCAL_UNSTRIPPED_PATH := $(PRODUCT_OUT)/symbols/utilities
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities
LOCAL_FORCE_STATIC_EXECUTABLE := true
include $(BUILD_EXECUTABLE)

$(call dist-for-goals,droid,$(LOCAL_BUILT_MODULE))
---------------------------------------
2.根据Android.mk文件得要的如下的内容,在编译的过程中都需要加载静态库libmincrypt.a文件。
找了一找系统目录,没有发现这个文件,再在/CyanogenMod-android_system_core-**/libmincrypt/Android.mk文件中得到了如下的信息:
--------------------cut here------------
# Copyright 2008 The Android Open Source Project
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := libmincrypt              
LOCAL_SRC_FILES := rsa.c sha.c
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libmincrypt          #还有这句LOCAL_MODULE := libmincrypt
LOCAL_SRC_FILES := rsa.c sha.c
include $(BUILD_HOST_STATIC_LIBRARY)       #生成主机使用的静态库#include $(BUILD_HOST_STATIC_LIBRARY)


# TODO: drop the hyphen once these are checked in
include $(LOCAL_PATH)/tools/Android.mk

----------------------------------------------
为了编译这个mkbootimg和unpackbootimg,首先要编译得到libmincrypt.a
2.1以下的内容是编译libmincrypt.a的过程:
  从刚刚的libmincrypt/Android.mk可以得到如下的信息:
需要的源代码文件是:rsa.c sha.c
分析rsa.c和sha.c的源代码,得到了共同的头文件声明如下:
------------------cut here---------------
/*rsa.c or sha.c */
#include "mincrypt/rsa.h"
#include "mincrypt/sha.h"
-----------------------------
在文件的声明中,得知了,需要用到的头文件在/include/mincrypt/目录中
所以需要把/CyanogenMod-android_system_core-***/include/mincrypt/目录复制到当前的目录即是/libmincrypt
2.2制作自己的makefile文件
-------------------cut here---------------
#make file build for libmincrypt.a
#create by sn
CROSS_COMPILE =  #arm-linux-androideabi-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
AR = $(CROSS_COMPILE)ar
STATIC_LIB = libmincrypt.a
OBJ =rsa.o sha.o
$(STATIC_LIB):$(OBJ);$(AR) -r $(STATIC_LIB) $(OBJ)
rsa.o:rsa.c;$(CC) -c -o $@ $<

sha.o:sha.c;$(CC) -c -o $@ $<


clean:
 rm -f $(STATIC_LIB) $(OBJ)
----------------------------------------

根据文件关链,写的makefile如上所示。
在终端里面进入当前的目录/libmincrypt
再执行make,来编译生成libmincrypt.a 文件。
把编译得到的文件复制到/mkbootimg目录下面。以备用。
3.在第二步中已经得到了libmincrypt.a文件。
下面就开始制作makefile,并编译mkbootimg,unpackbootimg

-----------------------cut here---------------------
#make for build mkbootimg
#create by sn 2012-5-23 21:14:18
CROSS_COMPILE =  #arm-linux-androideabi-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
LDCFLAGES =
STATIC_LIB = libmincrypt.a
#MKBOOTIMG_TARGET = arm-mkbootimg
MKBOOTIMG_OBJ = mkbootimg.o
MKBOOTIMG_SRC = mkbootimg.c
#UNPACKBOOT_TARGET = arm-unpackbootimg
UNPACKBOOTIMG_OBJ = unpackbootimg.o
UNPACKBOOTIMG_SRC = unpackbootimg.c
all:mkbootimg
mkbootimg:$(MKBOOTIMG_OBJ);$(CC) -o $@ $< $(STATIC_LIB)

$(MKBOOTIMG_OBJ):$(MKBOOTIMG_SRC);$(CC) -c $<
unpackboot:unpackbootimg
unpackbootimg:$(UNPACKBOOTIMG_OBJ);$(CC) -o $@ $< $(STATIC_LIB)
$(UNPACKBOOTIMG_OBJ):$(UNPACKBOOTIMG_SRC);$(CC) -c $<


clean:
 rm -f mkbootimg unpackbootimg $(MKBOOTIMG_OBJ)  $(UNPACKBOOTIMG_OBJ)
-------------------------------------------------
这个makefile主要是定义了编译的对象和编译的方法。
还有编译的规则。
在输入make all
编译的时候,得到的文件是mkbootimg
输入make unpackboot
编译得到unpackbootimg

二.在同一个文件夹中编译所有的文件(mkbootfs,mkbootimg,unpackbootimg)
我选择的工作目录是/mkbootimg
1。复制需要的文件
在../include目录中复制mincrypt目录到当前目录(mkbootimg)
在../libmincrypt目录中复制sha.c rsa.c文件到当前目录
在../cpio目录中复制mkbootfs.c    #此文件在一中已经经过修改。
在../include/private目录中复制android_filesystem_config.h头文件到当前目录。
在复制完成后。当前目录的结构如下:
./mincrypt/sha.h
./mincrypt/rsa.h
./Android.mk
./android_filesystem_config.h
./bootimg.h
./mkbootfs.c
./mkbootimg.c
./unpackbootimg.c
./rsa.c
./sha.c
./unpackbootimg.c
./makefile # 此文件需要自己创建

2.制作自己的makefile
下面是我编写好的makefile
-----------------------------cut here----------------------------
#make for build mkbootimg
#create by sn 2012-5-23 21:14:18
CROSS_COMPILE =  #arm-linux-androideabi-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
AR = $(CROSS_COMPILE)ar
LDCFLAGES =
STATIC_LIB = libmincrypt.a
#MKBOOTIMG_TARGET = arm-mkbootimg
MKBOOTIMG_OBJ = mkbootimg.o
MKBOOTIMG_SRC = mkbootimg.c
#UNPACKBOOT_TARGET = arm-unpackbootimg
UNPACKBOOTIMG_OBJ = unpackbootimg.o
UNPACKBOOTIMG_SRC = unpackbootimg.c
LIBMINCRYPT_OBJ = sha.o rsa.o
SHA_SRC = sha.c
RSA_SRC = rsa.c
MKBOOTFS_OBJ = mkbootfs.o
MKBOOTFS_SRC = mkbootfs.c
all:mkbootimg               #此处定义编译mkbootimg
mkbootimg:$(MKBOOTIMG_OBJ);$(CC) -o $@ $< $(STATIC_LIB)

$(MKBOOTIMG_OBJ):$(MKBOOTIMG_SRC);$(CC) -c $<

unpackboot:unpackbootimg              #此处定义编译unpackbootimg
unpackbootimg:$(UNPACKBOOTIMG_OBJ);$(CC) -o $@ $< $(STATIC_LIB)
$(UNPACKBOOTIMG_OBJ):$(UNPACKBOOTIMG_SRC);$(CC) -c $<

lib:libmincrypt.a                     #此处定义编译libmincrypt.a
libmincrypt.a:$(LIBMINCRYPT_OBJ);$(AR) -r $(STATIC_LIB) $(LIBMINCRYPT_OBJ)
sha.o:$(SHA_SRC);$(CC) -c -fPIC $<
rsa.o:$(RSA_SRC);$(CC) -c -fPIC $<

mkboot:mkbootfs                  #此处定义了编译mkbootfs
mkbootfs:$(MKBOOTFS_OBJ);$(CC) -o $@ $<
$(MKBOOTFS_OBJ):$(MKBOOTFS_SRC);$(CC) -c $<

clean:                    #此处定义了要清除的文件
 rm -f mkbootfs mkbootimg unpackbootimg $(MKBOOTIMG_OBJ)  $(UNPACKBOOTIMG_OBJ) $(LIBMINCRYPT_OBJ) $(STATIC_LIB) $(MKBOOTFS_OBJ)

-------------------------------------------------
3.编译
简单说一说编译的方法。
因为这个mkbootimg和unpackbootimg都依赖于libmincrypt.a,
所以在编译mkbootimg和unpackbootimg之前要先编译这个libmicrypt.a
方法如下 :
3.1
先执行make lib   #此条命令是生成libmincrypt.a
再执行make all #此条命令是生成mkbootimg
再执行make unpackboot #此条命令是生成unpackbootimg
再后执行的是make mkboot  #此条命令可以在最前执行,也可以在最后执行。因为这个mkbootfs没有依赖于libmincrypt.a
3.2
最后总结一下就是。
没有什么是不可能的。
只要肯努力就行了。

下面提供的是我已经编译好的工具:

http://pan.baidu.com/share/link?shareid=104898&uk=2265432600

make-mkboot-tools.rar

下面是编译后的图片:绿色表示生成的可执行文件。


 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 娘亲怀了我的种 民儿和娘玉米地故事 快抽出去外婆会怀孕的 民儿玉米地妈全给你 民儿和娘玉米地的小说 第章母亲播种危险期怀孕 儿子今晚后妈随便你怎么弄说说 同学说要看我骑他妈我说可以 荒村野性全文阅读目录 小成和后妈全文免费阅读文章 小诚和后妈全文免费阅读 娘亲在玉米地河边 我和娘亲玉米 娘亲给儿生个娃大结局 在玉米地插娘亲短文 在玉米地插娘亲电影 王来地里与娘激战2 在玉米地插娘亲播放 孩子别谢了我是你妈 臭小子 别急妈咪又不是不给你 粉嫩娘亲全文阅读全文 你的好粗妈v好痛 乡村孽缘上了王雪琴101一0 乡村小神医之情缠玉米地 乡村孽缘长篇小说全文免费阅读 乡村孽缘王雪琴怀孕是第几章 桃花村傻牛李大根 拨出来你爸要来 一个山村全家小说全集 乡村孽缘胡秀`小说全集 儿子小点声别让你爸听见长篇小说 胡秀英全文费阅读全文 儿子小声点别让你爸听见小说 乡村浪子的孽缘大伯母 畜牲别让你爸听见在线小说阅读 胡秀英乡全文免费阅读 婶的肥田全文免费阅读 乡村孽缘 王雪琴 熟花母芬芳泌蜜全文阅读 中文字字幕23页在线 单身娘亲有肥田