背景:
新需求:APK能安裝在外部存儲器設備(TF卡或U盤)的功能區(qū)顿天。
Android軟件結構:
App:
1)APP的AndroidManifest.xml中android:installLocation的數(shù)值為"preferExternal"蜀肘,"auto","internalOnly".其中"preferExternal"把該app安裝到"外部存儲"
2)Settings
APK或者其他系統(tǒng)應用,調(diào)用boolean setInstallLocation(int loc)設置:app安裝到"外部存儲"
3)在安裝程序中尼啡,調(diào)用的installPackageWithVerificationAndEncryption()中flag,添加PackageManager.INSTALL_EXTERNAL袋励。app安裝到"外部存儲"乙嘀。
注:1)"外部存儲"在這里可能是內(nèi)置SD卡显蝌,也可能是外置SD卡预伺;2)部分APK不能被安裝”外部存儲”,則會返回Error
PackageManagerService:
1)安裝Apk琅束,處理“外部存儲”等信息
2)其中內(nèi)部類AsecInstallArgs通過PackageHelper扭屁,調(diào)用MouthService操作將“外部存儲”與”/mnt/asec”相關內(nèi)容。
MountService:
1)調(diào)用VOLD中內(nèi)容涩禀,對/mnt/asec相關進行處理(及安裝apk的目錄的新建料滥,mount等)
VOLD:
2)通過device
mapper將/mnt/asec/內(nèi)的APP目錄映射成了ext4設備:/dev/block/dm-0
Android原生“App安裝到外部存儲”的功能,實際上是安裝/dev/block/dm相關的設備上艾船,鏈接(SEC_ASECDIR_EXT= "/mnt/secure/asec")葵腹。
3)外置SD插上時,將相關路徑(SEC_ASECDIR_EXT= "/mnt/secure/asec")mount到外置SD存儲空間或內(nèi)置SD
現(xiàn)有方案:
目前代碼已存在相關方案:在Settings選擇”Default storage equipment”為外部存儲區(qū)的時候屿岂,若在安裝時候践宴,PMS收到的消息安裝信息中包含PackageManager.INSTALL_EXTERNAL,并APP爷怀。則將APP安裝到外部存儲區(qū)阻肩。
驗證操作如下:
1)插入SD卡
2)將/system/build.prop中修改“ro.defaultStorage.enable=false”為”ro.defaultStorage.enable=true”
3)進入“Settings” ->”Default storage
equipment” ,然后選外置存儲設備
4)adb install –s apk路徑(例如:adb install –s testExample.apk)
5)查看/mnt/asec/是否存在安裝apk的相關信息,查看/dev/block/dm相關設備節(jié)點是否存在,使用df命令查看外置SD卡的空間是否發(fā)生變化
需要對現(xiàn)有方案修改的點:
1)在packagemanagerservice中烤惊,添加判斷條件乔煞,賦值flag為PackageManager.INSTALL_EXTERNAL∑馐遥或者其他方式渡贾,設置安裝Apk為外部存儲區(qū)域
整體方案風險:
1.因為對現(xiàn)網(wǎng)的盒子進行處理,所以必須考慮版本升級帶來的問題雄右。例如:升級后空骚,data/app的原有aok是否能正常啟動;升級后擂仍,再對/data/app/的緣由Apk進行升級囤屹,是否存在問題;
2.所有APK是否能安裝成功逢渔。
3.在Apk使用過程中牺丙,若熱插拔外部存儲區(qū)(如:插拔SD),APK是否能導致整體系統(tǒng)出現(xiàn)異常复局;APK熱插拔后,能否正常使用粟判;插拔后亿昏,再次安裝相同APK,能否安裝成功档礁。
4.外置存儲區(qū)只能同事支持一個角钩,中途修改外置存儲位置將導致之前外置存儲安裝應用無法識別。
5.添加外置存儲后會影響開機速度呻澜,而且和開機優(yōu)化有沖突递礼,建議關閉。