Android静默安装(需root)

时间:2022-04-21 15:53:26

最近小编在做一个静默安装的功能,静默安装的解决方式有许多种,小编今天就讲解一下我所做的这种方式,前提:需要Root(比较适合android定制开发板)

静默安装

静默安装的意思就是不通过android系统的安装提示页面进行app的安装。

如果我们的app在升级的时候,不想看到安卓系统自带的安装界面,我们可以使用静默安装。
那么:现在开始—

至于安装过程中的断点下载,获取文件这里就不做一一讲解了,这个相信大家都会。

来不及解释了,直接贴代码吧:

 /**
* 执行具体的静默安装逻辑,需要手机ROOT。
* @param apkPath
* 要安装的apk文件的路径
* @return 安装成功返回true,安装失败返回false。
*/

private static boolean install(String apkPath) {
boolean result = false;
DataOutputStream dataOutputStream = null;
BufferedReader errorStream = null;
try {
// 申请su权限
Process process = Runtime.getRuntime().exec("su");
dataOutputStream = new DataOutputStream(process.getOutputStream());
//执行卸载命令
String command1 = "pm uninstall "+ mContext.getPackageName() +" \n";
dataOutputStream.write(command1.getBytes(Charset.forName("utf-8")));
dataOutputStream.flush();
// 执行pm install命令
//这种方式是先卸载再安装,不是覆盖安装,收取不到apk的签名不一致等等信息,
//可以把 "pm install " + apkPath + "\n";换成"pm install -rf " + apkPath + "\n" 也不用执行上面的卸载命令
String command2 = "pm install " + apkPath + "\n";
dataOutputStream.write(command2.getBytes(Charset.forName("utf-8")));

dataOutputStream.flush();
dataOutputStream.writeBytes("exit\n");
dataOutputStream.flush();
process.waitFor();
errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String msg = "";
String line;
// 读取命令的执行结果
while ((line = errorStream.readLine()) != null) {
msg += line;
}
Log.d("TAG", "install msg is " + msg);
// 如果执行结果中包含Failure字样就认为是安装失败,否则就认为安装成功
if (!msg.contains("Failure")) {
result = true;
}
} catch (Exception e) {
Log.e("TAG", e.getMessage(), e);
} finally {
try {
if (dataOutputStream != null) {
dataOutputStream.close();
}
if (errorStream != null) {
errorStream.close();
}
} catch (IOException e) {
Log.e("TAG", e.getMessage(), e);
}
}

return result;
}

安装玩之后,如果你的app不是Launcher程序,或者你的安卓系统中存在多个Launcher程序,如果你想再app安装完之后自启动你的app,可以使用广播实现:

<!-- 清单文件里面注册你的广播 -->
<receiver android:name=".broadcastreceiver.YouUpgradeApk"
>

<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<data android:scheme="package"/>
</intent-filter>

</receiver>

广播实现类

if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){
Toast.makeText(context,"升级了一个安装包",Toast.LENGTH_SHORT).show();
//跳转到你想跳转的页面
Intent intent2 = new Intent(context, StartUpActivity.class);
//设置标志位
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
}

清单文件权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name= "android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" />