热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

转载#编译mkbootfs,mkbootimg,unpackbootimg#首先要得到android_system_core的源代码,从github.com上面下载得


转载
#编译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 $&#64; $<
$(OBJ):$(SRC) ;$(CC) -fPIC -c -o $&#64; $<

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

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

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

#include
#include
#include

#include
#include

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

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

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

LOCAL_MODULE :&#61; mkbootimg

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

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

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

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

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

LOCAL_MODULE :&#61; libmincrypt              
LOCAL_SRC_FILES :&#61; rsa.c sha.c
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE :&#61; libmincrypt          #还有这句LOCAL_MODULE :&#61; libmincrypt
LOCAL_SRC_FILES :&#61; 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&#xff0c;首先要编译得到libmincrypt.a
2.1以下的内容是编译libmincrypt.a的过程&#xff1a;
  从刚刚的libmincrypt/Android.mk可以得到如下的信息&#xff1a;
需要的源代码文件是&#xff1a;rsa.c sha.c
分析rsa.c和sha.c的源代码&#xff0c;得到了共同的头文件声明如下&#xff1a;
------------------cut here---------------
/*rsa.c or sha.c */
#include "mincrypt/rsa.h"
#include "mincrypt/sha.h"
-----------------------------
在文件的声明中&#xff0c;得知了&#xff0c;需要用到的头文件在/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 &#61;  #arm-linux-androideabi-
CC &#61; $(CROSS_COMPILE)gcc
LD &#61; $(CROSS_COMPILE)ld
AR &#61; $(CROSS_COMPILE)ar
STATIC_LIB &#61; libmincrypt.a
OBJ &#61;rsa.o sha.o
$(STATIC_LIB):$(OBJ);$(AR) -r $(STATIC_LIB) $(OBJ)
rsa.o:rsa.c;$(CC) -c -o $&#64; $<

sha.o:sha.c;$(CC) -c -o $&#64; $<


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

根据文件关链&#xff0c;写的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 &#61;  #arm-linux-androideabi-
CC &#61; $(CROSS_COMPILE)gcc
LD &#61; $(CROSS_COMPILE)ld
LDCFLAGES &#61;
STATIC_LIB &#61; libmincrypt.a
#MKBOOTIMG_TARGET &#61; arm-mkbootimg
MKBOOTIMG_OBJ &#61; mkbootimg.o
MKBOOTIMG_SRC &#61; mkbootimg.c
#UNPACKBOOT_TARGET &#61; arm-unpackbootimg
UNPACKBOOTIMG_OBJ &#61; unpackbootimg.o
UNPACKBOOTIMG_SRC &#61; unpackbootimg.c
all:mkbootimg
mkbootimg:$(MKBOOTIMG_OBJ);$(CC) -o $&#64; $<$(STATIC_LIB)

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


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

二.在同一个文件夹中编译所有的文件(mkbootfs,mkbootimg,unpackbootimg)
我选择的工作目录是/mkbootimg
1。复制需要的文件
在../include目录中复制mincrypt目录到当前目录&#xff08;mkbootimg)
在../libmincrypt目录中复制sha.c rsa.c文件到当前目录
在../cpio目录中复制mkbootfs.c    #此文件在一中已经经过修改。
在../include/private目录中复制android_filesystem_config.h头文件到当前目录。
在复制完成后。当前目录的结构如下&#xff1a;
./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 &#61;  #arm-linux-androideabi-
CC &#61; $(CROSS_COMPILE)gcc
LD &#61; $(CROSS_COMPILE)ld
AR &#61; $(CROSS_COMPILE)ar
LDCFLAGES &#61;
STATIC_LIB &#61; libmincrypt.a
#MKBOOTIMG_TARGET &#61; arm-mkbootimg
MKBOOTIMG_OBJ &#61; mkbootimg.o
MKBOOTIMG_SRC &#61; mkbootimg.c
#UNPACKBOOT_TARGET &#61; arm-unpackbootimg
UNPACKBOOTIMG_OBJ &#61; unpackbootimg.o
UNPACKBOOTIMG_SRC &#61; unpackbootimg.c
LIBMINCRYPT_OBJ &#61; sha.o rsa.o
SHA_SRC &#61; sha.c
RSA_SRC &#61; rsa.c
MKBOOTFS_OBJ &#61; mkbootfs.o
MKBOOTFS_SRC &#61; mkbootfs.c
all:mkbootimg               #此处定义编译mkbootimg
mkbootimg:$(MKBOOTIMG_OBJ);$(CC) -o $&#64; $<$(STATIC_LIB)

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

unpackboot:unpackbootimg              #此处定义编译unpackbootimg
unpackbootimg:$(UNPACKBOOTIMG_OBJ);$(CC) -o $&#64; $<$(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 $&#64; $<
$(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&#xff0c;
所以在编译mkbootimg和unpackbootimg之前要先编译这个libmicrypt.a
方法如下 &#xff1a;
3.1
先执行make lib   #此条命令是生成libmincrypt.a
再执行make all #此条命令是生成mkbootimg
再执行make unpackboot #此条命令是生成unpackbootimg
再后执行的是make mkboot  #此条命令可以在最前执行&#xff0c;也可以在最后执行。因为这个mkbootfs没有依赖于libmincrypt.a
3.2
最后总结一下就是。
没有什么是不可能的。
只要肯努力就行了。

下面提供的是我已经编译好的工具&#xff1a;

http://pan.baidu.com/share/link?shareid&#61;104898&uk&#61;2265432600

make-mkboot-tools.rar

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


 




推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 在VS2013中编译FFMPEG时遇到的问题及解决方案
    在使用VS2013编译旧版本FFMPEG库时遇到了一些问题,因为官方并未提供预编译的LIB和DLL文件。由于对Linux环境不熟悉,只能在Windows环境下进行配置和编译。具体步骤如下:首先,下载FFMPEG的源代码;然后,安装必要的编译工具和依赖项;接着,配置Visual Studio 2013的项目设置;最后,解决编译过程中出现的各种错误和警告。通过这些步骤,最终成功编译出所需的FFMPEG库文件。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
author-avatar
手机用户2502880645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有