日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

平板实现app2sd功能

發布時間:2024/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 平板实现app2sd功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

平臺:android4.0
場景:平板上都默認不插入SD卡,所以會將mnt/sdcard指向flash上分出來的某個塊,即使默認的app2sd功能存在,也是一個假象。
時間:2012.5.25

android在2.2后開始支持,專門在vold里面添加了const char *Volume::SEC_STGDIR = “/mnt/secure/staging”。
單獨討論手機的情況,手機的SD卡對應的就是mnt/sdcard.因此在sd卡進行掛載的時候,首先會把sd設備掛載到/mnt/secure/staging下,然后將sd設備上的android_secure文件改成.android_secure文件,同時映射到/mnt/secure/asec下。掛載的最后,將sd卡掛載到mnt/sdcard上,同時移除/mnt/secure/staging,即umount掉。
此時/mnt/secure/asec依然映射到sd卡設備的.android_secure文件。
當進行app2sd操作的時候,會將app移動到.android_secure文件中,同時將.android_secure文件中的apk文件改名為xxxx.asec,并映射到mnt/asec下。(此時.android_secure文件中的apk名字并未變化,mnt/asec下只是改了名字的一個映射,此路徑被uri使用)。
上述實現的關鍵函數是createBindMounts()函數。同時關于asec的操作定義在VolumeManager.cpp中。
其提供給CommandListener::AsecCmd::runCommand()使用。此處為socket調用,client端位于框架的MountService,使得上層可以根據情況進行調用。

關于平板,基本上將flash(即真實flash的一個block區域)掛載到了mnt/sdcard路徑,從而上述的相關操作,都在flash上面進行了。因此在平板上的app2sd其實是一個假象。而關于還原其真實情況,需要做的事情比較簡單:在vold進行mountVol()的時候,我們可以根據不同的設備(flash,真實sdcard)的label進行區分處理。當是真實的sdcard的時候,我們才使用mnt/secure/staging的相關操作,而關于flash的掛載,我們僅僅直接mount,即使用Fat::doMount(devicePath, getMountpoint()。這樣,app2sd功能在平板上就是真實實現了,同時僅僅在平板插入sdcard的時候起作用。當然,還需要記得清理asce相關的操作上進行一次判斷。

解決方法:
1、把staging的創建和move的代碼都移到sdcard那個if分支里
2、修改清理asec為在sdcard卸載的時候
關于app2sd的框架中的流程,大致如下:
PKMS::movePackage()====>PKMS::copyAPK()====>DefaultContainerService::copyResourceInner()====>FileUtils::copyFile()
在copyResourceInner()中調用FileUtils::copyFile()的關鍵,是path參數,即newCachePath。而newCachePath的獲取,來自于:
PackageHelper::createSdDir()====>MountService::getSecureContainerPath()====>CommandListener::AsecCmd::runCommand()。
看吧,繞回到AsecCmd中了,從而各種調用VolumeManager.cpp中定義的asec相關的函數。

修改后存在的問題:
當一個apk在其AndroidManifest.xml中申明的安裝位置為External時,此apk將無法安裝。提示報錯:INSTALL_FAILED_CONTAINER_ERROR。
報錯原因,在安裝的過程中獲取到的推薦安裝位置為External,而此時框架中Environment.java中的External的定義依然是路徑“mnt/sdcard”—即為小機器上的falsh。而安裝在外部的apk是需要放入到.android_secure文件中的!
因為我們已經把真實的app2sd實現了,此文件已經被建立到真實的SD卡上去了,因此在安裝的過程中執行copyAPK()的時候,URI中包含的.android_secure路徑在flash上是找不到的。
關鍵點:我們已經將真實app2sd實現,即.android_secure在真實的SD卡上,而此apk本身是推薦自己安裝在外部—在框架中依然還是指向mnt/sdcard對應的flash!
推薦安裝到外部,此時的外部應該對應的是sdcard,在沒有插入SD卡的情況下,不是應該不推薦外部安裝么!?其實系統本身就是這么實現的,而關鍵點就是系統在判斷SD卡的掛載情況時,依然判斷的是mnt/sdcard這個flash對應的路徑的掛載情況!
—其實這里應該判斷SD卡對應的mnt/sdcard2的掛載情況!(按照系統的處理,若SD卡沒有掛載,則將推薦到內部安裝,此時情況就正常了)
—-在DefaultContainerService.java中修改isUnderExternalThreshold()函數中的if判斷,此處應該是判斷真實的SD卡是否掛載上!

總結

以上是生活随笔為你收集整理的平板实现app2sd功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。