當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 解決Android關(guān)于SD卡轉(zhuǎn)化為ext4以及熱插拔支持功能
解決Android關(guān)于SD卡轉(zhuǎn)化為ext4以及熱插拔支持功能
時間:2018-09-21 來源:未知
本文說是SD卡的加密其實有點牽強(qiáng),但和sd卡的加密實現(xiàn)的功能差不多類型,不同的是實現(xiàn)的方式不太一樣,如果你對arm接口編程技術(shù)非常精通的話,那么對于本文你就不需要看了。
現(xiàn)在我來說說他的實現(xiàn)原理:我要實現(xiàn)的功能是讓SD卡。
1、在windows上不可識別也不可讀寫。
2、在linux上可識別不可讀寫。
3、在android系統(tǒng)上可識別可讀寫。
前兩個條件都非常的簡答實現(xiàn),唯獨后一個實現(xiàn)是本文的重點。
為什么我要說他是另類呢?我就要說說我的開發(fā)環(huán)境了。
作者的開發(fā)環(huán)境是一款以arm-v7架構(gòu)的android4.4KK系統(tǒng)的平板,因為沒有這款平板的源碼,所以我就無法修改源碼,直接進(jìn)行系統(tǒng)的修改。
如果通過移植的方式來獲取源碼的話,所消耗的時間太長。開發(fā)周期就會變長,所以要在短時間內(nèi)實現(xiàn)SD卡加密的話,不妨看看本篇文章。
首先我們知道windows 只支持的vfat的系統(tǒng)只要讓我們的SD卡成為非VFAT系統(tǒng)我們就可以找到我們的加密思路了。
首先我選定的是ext3文件系統(tǒng)(linux支持的ext系列文件系統(tǒng))。
將SD卡格式化成刷成了ext3文件系統(tǒng),雖然1 、 2條件滿足但3條件不滿足,我查了android4.4的linux內(nèi)核,他沒有選定ext3系統(tǒng)所以在此我們不能用。然后就選定了ext4,將ext3 換成了ext4。
這里的格式化工作你可以用分區(qū)工具可以,也可以用linux的fdisk -t ext4指令也可以還可以進(jìn)入android系統(tǒng)用mke2fs。
例如設(shè)備結(jié)點 /dev/block/vold/179:1
disk -t ext4 /dev/block/vold/179:1
mke2fs -t ext4 /dev/block/vold/179:1
這樣我們的SD卡就制作好了現(xiàn)在我們就要往android系統(tǒng)上掛載了,經(jīng)過我反復(fù)的實驗和測試:android系統(tǒng)沒有自動掛載非VFAT文件系統(tǒng)的支持,雖然他的kernel支持的文件系統(tǒng)非常多,但是他的framework層并沒有對其他文件系統(tǒng)的支持,(網(wǎng)上也有人說支持,只是支持的功能出現(xiàn)問題了不完善)。
下面我開始說一下流程以及容易出現(xiàn)的ERROR錯誤。那些不正確的思路我就不表述了。
1、將SD卡插入手機(jī)(ext4系統(tǒng)的)通知上顯示有損。
2、通過adb shell進(jìn)入android系統(tǒng)終端。
關(guān)于adb shell的出現(xiàn)的問題以及配置我就不表述了?梢园俣纫幌戮涂梢粤恕
我說一說在使用ADB shell的時候容易出現(xiàn)的問題。
1、解決device not found問題 (安裝驅(qū)動)。
2、解決device offline問題 (改成usb調(diào)試模式)。
3、解決讀寫權(quán)限問題 (root刷機(jī))。
4、解決 didn’t ack 問題 (adb kill-server adb start-server)。
以上問題我用到的工具:驅(qū)動精靈,超級root大師,金山手機(jī)助手,putty.exe(支持adb shell) 這些工具都可以在網(wǎng)上找的到。
當(dāng)你成功進(jìn)入adbshell的時候,就進(jìn)入的二階段編寫腳本shell。
進(jìn)入之后
1、通常linux指令不齊全,需要你通過adb push 添加busybox到system/bin,使用指令busybox --install /system/bin 安裝busybox。
2、而且還需要你輸入讓你擁有在系統(tǒng)創(chuàng)建目錄文件的能力mount -o remount,rw/dev/block/mtdblock0/system /。
3、知道android系統(tǒng)人都知道,在系統(tǒng)開機(jī)的時候通常會運行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
#-------------------------------------------------------------------
完成之后你就可以通過《固件工廠工具》將刷機(jī)的鏡像解包修改這上面的代碼,然后打包。刷機(jī)就可以完成。對SD卡的刷機(jī)功能了。
感覺到了這里基本的功能基本算是實現(xiàn)了。將ext4文件系統(tǒng)掛載到android系統(tǒng)上了。
但是問題出現(xiàn)在了熱插拔上,當(dāng)你開機(jī)之后或者關(guān)機(jī)之后將SD卡拔出在插入,就會掛不上。出現(xiàn)掛空的現(xiàn)象。因為你雖然再開機(jī)初始化的時候進(jìn)行了掛載。但是顯然這個設(shè)備節(jié)點不存在。你用掛空的方式將其掛上。等你在插上的時候系統(tǒng)認(rèn)為你已經(jīng)掛載完畢了就不在掛載了,且這個掛載只有一次。就是在開機(jī)的是時候進(jìn)行了掛載,但是掛載之后.SD卡有不存在。所以相當(dāng)于你還是沒掛上SD卡還是原來的掛VFAT文件系統(tǒng)的掛載指令(android源碼的掛載指令是只掛載vfat系統(tǒng))。
第三部我們就需要處理熱插拔掛載問題,這里我用到的系統(tǒng)為linux系統(tǒng)。
Android NDK開發(fā)包
1、配置NDK 讓其擁有交叉工具鏈的功能//blog.csdn.net/yxz329130952/article/details/7429124
2、編譯腳本讓C source編程可執(zhí)行程序//my.oschina.net/redhouse/blog/101283
關(guān)于讓C可執(zhí)行程序能在android系統(tǒng)上跑我通過上面兩個網(wǎng)站就可以解決。
(注意這里的NDK開發(fā)與通常我們java與JNI接口連接NDK有點不太一樣)。
我現(xiàn)在說一說我的原理我希望在他拔出卡的時候監(jiān)聽到他拔出然后監(jiān)聽設(shè)備結(jié)點文件是否存在然后進(jìn)行掛載。
代碼如下:
#include <unsitd.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
int flag =0;
int res =0;
/* 當(dāng)開機(jī)時 有卡 已經(jīng)掛載成功了
*
* 當(dāng)拔出卡前 文件存在,標(biāo)志為為0 不執(zhí)行
* 當(dāng)拔出卡后 文件不存在,標(biāo)志位為1 執(zhí)行1
*
* 當(dāng)插入卡前 文件不存在,標(biāo)志為1 不執(zhí)行
* 當(dāng)插入卡后 文件存在 標(biāo)志為1 執(zhí)行2
* 當(dāng)開機(jī)時 無卡 掛載失敗
*
* 當(dāng)插入卡前 文件不存在,標(biāo)志為0 執(zhí)行1
* 當(dāng)插入卡后 文件存在 標(biāo)志為1 執(zhí)行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;
}
然后通過文件生成可執(zhí)行文件
代碼如下:
#!/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
后將可執(zhí)行文件拷貝到android系統(tǒng)的根目錄,在system/bin/whtest.sh 追加。
chmod 777 hotSwap
./hotSwap
當(dāng)然因為這種掛載不是對源碼的修改所以有許多遺留問題比如,SD卡文件必須有777權(quán)限,還有notification通知還會“顯示存儲設(shè)備有損”。

