转载请附原文:https://blog.csdn.net/github_39468911/article/details/103210874
1.降版本更新
由于前段时间客户有需求,apk能往低版本更新,所以去找了一下资料。发现网上关于这个方法基本上没有,后来发现我们的adb 调试加上 -d 可以实现低版本更新,所以就去看了一下源码。以下截取片段源码 路径:
/frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
while ((opt=nextOption()) != null) {
if (opt.equals("-l")) {
installFlags |= PackageManager.INSTALL_FORWARD_LOCK;
} else if (opt.equals("-r")) {
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
} else if (opt.equals("-i")) {
installerPackageName = nextOptionData();
if (installerPackageName == null) {
System.err.println("Error: no value specified for -i");
return;
}
} else if (opt.equals("-t")) {
installFlags |= PackageManager.INSTALL_ALLOW_TEST;
} else if (opt.equals("-s")) {
// Override if -s option is specified.
installFlags |= PackageManager.INSTALL_EXTERNAL;
} else if (opt.equals("-f")) {
// Override if -s option is specified.
installFlags |= PackageManager.INSTALL_INTERNAL;
} else if (opt.equals("-d")) {
installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
} else if (opt.equals("--originating-uri")) {
originatingUriString = nextOptionData();
if (originatingUriString == null) {
System.err.println("Error: must supply argument for --originating-uri");
return;
}
} else if (opt.equals("--referrer")) {
referrer = nextOptionData();
if (referrer == null) {
System.err.println("Error: must supply argument for --referrer");
return;
}
} else if (opt.equals("--abi")) {
abi = checkAbiArgument(nextOptionData());
} else if (opt.equals("--user")) {
userId = Integer.parseInt(nextOptionData());
} else {
System.err.println("Error: Unknown option: " + opt);
return;
}
}
installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
重要的就是这个,这个就是允许应用降版本更新的参数。
java 代码实现静默安装降版本更新
知道实现的方式后我们就好办多了。
public void installPackage(String apkPath, PackageInstallObserver2 observer2, UpdateAppsInfo.UpdateType updateType) {
try {
Class<?> serviceManager = Class.forName("android.os.ServiceManager");
Method getService = serviceManager.getDeclaredMethod("getService", String.class);
getService.setAccessible(true);
IBinder packAgeBinder = (IBinder) getService.invoke(null, "package");
IPackageManager iPm = IPackageManager.Stub.asInterface(packAgeBinder);
VerificationParams verificationParams = new VerificationParams(null, null, null, VerificationParams.NO_UID, null);
iPm.installPackage(apkPath, observer2, updateType == UpdateAppsInfo.UpdateType.HEIGHT ? INSTALL_REPLACE_EXISTING : (INSTALL_REPLACE_EXISTING | INSTALL_ALLOW_DOWNGRADE),
new File(apkPath).getPath(), verificationParams, null);
} catch (Exception e) {
e.printStackTrace();
}
}
重要的就是下面这个
iPm.installPackage(apkPath, observer2, updateType == UpdateAppsInfo.UpdateType.HEIGHT ? INSTALL_REPLACE_EXISTING : (INSTALL_REPLACE_EXISTING | INSTALL_ALLOW_DOWNGRADE),
new File(apkPath).getPath(), verificationParams, null);
判断是高版本安装还是低版本安装。低版本安装添加 INSTALL_ALLOW_DOWNGRADE
由于我们是更新操作所以要加上INSTALL_REPLACE_EXISTING 覆盖安装。这样就可以实现降版本安装应用了。