2014年8月19日 星期二

將 Android 裡面的/data資料轉移到extSdCard並掛載

因為Android手機裡可以給程式安裝的裝置空間只有2G完全不夠用,所以我打算把這裝置空間裡面的部分資料(ex:app的資料,有些app的資料很占空間,一下子就占掉幾百Mb)移出至SdCard,避免app資料佔據過多的裝置空間,造成之後空間不足,無法下載app的情況..




注意:因為會動到系統檔案,無法保證手機安全,若要嘗試,請自行負責

準備工具:
  • 已root的Android手機(因為需要進入系統資料夾並操作檔案,需最高使用者權限)
  • SdCard
  • 模擬終端app
  • 電腦上的adb程式(非必要,可以用手機的模擬終端app打指令,在電腦上打指令和debug較方便就是了)
 步驟:
  • 先將SdCard插入電腦將裡面的資料備份出來,接下來用硬碟分割工具(ex:PartitionManager)將SdCard format 成fat32 再分割出第二個空間並將此空間格式化為ext2(此空間之後將會放置app資料,可以盡量分多一點空間)
  • SdCard準備完後插入手機,先開啟模擬終端輸入
     su   獲取最高權限
     mount -o remount,rw /   將 /設定為read-write,接下來才能在底下創建連結
     cd dev/block/vold   找到該SdCard的ext2分割區並記下來,如這裡是179:10
     mkdir /mnt/sd_ext2
     mount -t ext2 -w 179:10 /mnt/sd_ext2  把此分割區掛載到手機的文件系統上(-t代表文件系
     統格式 -w代表可以read-write) 
     cd /data/data 並查看哪些app資料占最多記憶體,優先把它列為需移出至SdCard的對象
     (注意:盡量不要動到敏感資料像是系統app等等的資料夾)
     cp -r -p com.xxx  /mnt/sd_ext2/com.xxx  將com.xxx資料夾包含底下裡面的資料複製出到
     SdCard的ext2分割區
     mv com.xxx com_bk.xxx   先將他更名
     ln -s  /mnt/sd_ext2/com.xxx com.xxx    android 上ln用法: ln [-s] <target> <name>
     此行是在/data/data下面建立一個軟連結可以連接到  /mnt/sd_ext2/com.xxx的資料夾,而
     最後面的參數是此連結的名稱
  • 完成後,可以開始測試是否可以開啟那個 xxx app,看看是否可以使用,測試ok後,手機重開機後,會發現那個app會不見,原因是重開機時,原本掛載好的掛載點會消失,故要再重掛載一次,解決方法有兩種,手動或是自動(用script跑) 
     手動的方法:
     開啟模擬終端輸入
     su
     mount -o remount,rw / 
     mkdir /mnt/sd_ext2
     mount -t ext2 -w 179:10 /mnt/sd_ext2
     kill zygote  注意:這裡是要把user interface行程刪掉,迫使他restart(看起來很像重開機),
     因為已經手動掛載好了,所以他restart時,便會找到掛載點下面的資料,消失的app就會
     出現
     
     自動的方法:
     開啟模擬終端輸入
     su
     cd /system/etc 查詢是否有一個檔案名叫install-recovery.sh,如果沒有可以自行創建,此
     檔案會在boot階段執行,若要確認,可以查看 /init.rc,裡面會有一行會呼叫到此檔案
     以root權限編輯此檔案,如果是自行新增檔案,可以直接在檔案中輸入
     #!/system/bin/sh
     sleep 4
     mount -o remount,rw / 
     mkdir /mnt/sd_ext2
     mount -t ext2 -w 179:10 /mnt/sd_ext2

     編輯完後儲存
  • 這樣子即可正常使用掛載的app
  • 假設如果有很多系統上的data要轉移到sdcard,建議可以再寫一個script,在手機上最熟悉的資料夾開一個檔案,叫做link.sh,編輯內容如下:
     #!/system/bin/sh

     filename=$1
     mnt=/mnt/sd_ext2
     cp -r -p $filename $mnt$filename
     mv $filename $filename"bk"
     ln -s $mnt$filename $filename
     rm -r $filename"bk" 
    

     注意:這裡有 rm -r $filename"bk",會把系統內原來的data刪掉
  • 使用link.sh方法:
      開啟模擬終端輸入  
      su
      cd 到link.sh所在的資料夾內
      sh /link.sh /data/data/com.xxx 即可,後面第一個參數,意思是說要轉移的資料夾路徑
    
    



沒有留言:

張貼留言