背景:

做一个应用,需求是获取root权限后可以停用/启用某些应用,包括系统应用!停用的应用将不在设置-->应用中展示,大部分系统自带的桌面应该也不会再显示!

如果是用menifest.xml中添加android:sharedUserId="android.uid.system" ,需要包的签名与系统的签名一致!

所以考虑使用shell命令执行!

1.获取root权限:String cmd="chmod 777 " + pkgCodePath;

/** * 获取root权限 * @param pkgCodePath 通过getPackageCodePath() 获取 * @return */public static boolean getRootPermission(String pkgCodePath){Process process = null;          DataOutputStream os = null;          try {              String cmd="chmod 777 " + pkgCodePath;              process = Runtime.getRuntime().exec("su"); //切换到root帐号              os = new DataOutputStream(process.getOutputStream());              os.writeBytes(cmd + "\n");              os.writeBytes("exit\n");              os.flush();              process.waitFor();          } catch (Exception e) {              return false;          } finally {              try {                  if (os != null) {                      os.close();                  }                  process.destroy();              } catch (Exception e) {              }          }        return true;  }

2.判断root权限获取结果:ls -l pkgCodePath

/** * 判断某个路径的app的权限 * @param pkgCodePath * @return */private static boolean checkRoot(String pkgCodePath){Process process = null; try {  String cmd="ls -l " + pkgCodePath;            process = Runtime.getRuntime().exec(cmd);                      BufferedReader mReader = new BufferedReader(new InputStreamReader(process.getInputStream()));            StringBuffer mRespBuff = new StringBuffer();            char[] buff = new char[1024*10];            int ch = 0;            while((ch = mReader.read(buff)) != -1){            mRespBuff.append(buff, 0, ch);            }            mReader.close();                        String regx="-rwxr[\\s\\S]+";//root后权限的表达式             return Pattern.matches(regx, mRespBuff.toString());        } catch (Exception e) {          System.out.println("checkRoot exception");            return false;          } finally {              try {                  process.destroy();              } catch (Exception e) {              e.printStackTrace();            }          }}

3.停用应用:String cmd="pm disable " + packageName; 

/** * 停用应用 * @param context 上下文信息 * @param packageName 应用的包名 * @return */public static boolean invalidApp(Context context,String packageName){if(!getRootPermission(context.getPackageCodePath())){Toast.makeText(context, "冻结应用需要root权限", 0).show();        return false;        }Process process = null;          DataOutputStream os = null;          try {              String cmd="pm disable " + packageName;              process = Runtime.getRuntime().exec("su"); //切换到root帐号              os = new DataOutputStream(process.getOutputStream());              os.writeBytes(cmd + "\n");              os.writeBytes("exit\n");              os.flush();              process.waitFor();          } catch (Exception e) {         Toast.makeText(context, "冻结应用失败", 0).show();            return false;          } finally {              try {                  if (os != null) {                      os.close();                  }                  process.destroy();              } catch (Exception e) {              }          }          Toast.makeText(context, "冻结应用成功", 0).show();        return true;  }

4.启用应用:String cmd="pm enable " + packageName;

/** * 启用应用 * @param context * @param packageName * @return */public static boolean validApp(Context context,String packageName){if(!getRootPermission(context.getPackageCodePath())){Toast.makeText(context, "解除冻结需要root权限", 0).show();        return false;        }Process process = null;          DataOutputStream os = null;          try {              String cmd="pm enable " + packageName;              process = Runtime.getRuntime().exec("su"); //切换到root帐号              os = new DataOutputStream(process.getOutputStream());              os.writeBytes(cmd + "\n");              os.writeBytes("exit\n");              os.flush();              process.waitFor();          } catch (Exception e) {          Toast.makeText(context, "解除冻结失败", 0).show();            return false;          } finally {              try {                  if (os != null) {                      os.close();                  }                  process.destroy();              } catch (Exception e) {              }          }          Toast.makeText(context, "解除冻结成功", 0).show();        return true;  }




更多相关文章

  1. 让Android(安卓)变身回一台真正的Linux系统!!!
  2. Android(安卓)判断应用程序获取通知栏权限是否开启,以及如何跳转
  3. android系统更新应用的添加
  4. android provision
  5. Linux Deploy:在Android上部署Linux
  6. Android(安卓)Wifi模块学习
  7. Android振动系统学习
  8. 使用AndroidStudio生成打有系统签名的apk
  9. Android(安卓)学习大纲

随机推荐

  1. android之Activity
  2. android自定义控件:可旋转View:可作为Image
  3. Android(安卓)DSL简介
  4. 百度地图 android SDKv2.2.0
  5. Android官方刷新组件 SwipeRefreshLayout
  6. 【整理】Android(安卓)animation - 基础
  7. Android(安卓)开发之v4库冲突问题解决方
  8. Android 基本按钮
  9. Android(安卓)& Java 注释模板的设置
  10. android 发送邮件到QQEmail