APK安装路径移动至外部存储设备

背景:

新需求:APK能安装在外部存储器设备(TF卡或U盘)的功能区。

Android软件结构:

APK安装路径移动至外部存储设备_第1张图片
Android关于安装APK外部存储设备

App:

1)APP的AndroidManifest.xml中android:installLocation的数值为"preferExternal","auto","internalOnly".其中"preferExternal"把该app安装到"外部存储"

2)Settings

APK或者其他系统应用,调用boolean setInstallLocation(int loc)设置:app安装到"外部存储"

3)在安装程序中,调用的installPackageWithVerificationAndEncryption()中flag,添加PackageManager.INSTALL_EXTERNAL。app安装到"外部存储"。

注:1)"外部存储"在这里可能是内置SD卡,也可能是外置SD卡;2)部分APK不能被安装”外部存储”,则会返回Error

PackageManagerService:

1)安装Apk,处理“外部存储”等信息

2)其中内部类AsecInstallArgs通过PackageHelper,调用MouthService操作将“外部存储”与”/mnt/asec”相关内容。

MountService:

1)调用VOLD中内容,对/mnt/asec相关进行处理(及安装apk的目录的新建,mount等)

VOLD:

2)通过device

mapper将/mnt/asec/内的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存储空间或内置SD

现有方案:

目前代码已存在相关方案:在Settings选择”Default storage equipment”为外部存储区的时候,若在安装时候,PMS收到的消息安装信息中包含PackageManager.INSTALL_EXTERNAL,并APP。则将APP安装到外部存储区。

验证操作如下:

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相关设备节点是否存在,使用df命令查看外置SD卡的空间是否发生变化

需要对现有方案修改的点:

1)在packagemanagerservice中,添加判断条件,赋值flagPackageManager.INSTALL_EXTERNAL。或者其他方式,设置安装Apk为外部存储区域

整体方案风险:

1.因为对现网的盒子进行处理,所以必须考虑版本升级带来的问题。例如:升级后,data/app的原有aok是否能正常启动;升级后,再对/data/app/的缘由Apk进行升级,是否存在问题;

2.所有APK是否能安装成功。

3.在Apk使用过程中,若热插拔外部存储区(如:插拔SD),APK是否能导致整体系统出现异常;APK热插拔后,能否正常使用;插拔后,再次安装相同APK,能否安装成功。

4.外置存储区只能同事支持一个,中途修改外置存储位置将导致之前外置存储安装应用无法识别。

5.添加外置存储后会影响开机速度,而且和开机优化有冲突,建议关闭。

你可能感兴趣的:(APK安装路径移动至外部存储设备)