android apk靜默安裝和解除安裝
轉自:http://blog.csdn.net/gchk125/article/details/8553805
靜默安裝:
在某個觸發點自動後臺安裝指定apk.沒有安裝介面.新軟體自動安裝,有舊版本的默默解除安裝,然後再安裝,並且在不受系統設定中的第三方軟體安裝開關的限制.
自己跟蹤記錄的原始碼流程
Filemanager中點選apk包之後傳送了一個intent出去
|
Android會去系統中的packagemanager中查詢哪個apk能響應這個操作.
找到PackageInstaller這個apk.檔案路勁位於packages\apps\PackageInstaller
|
系統會啟動這個Activity來進行安裝操作
本文件只貼出具體安裝的過程,捨棄ui操作,並加以簡單說明
|
|
|
|
好了.迴歸主題.靜默安裝的關鍵程式碼已經出來了.只有一行
pm.installPackage(mPackageURI,observer, installFlags(0), installerPackageName);
看原始碼中該函式說明必須要加上android.Manifest.permission#INSTALL_PACKAGES才行,此許可權只有system應用才能使用.所以此應用必須放入system/app下,才能保證其有效.方法就是反射
靜默安裝的第一種方法:
- package com.tnt.autoinstall;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.InputStream;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import android.net.Uri;
- import android.os.Bundle;
- import android.app.Activity;
- public class MainActivity extends Activity {
- private Uri packageUri;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- packageUri = getPackageUri();
- install();
- }
- private void install()
- {
- try {
- Class<?> pmService;
- Class<?> activityTherad;
- Method method;
- activityTherad = Class.forName("android.app.ActivityThread");
- Class<?> paramTypes[] = getParamTypes(activityTherad , "getPackageManager");
- method = activityTherad.getMethod("getPackageManager", paramTypes);
- Object PackageManagerService = method.invoke(activityTherad);
- pmService = PackageManagerService.getClass();
- Class<?> paramTypes1[] = getParamTypes(pmService , "installPackage");
- method = pmService.getMethod("installPackage", paramTypes1);
- method.invoke(PackageManagerService , packageUri , null , 0 , null);
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }catch (ClassNotFoundException e1) {
- e1.printStackTrace();
- }
- }
- private Class<?>[] getParamTypes(Class<?> cls, String mName) {
- Class<?> cs[] = null;
- Method[] mtd = cls.getMethods();
- for (int i = 0; i < mtd.length; i++) {
- if (!mtd[i].getName().equals(mName)) {
- continue;
- }
- cs = mtd[i].getParameterTypes();
- }
- return cs;
- }
- private Uri getPackageUri()
- {
- File file = new File("/storage/sdcard0/download/1.apk");
- return Uri.fromFile(file);
- }
- }
靜默安裝的第二種方法:
通過adb命令的方式來處理,程式碼如下,把上面的install函式替換下面程式碼
- private boolean install()
- {
- String[] args = {"pm", "install", "-r", packageUri.getPath()};
- 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();
- }
- }
- if(result != null && (result.endsWith("Success")||result.endsWith("Success\n")))
- {
- return true;
- }
- return false;
- }
下面看下解除安裝過程
同樣的.需要增加一個許可權android:name="android.permission.DELETE_PACKAGES".放入system/app中.
解除安裝方式一:adb shell pm方式
- private void uninstall2() {
- String[] args = { "pm", "uninstall", "com.popcap.pvzthird" };
- 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();
- }
- }
- }
解除安裝方式二:反射呼叫系統函式
- Class<?> pmService;
- Class<?> activityTherad;
- Method method;
- activityTherad = Class.forName("android.app.ActivityThread");
- Class<?> paramTypes[] = getParamTypes(activityTherad,
- "getPackageManager");
- method = activityTherad.getMethod("getPackageManager", paramTypes);
- Object PackageManagerService = method.invoke(activityTherad);
- pmService = PackageManagerService.getClass();
- Class<?> paramTypes1[] = getParamTypes(pmService, "deletePackage");
- method = pmService.getMethod("deletePackage", paramTypes1);
- method.invoke(PackageManagerService, "com.popcap.pvzthird", null, 0);
相關文章
- 【11g 單庫解除安裝、靜默安裝】實驗
- rac靜默安裝
- Oracle靜默安裝Oracle
- Oracle 19C的下載和安裝部署(圖形安裝和靜默安裝)Oracle
- Linux下靜默安裝OraceLinux
- Ubuntu解除安裝和安裝Ubuntu
- 靜默安裝and手動建庫
- oracle 19C 靜默安裝Oracle
- 靜默安裝oracle時報錯Oracle
- AnolisOS 7.9 靜默安裝Oacle 11.2.0.4
- centos 7.4靜默安裝oracle 19.3CentOSOracle
- linux 解除安裝jdk和安裝LinuxJDK
- 靜默方式安裝、升級oracle(一): 安裝oracle軟體Oracle
- 【靜默】在RHEL 6.5上靜默安裝Oracle 18cOracle
- 靜默方式安裝11gR2
- Oracle Linux 7.1 靜默安裝Weblogic 12.2.1.3OracleLinuxWeb
- vs2015解除安裝和安裝
- Android 流氓軟體靜默安裝是怎麼實現的?Android
- Ubuntu解除安裝及安裝node和npmUbuntuNPM
- RedHat上靜默安裝Oracle11gRedhatOracle
- CentOS 7.2靜默安裝Oracle11gCentOSOracle
- redhat7.2靜默安裝Oracle11.2.0.4RedhatOracle
- CentOS 7.5靜默安裝Oracle 11gCentOSOracle
- Windows 7平臺靜默安裝11.2.0.4軟體及靜默建庫Windows
- 安裝npm 解除安裝npm 安裝apidocNPMAPI
- android apk安裝過程原始碼解析AndroidAPK原始碼
- 免root解除安裝Android預裝應用Android
- Linux安裝解除安裝MySQLLinuxMySql
- cocoapods安裝/解除安裝/使用
- JDK安裝和解除安裝JDK
- docker安裝及解除安裝Docker
- 靜默安裝Oracle11g資料庫Oracle資料庫
- 靜默方式安裝oracle 11g 完整攻略Oracle
- oracle11g客戶端靜默安裝Oracle客戶端
- 靜默安裝Oracle資料庫11gOracle資料庫
- 靜默安裝19C RAC的指令碼指令碼
- 【配置安裝】靜默安裝Oracle資料庫軟體12c&19cOracle資料庫
- win10如何禁止靜默執行_win10禁止靜默安裝方法Win10
- Mac Redis安裝與解除安裝MacRedis