APK:
在AndroidManifest.xml文件添加android:installLocation属性
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ray"
android:installLocation="auto"
android:versionCode="1"
android:versionName="1.0">
android:installLocation 这个属性设置的是默认安装位置, 共有三个有效值,auto、internalOnly、preferExternal
对应表
auto 表示自动,由系统决定安装位置
internalOnly 安装在手机内存
preferExternal 安装在外部存储中
系统:
PackageManagerService.java中设置 /获取installlocation:
public boolean setInstallLocation(int loc) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS,
null);
if (getInstallLocation() == loc) {
return true;
}
if (loc == PackageHelper.APP_INSTALL_AUTO || loc == PackageHelper.APP_INSTALL_INTERNAL
|| loc == PackageHelper.APP_INSTALL_EXTERNAL) {
android.provider.Settings.Global.putInt(mContext.getContentResolver(),
android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION, loc);
return true;
}
return false;
}
public int getInstallLocation() {
return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,
PackageHelper.APP_INSTALL_AUTO);
}
其中核心设置为:
android.provider.Settings.Global.putInt(mContext.getContentResolver()
,android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,type);
type为位置类型分别对应为PackageHelper.java中的:
// App installation location settings values
public static final int APP_INSTALL_AUTO = 0;
public static final int APP_INSTALL_INTERNAL = 1;
public static final int APP_INSTALL_EXTERNAL = 2;
PackageManagerService.java中:
最终的安装位置 由 apk 自身属性决定!当apk的无属性或者设置为auto 此时再由系统决定安装位置!