在
Android开发中,我们经常需要对自己的APP进行自动升级安装,今天我们就来讲一讲安装程序的代码怎么写,android中,安装程序的方式分为普通安装和静默安装,普通安装是通过调用Intent来发送一个
"application/vnd.android.package-archive"给系统,然后系统调用自身的安装程序来帮助你来完成程序的安装工作。静默安装时通过调用系统命令
pm来完成的。
首先来看一下普通安装的代码,这个代码是一般情况下是这样子的:
public static boolean installNormal(Context context, String filePath) {
Intent i = new Intent(Intent.ACTION_VIEW);
File file = new File(filePath);
if (file == null || !file.exists() || !file.isFile()
|| file.length() <= 0) {
return false;
}
i.setDataAndType(Uri.parse("file://" + filePath),
"application/vnd.android.package-archive");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
return true;
}
下面在来看看静默安装的程序是怎么实现的。
public static int installSilent(Context context, String filePath,
String pmParams) {
if (filePath == null || filePath.length() == 0) {
return INSTALL_FAILED_INVALID_URI;
}
File file = new File(filePath);
if (file == null || file.length() <= 0 || !file.exists()
|| !file.isFile()) {
return INSTALL_FAILED_INVALID_URI;
}
/**
* if context is system app, don't need root permission, but should add
* <uses-permission android:name="android.permission.INSTALL_PACKAGES"
* /> in mainfest
**/
StringBuilder command = new StringBuilder()
.append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ")
.append(pmParams == null ? "" : pmParams).append(" ")
.append(filePath.replace(" ", "\\ "));
CommandResult commandResult = ShellUtils.execCommand(
command.toString(), !isSystemApplication(context), true);
if (commandResult.successMsg != null
&& (commandResult.successMsg.contains("Success") || commandResult.successMsg
.contains("success"))) {
Log.d("PackageUtils", "install system app ok!");
return INSTALL_SUCCEEDED;
}
}
静默安装时,一般情况下需要获取系统权限,查看是否是系统APP或具有系统权限的代码如下:
public static boolean isSystemApplication(PackageManager packageManager,
String packageName) {
if (packageManager == null || packageName == null
|| packageName.length() == 0) {
return false;
}
try {
ApplicationInfo app = packageManager.getApplicationInfo(
packageName, 0);
return (app != null && (app.flags & ApplicationInfo.FLAG_SYSTEM) > 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return false;
}
查看是否具有系统权限
public static boolean checkRootPermission() {
return execCommand("echo root", true, false).result == 0;
}
public static CommandResult execCommand(String[] commands, boolean isRoot,
boolean isNeedResultMsg) {
int result = -1;
if (commands == null || commands.length == 0) {
return new CommandResult(result, null, null);
}
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = null;
StringBuilder errorMsg = null;
DataOutputStream os = null;
try {
process = Runtime.getRuntime().exec(
isRoot ? COMMAND_SU : COMMAND_SH);
os = new DataOutputStream(process.getOutputStream());
for (String command : commands) {
if (command == null) {
continue;
}
// donnot use os.writeBytes(commmand), avoid chinese charset
// error
os.write(command.getBytes());
os.writeBytes(COMMAND_LINE_END);
os.flush();
}
os.writeBytes(COMMAND_EXIT);
os.flush();
result = process.waitFor();
// get command result
if (isNeedResultMsg) {
successMsg = new StringBuilder();
errorMsg = new StringBuilder();
successResult = new BufferedReader(new InputStreamReader(
process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader(
process.getErrorStream()));
String s;
while ((s = successResult.readLine()) != null) {
successMsg.append(s);
}
while ((s = errorResult.readLine()) != null) {
errorMsg.append(s);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
return new CommandResult(result, successMsg == null ? null
: successMsg.toString(), errorMsg == null ? null
: errorMsg.toString());
}
安装时调用如下:
public static final int install(Context context, String filePath) {
if (isSystemApplication(context,filePath)
|| checkRootPermission()) {
return installSilent(context, filePath);
}
return installNormal(context, filePath) ? INSTALL_SUCCEEDED
: INSTALL_FAILED_INVALID_URI;
}