最新修订:2021.11.21
适用于最新的Parted 3.4。
前言
现在有越来越多的Android手机用上了GPT分区表。我目前接触过的有:华为C8816、G6-C00、Ascend P6,中兴U880E,还有亚马逊Kindle Fire。目前我不太好解释GPT 分区表相对于之前安卓手机广泛使用的MBR分区表有什么优势(毕竟手机不同于电脑;电脑上超过2TB的硬盘必须要用GPT才能完全识别),但这至少是新技术,一代更比一代强。
我观察到,网上大神们分享了不少给安卓手机重新分区的教程。他们用的是fdisk工具,针对大部分还在用MBR分区表的手机。可是像用GPT 分区表的新手机,用fdisk是没办法识别的(这一点,用Linux的朋友应该会有体会)。实测我的C8816运行”fdisk -l /dev/block/mmcblk0”时,只能读出一个EFI GPT分区,根本没办法显示出分区表。而我打开/proc/partitions查看分区信息一看,手机里其实是有25个分区的。
难道就真的没有办法了吗?
嘿嘿,当然不是了!这里有一个真正可以称得上是“大神”的工具,就是大名鼎鼎的GNU parted 工具!它是Linux下开放源代码的分区工具,完美支持GPT和MBR分区表,弥补了fdisk工具的缺憾。
我们的目标是:把parted工具通过交叉静态编译,移植到到Android手机中。这样理论上只需要一个可执行文件,就可以在大部分的Android手机上运行了。
前提要求
- 系统:Ubuntu等发行版的Linux系统。如果没办法装,请使用Cygwin。百度一下你就知道。
- 要求手机已经Root,否则这个工具没办法运行!
- 手机上安装终端工具(推荐使用终端模拟器——Terminal Emulator)。为了方便复制文件,最好再配合RE管理器或MT管理器。
- 工作目录,存放下载、解压的源码。本文使用
/tmp
作为工作目录。
编译器安装
编译器使用专为ARM平台配置好的GCC。可以使用系统自带的包管理器安装,也可以去FriendlyARM的网站上下载。如果用Cygwin请下载专用版本。
Ubuntu下可以使用apt list *arm*
来查找可用的ARM编译器,Arch Linux则用pacman -Ss gcc | grep arm
来搜索。
本文使用AArch64编译器进行编译,我已经事先安装好:
1 |
|
具体步骤
工作目录:
/home/administrator/
(即用户主目录,可以用~
代替)
第一步 编译libuuid库
parted依赖libuuid来生成UUID(用于GPT的分区编号)。以往,这个库由e2fsprogs提供,但后来它移到了util-linux里。parted的作者也建议直接从util-linux来编译libuuid。
1、下载util-linux源码
util-linux的源码托管在GitHub上,克隆下来:
1 |
|
毕竟是Linux的基础设施,这个仓库包含了历来所有的版本,异常庞大,因此加上--single-branch
以只克隆main
分支,且加上--depth=1
以舍弃提交记录(我们也用不上)。
2、配置并编译
进入到克隆的util-linux目录,首先生成configure
脚本:
1 |
|
然后运行./configure
。加入的参数含义如下:
--host
告知configure
脚本要使用的编译环境,注意必须加上-gnu
后缀,否则将无法识别AArch64编译器。--disable-all-programs --enable-libuuid
:由于这个仓库里包含了大量的Linux系统工具,所以还要加上这两个参数,它们告知configure
脚本只编译libuuid
,其他的工具统统不需要。--disable-shared --enable-static
:禁止编译动态库,只编译静态库。
1 |
|
最后开始编译。
1 |
|
3、安装
最后,把libuuid安装到一个固定的目录中,以便配置parted时能找到。建议安装到/tmp
目录中:
1 |
|
第二步 正式开始编译
1、下载parted源码
目前最新的parted版本为3.4,可以直接从GNU的仓库中下载源码包,然后解压。
下载地址:https://ftp.gnu.org/gnu/parted/parted-3.4.tar.xz
可以使用以下的命令下载并解压:
1 |
|
3、预先设置
前面我们已经说过,parted工具依赖于libuuid
库,所以我们要在编译之前指定好make
的CFLAGS
参数(设置成环境变量),让parted的./configure
脚本识别出来。
输入命令:
1 |
|
4、编译
依次输入如下命令。这里解释一下./configure
后续参数的意义:
--host=aarch64-linux-gnu
:同上。--disable-device-mapper
:禁用设备映射器(device mapper)。设备映射器主要用于将加密后的分区映射为可供访问的块设备,但给Android调整分区时用不上。--without-readline
:禁用GNU Readline支持。Readline是用来设计交互式终端应用程序的库,能够给parted的界面增加一些高级特性(例如自动完成),但给Android编译时不需要用上。- 禁用上述两个库后,可以最大限度减少parted的依赖项,否则还需要再多编译几个库。
--disable-shared --enable-static
:只编译静态链接的版本。
1 |
|
5、获取编译好的可执行文件
源代码目录下有一个parted文件夹,里面就由我们的可执行文件parted
,把它复制到Android手机上。
编译出来的可执行文件有1.2MB左右,这对于交叉静态编译的程序来说是再正常不过的。因为程序运行时需要的各种库文件都囊括于其中,这样在不同的Android设备上运行的时候就不至于再出现令人抓狂的错误了。
比如,因找不到共享库而出现的“No such file or directory
”错误:
1 |
|
或者是段错误:
1 |
|
我试过把我在这里编译好的parted放到上述“我接触过”的几台手机中,都能正常运行。
第三步 将可执行文件放入设备中
假设SD卡目录为
/sdcard
。
设备连上电脑,打开MTP模式或USB存储设备,把parted可执行文件放到SD卡中。
用RE管理器或MT管理器把
parted
可执行文件放到/system/bin
或/system/xbin
中(强烈建议后者)。习惯终端操作的朋友可以在终端模拟器中试试(注意$和# 不用输):
1 |
|
- 设置权限。打开终端模拟器,输入命令(注意$和# 不用输):
1 |
|
由于现在的Android系统越来越限制对系统分区的读写,因此建议在TWRP中连接电脑,使用adb shell
来测试,或者是把parted借助adb pull
传到/data/local/tmp
中。
第四步 测试
parted的运行需要Root权限,所以在运行前须执行su
,切换为root用户,方可使用parted。如果是在TWRP中使用adb shell
来测试,则默认就是root权限。
1 |
|
如果出现以下的提示,就说明我们的编译成功了:
1 |
|
输入r
,回车退出。然后更进一步,测试它能否识别eMMC:
1 |
|
如果插入了外置SD卡,也不妨试试:
1 |
|
回车,熟悉的parted界面出现在我们的眼前。然后试试print
命令,获取分区表。
以下是亲测的效果图:
至此,parted交叉静态编译成功!
参考资料
《嵌入式 linux 分区工具(parted) 交叉编译过程》,fjfhccfkuk,http://blog.163.com/fjfhccfkuk/blog/static/3665929920120532710413
自由调整ROM与Sdcard空间大小,亚马逊Kindle Fire内存分区方法详细教程,adb,http://bbs.imp3.net/thread-10515210-1-1.html
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2014/07/11/Android_Adapting_Note/静态交叉编译parted在Android上运行/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!