随笔之所以叫随笔,就是太随意了,说起来,之前的闹钟系列随笔还没写完,争取在十月结束之前找时间把它给写了吧。今天要讲的Android APK的静默安装、卸载。网上关于静默卸载的教程有很多,更有说要调用隐藏API,在源码下用MM命令编译生成APK的,反正我能力有限,没一一研究过,这里选择一种我试验成功的来讲。

  静默安装、卸载的好处就是你可以偷偷摸摸,干点坏事什么的,哈哈~

一、准备工作

  要实现静默安装、卸载,首先你要有root权限,能把你的静默安装、卸载程序移动到system/app目录下。

  1、用RE浏览器将你的应用(一般在/data/app目录下)移动到/system/app目录下,如果你的程序有.so文件,那么请将相应的.so文件从/data/data/程序包名/lib目录下移动到/system/lib目录下

  2、重启你的手机,你就会发现你的应用已经是系统级应用了,不能被卸载,也就是说你的应用现在已经八门全开,活力无限了。

二、静默安装需要的权限

   <!-- 静默安装所需权限,如与Manifest报错,请运行Project->clean -->
<!-- 允许程序安装应用 -->
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<!-- 允许程序删除应用 -->
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<!-- 允许应用清除应用缓存 -->
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<!-- 允许应用清除应用的用户数据 -->
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />

三、示例Demo创建

  首先,先把AndroidManifest.xml给完善好

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lsj.slient"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 静默安装所需权限,如与Manifest报错,请运行Project->clean -->
<!-- 允许程序安装应用 -->
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<!-- 允许程序删除应用 -->
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<!-- 允许应用清除应用缓存 -->
<uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<!-- 允许应用清除应用的用户数据 -->
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.lsj.slient.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

  接着,把布局文件activity_main.xml写好

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/install"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="静默安装"/> <Button
android:id="@+id/uninstall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="静默卸载"/> </LinearLayout>

  接下来,把实现静默安装的ApkManager工具类写完整

 package com.lsj.slient;

 import java.io.ByteArrayOutputStream;
import java.io.InputStream; import android.util.Log; /**
* 应用管理类
*
* @author Lion
*
*/
public class ApkManager { private static final String TAG = "ApkManager";
private static final String INSTALL_CMD = "install";
private static final String UNINSTALL_CMD = "uninstall"; /**
* APK静默安装
*
* @param apkPath
* APK安装包路径
* @return true 静默安装成功 false 静默安装失败
*/
public static boolean install(String apkPath) {
String[] args = { "pm", INSTALL_CMD, "-r", apkPath };
String result = apkProcess(args);
Log.e(TAG, "install log:"+result);
if (result != null
&& (result.endsWith("Success") || result.endsWith("Success\n"))) {
return true;
}
return false;
} /**
* APK静默安装
*
* @param packageName
* 需要卸载应用的包名
* @return true 静默卸载成功 false 静默卸载失败
*/
public static boolean uninstall(String packageName) {
String[] args = { "pm", UNINSTALL_CMD, packageName };
String result = apkProcess(args);
Log.e(TAG, "uninstall log:"+result);
if (result != null
&& (result.endsWith("Success") || result.endsWith("Success\n"))) {
return true;
}
return false;
} /**
* 应用安装、卸载处理
*
* @param args
* 安装、卸载参数
* @return Apk安装、卸载结果
*/
public static String apkProcess(String[] args) {
String result = null;
ProcessBuilder processBuilder = new ProcessBuilder(args);
Process process = null;
InputStream errIs = null;
InputStream inIs = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read = -1;
process = processBuilder.start();
errIs = process.getErrorStream();
while ((read = errIs.read()) != -1) {
baos.write(read);
}
baos.write('\n');
inIs = process.getInputStream();
while ((read = inIs.read()) != -1) {
baos.write(read);
}
byte[] data = baos.toByteArray();
result = new String(data);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (errIs != null) {
errIs.close();
}
if (inIs != null) {
inIs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
if (process != null) {
process.destroy();
}
}
return result;
}
}

  最后,把MainActivity.class补充完整

 package com.lsj.slient;

 import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { /**
* <pre>
* 需要安装的APK程序包所在路径
* 在Android4.2版本中,Environment.getExternalStorageDirectory().getAbsolutePath()得到的不一定是SDCard的路径,也可能是内置存储卡路径
* </pre>
*/
private static final String apkPath = Environment
.getExternalStorageDirectory().getAbsolutePath() + "/test.apk";
/**
* 要卸载应用的包名
*/
private static final String packageName = "com.example.directory"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); findViewById(R.id.install).setOnClickListener(this);
findViewById(R.id.uninstall).setOnClickListener(this);
} @Override
public void onClick(View v) {
boolean isSucceed = false;
switch (v.getId()) {
case R.id.install:
isSucceed = ApkManager.install(apkPath);
if (isSucceed) {
Toast.makeText(MainActivity.this, "静默安装成功", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(MainActivity.this, "静默安装失败", Toast.LENGTH_SHORT)
.show();
}
break;
case R.id.uninstall:
isSucceed = ApkManager.uninstall(packageName);
if (isSucceed) {
Toast.makeText(MainActivity.this, "静默卸载成功", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(MainActivity.this, "静默卸载失败", Toast.LENGTH_SHORT)
.show();
}
break;
default:
break;
}
} }

  OK,如此,静默安装、卸载就已经实现了!

作者:登天路

转载请说明出处:http://www.cnblogs.com/travellife/

源码下载:百度云盘

测试APK:百度云盘

Android随笔之——静默安装、卸载的更多相关文章

  1. android 静默安装 卸载 资料汇总

    1. android + eclipse + 后台静默安装(一看就会) 2. 适用于android1.5以下版本apk静默安装 3. error: INSTALL_FAILED_SHARED_USER ...

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

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

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

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

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

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

  5. Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)

    一.通过Intent消息机制发送消息,调用系统应用进行,实现apk的安装/卸载 . (1) 调用系统的安装应用,让系统自动进行apk的安装 String fileName = "/data/ ...

  6. 让Android程序获得系统的权限,实现关机重启,静默安装等功能

    引用:http://www.cnblogs.com/welenwho/archive/2012/05/10/2494984.html android想要获得系统权限有几种途径,一种就是你的程序固化的系 ...

  7. Android获取Root权限之后的静默安装实现代码示例分析

    转:http://blog.csdn.net/jiankeufo/article/details/43795015 Adroid开发中,我们有时会遇到一些特殊功能的实现,有些功能并没有太高技术难度,但 ...

  8. Android实现静默安装与卸载

    一般情况下,Android系统安装apk会出现一个安装界面,用户可以点击确定或者取消来进行apk的安装. 但在实际的项目需求中,有一种需求,就是希望apk在后台安装(不出现安装界面的提示),这种安装方 ...

  9. Android对于静默安装和卸载

    在一般情况下,Android系统安装apk会有一个安装界面,用户可以单击确定或取消apk设备. 但在实际的项目需求中,有一种需求.就是希望apk在后台安装(不出现安装界面的提示),这样的安装方式称为静 ...

随机推荐

  1. 了解vmware tools

    了解vmware tools vmware tools是虚拟机VMware Workstation自带的一款工具,它的作用就是使用户可以从物理主机直接往虚拟机里面拖文件.如果不安装它,我们是无法进行虚 ...

  2. VS2010 ERROR:c1xx fatal error c1083

    在VS2010中新建文件夹,然后在文件夹内新建文件polling.cpp,可是在项目中不现实该cpp文件,所以就在在硬盘上将该文件删除,编译报错. >c1xx : fatal error C10 ...

  3. CSS3总结

    1.圆角效果 border-radius: 1px 1px 1px 1px; /* 四个半径值分别是左上角.右上角.右下角和左下角.顺时针 */  右边半圆 div.right-circle{ hei ...

  4. cocoapods安装出错问题

    今天执行pod install时,出现了错误,提示更新,好,那就更新; 1.终端执行了下:gem sources -l   查看了下源 *** CURRENT SOURCES *** https:// ...

  5. ubuntu14.04上Virtualbox安装win7(使用Ghost镜像安装,启用USB设备支持,设置共享目录)

    由于某些软件只有windows版本,于是只好安装个虚拟机win7 /**************************安装*************************************/ ...

  6. 如何创建一个Edge 浏览器扩展

    随着微软Windows 10 年度更新的发布,数次延宕的Edge 扩展功能终于得到了官方正式支持.我在我的另外一个博客上发布了如何创建一个Edge 浏览器扩展的博文,链接如下: https://blo ...

  7. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  8. SQL Server 2012故障转移的looksalive check和is alive check

    什么是looksalive check和is alive check SQL Server故障转移集群是建立在windows集群服务上的一种热备的高可用方案.在集群运行过程中,windows集群服务定 ...

  9. 从Knockout到Angular的架构演变

    2008年第一次在WPF中使用MVVM模式之后,就一直热衷于耦合隔离.模块化与重构.UI和逻辑分离.单元测试以及后面的领域模型.谈及MVVM模式,自己也开发过一套框架,但没有长期更新和维护,所以索性就 ...

  10. 浅析MSIL中间语言——PE文件结构篇

    一.开篇 开篇我想讲一下于本文无关的话题,其实我很想美化一下自己博客园一直没时间弄,无意间找了博客园李宝亨的博客园里面有一篇分享自己主题的文章,我就将这个模板暂时用作我的blog主题,我要讲述一个关于 ...