android安装root,android开发实现静默安装(root权限)

方式是将应用设置为内置的系统应用,注意事system/app目录下面,采用copy2SystemApp()方法就可以,注意chmod 777的权限,若是直接将apk拷贝到system/app目录,没有这个权限还是不能静默安装的。

直接贴出工具类:

public class ApkController {

/**

* 描述: 安装

*/

public static boolean install(String apkPath,Context context){

// 先判断手机是否有root权限

if(hasRootPerssion()){

// 有root权限,利用静默安装实现

return clientInstall(apkPath);

}else{

// 没有root权限,利用意图进行安装

File file = new File(apkPath);

if(!file.exists())

return false;

Intent intent = new Intent();

intent.setAction("android.intent.action.VIEW");

intent.addCategory("android.intent.category.DEFAULT");

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");

context.startActivity(intent);

return true;

}

}

/**

* 描述: 卸载

*/

public static boolean uninstall(String packageName,Context context){

if(hasRootPerssion()){

// 有root权限,利用静默卸载实现

return clientUninstall(packageName);

}else{

Uri packageURI = Uri.parse("package:" + packageName);

Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,packageURI);

uninstallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(uninstallIntent);

return true;

}

}

/**

* 判断手机是否有root权限

*/

public static boolean hasRootPerssion(){

PrintWriter PrintWriter = null;

Process process = null;

try {

process = Runtime.getRuntime().exec("su");

PrintWriter = new PrintWriter(process.getOutputStream());

PrintWriter.flush();

PrintWriter.close();

int value = process.waitFor();

return returnResult(value);

} catch (Exception e) {

e.printStackTrace();

}finally{

if(process!=null){

process.destroy();

}

}

return false;

}

/**

* 静默安装

*/

public static boolean clientInstall(String apkPath){

PrintWriter PrintWriter = null;

Process process = null;

try {

process = Runtime.getRuntime().exec("su");

PrintWriter = new PrintWriter(process.getOutputStream());

PrintWriter.println("chmod 777 "+apkPath);

PrintWriter.println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib");

PrintWriter.println("pm install -r "+apkPath);

// PrintWriter.println("exit");

PrintWriter.flush();

PrintWriter.close();

int value = process.waitFor();

return returnResult(value);

} catch (Exception e) {

e.printStackTrace();

}finally{

if(process!=null){

process.destroy();

}

}

return false;

}

/**

* 静默卸载

*/

public static boolean clientUninstall(String packageName){

PrintWriter PrintWriter = null;

Process process = null;

try {

process = Runtime.getRuntime().exec("su");

PrintWriter = new PrintWriter(process.getOutputStream());

PrintWriter.println("LD_LIBRARY_PATH=/vendor/lib:/system/lib ");

PrintWriter.println("pm uninstall "+packageName);

PrintWriter.flush();

PrintWriter.close();

int value = process.waitFor();

return returnResult(value);

} catch (Exception e) {

e.printStackTrace();

}finally{

if(process!=null){

process.destroy();

}

}

return false;

}

/**

* 启动app

* com.exmaple.client/.MainActivity

* com.exmaple.client/com.exmaple.client.MainActivity

*/

public static boolean startApp(String packageName,String activityName){

boolean isSuccess = false;

String cmd = "am start -n " + packageName + "/" + activityName + " \n";

Process process = null;

try {

process = Runtime.getRuntime().exec(cmd);

int value = process.waitFor();

return returnResult(value);

} catch (Exception e) {

e.printStackTrace();

} finally{

if(process!=null){

process.destroy();

}

}

return isSuccess;

}

/**

* 将文件复制到system/app 目录

* @param apkPath 特别注意格式:该路径不能是:/storage/emulated/0/app/QDemoTest4.apk 需要是:/sdcard/app/QDemoTest4.apk

* @return

*/

public static boolean copy2SystemApp(String apkPath){

PrintWriter PrintWriter = null;

Process process = null;

String appName = "chetou.apk",cmd;

try {

process = Runtime.getRuntime().exec("su");

PrintWriter = new PrintWriter(process.getOutputStream());

cmd = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system";

Log.e("copy2SystemApp", cmd);

PrintWriter.println(cmd);

cmd = "cat "+apkPath+" > /system/app/"+appName;

Log.e("copy2SystemApp", cmd);

PrintWriter.println(cmd);

cmd = "chmod 777 /system/app/"+appName +" -R";

Log.e("copy2SystemApp", cmd);

PrintWriter.println(cmd);

cmd = "mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system";

Log.e("copy2SystemApp", cmd);

PrintWriter.println(cmd);

PrintWriter.println("reboot"); //重启

PrintWriter.println("exit");

PrintWriter.flush();

PrintWriter.close();

int value = process.waitFor();

return returnResult(value);

} catch (Exception e) {

e.printStackTrace();

}finally{

if(process!=null){

process.destroy();

}

}

return false;

}

private static boolean returnResult(int value){

// 代表成功

if (value == 0) {

return true;

} else if (value == 1) { // 失败

return false;

} else { // 未知情况

return false;

}

}

}

android开发实现静默安装(fota升级)

这里只提供一个思路,也是咨询大神才了解到的. fota升级主要用于系统及系统应用的升级,不过貌似也会弹出提示用于用户确认.既然做到系统级别了,估计也一样可以静默安装的.

Android随笔之——静默安装、卸载

随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧.今天要讲的Android APK的静默安装.卸载.网上关于静默卸载的教程有很多,更有说要调用隐 ...

Android从零开始——Android开发环境的安装

Android开发环境的安装 1 IDE Android可以使用开发的IDE有Eclipse 或者 Android Studio.Android Studio还处于v 0.1.x版本,是early a ...

Android开发环境的安装 Eclipse

Android开发环境的安装 1 IDE Android可以使用开发的IDE有Eclipse 或者 Android Studio.Android Studio还处于v 0.1.x版本,是early a ...

android开发 更新升级安装到一半自动闪退

如题:android开发 更新升级安装到一半自动闪退,,,解决办法,如下(红色为我新增的代码) /**     * 安装APK文件     */    private void installApk( ...

【Android】Android 代码判断是否获取ROOT权限(二)

[Android]Android 代码判断是否获取ROOT权限 方法比较简单,直接粘贴代码 /** * 判断当前手机是否有ROOT权限 * @return */ public boolean isRo ...

【Android】Android 代码判断是否获取ROOT权限(一)

[Android]Android 代码判断是否获取ROOT权限 方法比较简单,直接粘贴代码 public synchronized boolean getRootAhth() { Process pr ...

android开发,关于android app实现静默安装自己(系统签名)

产品需求,木有办法.android系统是跟厂商定制的,保证系统开机就运行我们的app,并且实现自己静默安装,完全自动化,无需人工操作. 网上有很多办法, 1.要么要通过android 源码拿到密钥文件 ...

Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)

介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工 ...

随机推荐

Oracle存储过程中异常Exception的捕捉和处理

Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...

FTP 的搭建过程和遇到的问题

http://linux.it.net.cn/e/server/ftp/2015/0227/13554.htmlhttps://mp.weixin.qq.com/s?__biz=MzA3OTgyMDc ...

[MIREX] MIREX评测介绍

MIREX作为国际最权威音频检索评测大赛,竟然在百度上找不到任何介绍,只有几个与什么搜狗.腾讯获得什么成绩相关的检索内容,相比而言,TRECVID的内容收到重视多了...由于研究生阶段主要研究音频领域 ...

C#调用cmd 脚本实例

1.实例1 public static void TestOne() { Process p = new Process(); p.StartInfo.FileName = "cmd.exe ...

BZOJ 1062 糖果雨

http://www.lydsy.com/JudgeOnline/problem.php?id=1062 思路:找到平行四边形以后,变换坐标:y->y-kx,k为斜率,这样变成了矩形,然后只要二 ...

动态加载EXE和DLL

程序中加载了一个DLL文件,但生成的EXE在脱离了DLL文件后仍然可以 单独使用,这是动态加载DLL技术.即:调用资源中的DLL. 此技术的好处:EXE可以使用DLL中的函数,但不会额外增加一 个DL ...

CentOS7 Python2 和Python3 共存(Python3安装)【转】

1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用 python -V 命令查看一下是否安 ...

1. Spring 框架简介及官方压缩包目录

一.Spring 框架简介及官方压缩包目录介绍 1.主要发明者:Rod Johnson 2.轮子理论推崇者:     2.1 轮子理论:不用重复发明轮子.     2.2 IT 行业:直接使用写好的代 ...

FDLocalSQL

FDLocalSQL http://docwiki.embarcadero.com/Libraries/Berlin/en/FireDAC.Phys.SQLiteVDataSet.TFDLocalSQ ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值