读书人

批量装配于卸载

发布时间: 2012-11-22 00:16:41 作者: rapoo

批量安装于卸载

有尝试过在Android手机里批量安装于批量卸载你的应用程序吗,现在就简单教你怎么做,其实很简单,还有后台安装于卸载问题:

1.后台安装于卸载步骤:

首先你需要使用其Pm命令,如一下

  1. pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f] PATH
  2. pm uninstall [-k] PACKAGE
代码实现也很简单,使用流的方式来进行相关操作:

  1. public static void execCommand(String... command) {
  2. 02 Process process = null;
  3. 03 try {
  4. 04 process = new ProcessBuilder().command(command).start();
  5. 05 //对于命令的执行结果我们可以通过流来读取
  6. 06 // InputStream in = process.getInputStream();
  7. 07 // OutputStream out = process.getOutputStream();
  8. 08 // InputStream err = process.getErrorStream();
  9. 09 } catch (IOException e) {
  10. 10 e.printStackTrace();
  11. 11 } finally {
  12. 12 if (process != null)
  13. 13 process.destroy();
  14. 14 }
  15. 15 }
  16. 1 execCommand("pm", "install", "-f", filePath);//安装apk,filePath为apk文件路径,如/mnt/sdcard/ApiDemos.apk
  17. 2 execCommand("pm", "uninstall", packageName);//卸载apk,packageName为包名,如com.example.android.apis

注意一下:

  1. 编译生成apk时,要在你的manifest文件下添加android:sharedUserId="android.uid.system",编译完成之后还无法正常安装,会出现Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE错误,此时,要为apk重新签名。
  2. 在android源码\build\target\product\security中找platform.pk8和platform.x509.pem两个文件,在android 编绎目录out下找到 signapk.jar 这个包(源码目录\build\tools\signapk),并把编译好的apk(如PMDemo.apk)放在同一目录下,在重新签名之前,用rar文件打开apk文件,进入META-INF目录下,将CERT.SF和CERT.RSA这两个文件删除掉,然后在命令行中执行以下命令:
  3. 1 java -jar signapk.jar platform.x509.pem platform.pk8 PMDemo.apk NewPMDemo.apk
  4. 安装前先把旧的apk卸载,这样重新签名之后的apk就可以正常安装了。

很简单吧,下面看下批量操作:

直接看代码吧:

  1. 通常情况下,android是没有提供静默方式的上层接口,我们需要在android源代码下来调用这个隐藏的接口来完成静默安装。
  2. 最重要的就是参考android系统目录下的packages/apps/PackageInstaller,
  3. 当中有两个文件 PackageInstallerActivity.java,InstallAppProgress.java ,前者就是我们通常看到的带有提示对话框的安装应用程序,后者是点确定安装后调用的intent。
  4. 现提供一个静默安装的关键类,该类在android2.2下成功编译, 其中通过循环调用接口instatllBatch则可实现批量安装
  5. 当然最后的应用程序别忘记添加权限
  6. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  7. <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
  8. <uses-permission android:name="android.permission.DELETE_PACKAGES" />
  9. <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
  10. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  11. <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
  12. package com.android.util;
  13. import java.io.File;
  14. import java.io.FileNotFoundException;
  15. import java.io.FileOutputStream;
  16. import java.io.IOException;
  17. import android.content.Context;
  18. import android.content.Intent;
  19. import android.content.pm.PackageInfo;
  20. import android.content.pm.PackageManager;
  21. import android.content.pm.PackageManager.NameNotFoundException;
  22. import android.content.pm.ApplicationInfo;
  23. import android.content.pm.PackageParser;
  24. import android.net.Uri;
  25. import android.util.Log;
  26. import android.util.DisplayMetrics;
  27. import android.content.pm.IPackageInstallObserver;
  28. import android.content.pm.IPackageDeleteObserver;
  29. import android.os.FileUtils;
  30. import android.os.Handler;
  31. import android.os.Message;
  32. public class PackageInstaller {
  33. private File mTmpFile;
  34. private final int INSTALL_COMPLETE = 1;
  35. final static int SUCCEEDED = 1;
  36. final static int FAILED = 0;
  37. private final static String TAG = "PackInstaller";
  38. private Context mContext;
  39. private ApplicationInfo mAppInfo;
  40. public PackageInstaller(Context context) {
  41. mContext = context;
  42. }
  43. public void install(String path,String packageName){
  44. Intent intent = new Intent(Intent.ACTION_VIEW);
  45. intent.setDataAndType(Uri.fromFile(new File(path)),
  46. "application/vnd.android.package-archive");
  47. mContext.startActivity(intent);
  48. }
  49. public void instatllBatch(String path) {
  50. Log.i(TAG, "path=" + path);
  51. int installFlags = 0;
  52. Uri mPackageURI = Uri.fromFile(new File(path));
  53. PackageParser.Package mPkgInfo = getPackageInfo(mPackageURI);
  54. mAppInfo = mPkgInfo.applicationInfo;
  55. String packageName = mAppInfo.packageName;
  56. Log.i(TAG, "====install packageName ="+packageName);
  57. PackageManager pm = mContext.getPackageManager();
  58. try {
  59. PackageInfo pi = pm.getPackageInfo(packageName,
  60. PackageManager.GET_UNINSTALLED_PACKAGES);
  61. if (pi != null) {
  62. installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
  63. }
  64. } catch (NameNotFoundException e) {
  65. }
  66. if ((installFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) {
  67. Log.w(TAG, "Replacing package:" + packageName);
  68. }
  69. PackageInstallObserver observer = new PackageInstallObserver();
  70. pm.installPackage(mPackageURI, observer, installFlags,
  71. packageName);
  72. }
  73. private class PackageInstallObserver extends IPackageInstallObserver.Stub {
  74. public void packageInstalled(String packageName, int returnCode) {
  75. // Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
  76. // msg.arg1 = returnCode;
  77. // mHandler.sendMessage(msg);
  78. Log.i(TAG, "====INSTALL_COMPLETE");
  79. }
  80. }
  81. private class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
  82. public void packageDeleted(boolean succeeded) {
  83. // Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE);
  84. // msg.arg1 = succeeded?SUCCEEDED:FAILED;
  85. // mHandler.sendMessage(msg);
  86. Log.i(TAG, "====UNINSTALL_COMPLETE");
  87. }
  88. }
  89. public void uninstall(String packageName){
  90. Uri packageURI = Uri.parse("package:" + packageName);
  91. Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,
  92. packageURI);
  93. mContext.startActivity(uninstallIntent);
  94. }
  95. public void uninstallBatch(String packageName) {
  96. PackageDeleteObserver observer = new PackageDeleteObserver();
  97. mContext.getPackageManager().deletePackage(packageName, observer, 0);
  98. }
  99. public PackageParser.Package getPackageInfo(Uri packageURI) {
  100. final String archiveFilePath = packageURI.getPath();
  101. PackageParser packageParser = new PackageParser(archiveFilePath);
  102. File sourceFile = new File(archiveFilePath);
  103. DisplayMetrics metrics = new DisplayMetrics();
  104. metrics.setToDefaults();
  105. PackageParser.Package pkg = packageParser.parsePackage(sourceFile,
  106. archiveFilePath, metrics, 0);
  107. // Nuke the parser reference.
  108. packageParser = null;
  109. return pkg;
  110. }
  111. public ApplicationInfo getApplicationInfo(Uri packageURI) {
  112. final String archiveFilePath = packageURI.getPath();
  113. PackageParser packageParser = new PackageParser(archiveFilePath);
  114. File sourceFile = new File(archiveFilePath);
  115. DisplayMetrics metrics = new DisplayMetrics();
  116. metrics.setToDefaults();
  117. PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
  118. if (pkg == null) {
  119. return null;
  120. }
  121. return pkg.applicationInfo;
  122. }
  123. private Handler mHandler = new Handler() {
  124. public void handleMessage(Message msg) {
  125. switch (msg.what) {
  126. case INSTALL_COMPLETE:
  127. if(msg.arg1 == SUCCEEDED) {
  128. } else {}
  129. break;
  130. default:
  131. break;
  132. }
  133. }
  134. };
  135. }

读书人网 >移动开发

热点推荐