修改修改boot.img文件的工具,mkbootfs,mkbootimg,unpackbootimg
#编译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:= (CLEAR_VARS) #其中这句表示声明编译的开始。
LOCAL_SRC_FILES := \ #源代码文件
mkbootfs.c
LOCAL_MODULE := mkbootfs #生成的文件名
include $(BUILD_HOST_EXECUTABLE) #生成在本机使用的可执行文件
(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)ld
EXEC = arm-mkbootfs
OBJ = mkbootfs.o
SRC = mkbootfs.c
(OBJ) ;@ (OBJ):(CC) -fPIC -c -o <
clean:
rm -f (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:= (CLEAR_VARS)
LOCAL_SRC_FILES := mkbootimg.c #要用到的源代码是mkbootimg.c
LOCAL_STATIC_LIBRARIES := libmincrypt #此句声明要使用的静态库文件是libmincrypt.a
LOCAL_MODULE := mkbootimg
include $(BUILD_HOST_EXECUTABLE) #上当的内容是编译mkbootimg的命令。
include (BUILD_HOST_EXECUTABLE) #编译unpackbootimg的部分
include (PRODUCT_OUT)/symbols/utilities
LOCAL_MODULE_PATH := (BUILD_EXECUTABLE)
include (PRODUCT_OUT)/symbols/utilities
LOCAL_MODULE_PATH := (BUILD_EXECUTABLE)
(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 := (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)
# 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)ld
AR = (STATIC_LIB):(AR) -r (OBJ)
rsa.o:rsa.c;@ $<
sha.o:sha.c;@ $<
clean:
rm -f (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)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:(CC) -o < $(STATIC_LIB)
(MKBOOTIMG_SRC);<
unpackboot:unpackbootimg
unpackbootimg:(CC) -o < (UNPACKBOOTIMG_OBJ):(CC) -c $<
clean:
rm -f mkbootimg unpackbootimg (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)ld
AR = (MKBOOTIMG_OBJ);@ (STATIC_LIB)
(MKBOOTIMG_SRC);<
unpackboot:unpackbootimg #此处定义编译unpackbootimg
unpackbootimg:(CC) -o < (UNPACKBOOTIMG_OBJ):(CC) -c $<
lib:libmincrypt.a #此处定义编译libmincrypt.a
libmincrypt.a:(AR) -r (LIBMINCRYPT_OBJ)
sha.o:(CC) -c -fPIC (RSA_SRC);<
mkboot:mkbootfs #此处定义了编译mkbootfs
mkbootfs:(CC) -o <
(MKBOOTFS_SRC);<
clean: #此处定义了要清除的文件
rm -f mkbootfs mkbootimg unpackbootimg (UNPACKBOOTIMG_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
下面是编译后的图片:绿色表示生成的可执行文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决