讲师博文
解决Android关于SD卡转化为ext4以及热插拔支持功能 来源 : 未知     2018-09-21

本文说是SD卡的加密其实有点牵强,但和sd卡的加密实现的功能差不多类型,不同的是实现的方式不太一样,如果你对arm接口编程技术非常精通的话,那么对于本文你就不需要看了。

现在我来说说他的实现原理:我要实现的功能是让SD卡。

1、在windows上不可识别也不可读写。

2、在linux上可识别不可读写。

3、在android系统上可识别可读写。

前两个条件都非常的简答实现,唯独后一个实现是本文的重点。

为什么我要说他是另类呢?我就要说说我的开发环境了。

作者的开发环境是一款以arm-v7架构的android4.4KK系统的平板,因为没有这款平板的源码,所以我就无法修改源码,直接进行系统的修改。

如果通过移植的方式来获取源码的话,所消耗的时间太长。开发周期就会变长,所以要在短时间内实现SD卡加密的话,不妨看看本篇文章。

首先我们知道windows 只支持的vfat的系统只要让我们的SD卡成为非VFAT系统我们就可以找到我们的加密思路了。

首先我选定的是ext3文件系统(linux支持的ext系列文件系统)。

将SD卡格式化成刷成了ext3文件系统,虽然1 、 2条件满足但3条件不满足,我查了android4.4的linux内核,他没有选定ext3系统所以在此我们不能用。然后就选定了ext4,将ext3 换成了ext4。

这里的格式化工作你可以用分区工具可以,也可以用linux的fdisk -t ext4指令也可以还可以进入android系统用mke2fs。

例如设备结点 /dev/block/vold/179:1

disk -t ext4 /dev/block/vold/179:1

mke2fs -t ext4 /dev/block/vold/179:1

这样我们的SD卡就制作好了现在我们就要往android系统上挂载了,经过我反复的实验和测试:android系统没有自动挂载非VFAT文件系统的支持,虽然他的kernel支持的文件系统非常多,但是他的framework层并没有对其他文件系统的支持,(网上也有人说支持,只是支持的功能出现问题了不完善)。

下面我开始说一下流程以及容易出现的ERROR错误。那些不正确的思路我就不表述了。

1、将SD卡插入手机(ext4系统的)通知上显示有损。

2、通过adb shell进入android系统终端。

关于adb shell的出现的问题以及配置我就不表述了。可以百度一下就可以了。

我说一说在使用ADB shell的时候容易出现的问题。

1、解决device not found问题 (安装驱动)。

2、解决device offline问题 (改成usb调试模式)。

3、解决读写权限问题 (root刷机)。

4、解决 didn’t ack 问题 (adb kill-server adb start-server)。

以上问题我用到的工具:驱动精灵,超级root大师,金山手机助手,putty.exe(支持adb shell) 这些工具都可以在网上找的到。

当你成功进入adbshell的时候,就进入的二阶段编写脚本shell。

进入之后

1、通常linux指令不齐全,需要你通过adb push 添加busybox到system/bin,使用指令busybox --install /system/bin 安装busybox。

2、而且还需要你输入让你拥有在系统创建目录文件的能力mount -o remount,rw/dev/block/mtdblock0/system /。

3、知道android系统人都知道,在系统开机的时候通常会运行init.xxx.rc或者是init.rc,这里我就是修改的init.rc 添加了一个service 功能。

例:

service whtest /system/bin/whtest.sh

Oneshot

然后我在/system/bin/whtest.sh

#!/system/bin/sh

#-------------------------------------------------------------------

umount /mnt/external_sd

mount -o remount,rw/dev/block/mtdblock0/system /

mount -t ext4 -o rw /dev/blockold/179:1 /mnt/external_sd

chmod 777 wangyingzheng

mv /wangyingzhengsybox /system/bin

chmod 777 /system/binsybox

busybox --install /system/bin

#-------------------------------------------------------------------

完成之后你就可以通过《固件工厂工具》将刷机的镜像解包修改这上面的代码,然后打包。刷机就可以完成。对SD卡的刷机功能了。

感觉到了这里基本的功能基本算是实现了。将ext4文件系统挂载到android系统上了。

但是问题出现在了热插拔上,当你开机之后或者关机之后将SD卡拔出在插入,就会挂不上。出现挂空的现象。因为你虽然再开机初始化的时候进行了挂载。但是显然这个设备节点不存在。你用挂空的方式将其挂上。等你在插上的时候系统认为你已经挂载完毕了就不在挂载了,且这个挂载只有一次。就是在开机的是时候进行了挂载,但是挂载之后.SD卡有不存在。所以相当于你还是没挂上SD卡还是原来的挂VFAT文件系统的挂载指令(android源码的挂载指令是只挂载vfat系统)。

第三部我们就需要处理热插拔挂载问题,这里我用到的系统为linux系统。

Android NDK开发包

1、配置NDK 让其拥有交叉工具链的功能http://blog.csdn.net/yxz329130952/article/details/7429124

2、编译脚本让C source编程可执行程序http://my.oschina.net/redhouse/blog/101283

关于让C可执行程序能在android系统上跑我通过上面两个网站就可以解决。

(注意这里的NDK开发与通常我们java与JNI接口连接NDK有点不太一样)。

我现在说一说我的原理我希望在他拔出卡的时候监听到他拔出然后监听设备结点文件是否存在然后进行挂载。

代码如下:

#include <unsitd.h>

#include <stdio.h>

int main(int argc, const char *argv[])

{

int flag =0;

int res =0;

/* 当开机时 有卡 已经挂载成功了

*

* 当拔出卡前 文件存在,标志为为0 不执行

* 当拔出卡后 文件不存在,标志位为1 执行1

*

* 当插入卡前 文件不存在,标志为1 不执行

* 当插入卡后 文件存在 标志为1 执行2

* 当开机时 无卡 挂载失败

*

* 当插入卡前 文件不存在,标志为0 执行1

* 当插入卡后 文件存在 标志为1 执行2

*/

while(1)

{

if(((res=access("/dev/block/vold/179:1",0))!=0)&&(flag==0))

{

system("umount /mnt/external_sd");

flag =1;

//

}else if(((res=access("/dev/block/vold/179:1",0))==0)&&(flag==1))

{

system("umount /mnt/external_sd");

ystem("mount -t ext4 -o rw /dev/block/vold/179:1 /mnt/external_sd");

flag =0;

}

然后通过文件生成可执行文件

代码如下:

#!/bin/bash

PREFIX=/home/tqj/downloads/android-ndk-r10

CC="$PREFIX/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"

NDK="$PREFIX/platforms/android-14/arch-arm"

CFLAGS="-I$NDK/usr/include"

LDFLAGS="-nostdlib -Wl,-rpath-link=$NDK/usr/lib -L$NDK/usr/lib $NDK/usr/lib/crtbegin_dynamic.o -lc"

$CC -o hotSwap usb.c $CFLAGS $LDFLAGS

后将可执行文件拷贝到android系统的根目录,在system/bin/whtest.sh 追加。

chmod 777 hotSwap

./hotSwap

当然因为这种挂载不是对源码的修改所以有许多遗留问题比如,SD卡文件必须有777权限,还有notification通知还会“显示存储设备有损”。

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:安卓中实现蓝牙通信的工具

下一篇:嵌入式开发中的gzip打包命令

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号