前段时间做了一个批量安装卸载应用程序的小应用,由于安装卸载应用程序的部分API是隐藏的,所以必须在ubuntu下下载Android系统源码,并编译之后使用MM命令编译生成APK文件,其实也难。思路是这样的,在XX/packages/apps目录下有一个PackageInstaller的应用程序,Android机器中安装卸载都是由这个应用程序完成的。但是它没有批量安装和卸载的功能,如果要在自己的应用程序中添加批量安装和卸载的功能,其实很简单,只需要参考PakcageInstaller里面的安装卸载代码加个循环就可以了。但值得注意的是在编译的过程中必须复制PackageInstaller里面的Android.mk文件,修改文件为工程目录名。好了,废话不再多说,下面是关键代码

1、 Android.mk文件

[plain] view plain copy
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS:=optional
  4. LOCAL_SRC_FILES:=$(callall-subdir-java-files)
  5. LOCAL_PACKAGE_NAME:=PackageInstaller
  6. LOCAL_CERTIFICATE:=platform
  7. include$(BUILD_PACKAGE)


2、PakcageInstaller.java文件(关键代码)

[java] view plain copy
  1. packagecn.ceadic.apkmgr;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.FileOutputStream;
  5. importjava.io.IOException;
  6. importandroid.content.Context;
  7. importandroid.content.Intent;
  8. importandroid.content.pm.PackageInfo;
  9. importandroid.content.pm.PackageManager;
  10. importandroid.content.pm.PackageManager.NameNotFoundException;
  11. importandroid.net.Uri;
  12. importandroid.util.Log;
  13. importandroid.content.pm.IPackageInstallObserver;
  14. importandroid.content.pm.IPackageDeleteObserver;
  15. importandroid.os.FileUtils;
  16. publicclassPackageInstaller{
  17. privateFilemTmpFile;
  18. privatefinalStringTMP_FILE_NAME="tmpCopy.apk";
  19. privatefinalstaticStringTAG="PackInstaller";
  20. privateContextmContext;
  21. publicPackageInstaller(Contextcontext){
  22. mContext=context;
  23. }
  24. publicvoidinstall(Stringpath,StringpackageName){
  25. Intentintent=newIntent(Intent.ACTION_VIEW);
  26. intent.setDataAndType(Uri.fromFile(newFile(path)),
  27. "application/vnd.android.package-archive");
  28. mContext.startActivity(intent);
  29. }
  30. publicvoidinstatllBatch(Stringpath,StringpackageName){
  31. Log.i(TAG,"path="+path);
  32. intinstallFlags=0;
  33. PackageManagerpm=mContext.getPackageManager();
  34. try{
  35. PackageInfopi=pm.getPackageInfo(packageName,
  36. PackageManager.GET_UNINSTALLED_PACKAGES);
  37. if(pi!=null){
  38. installFlags|=PackageManager.INSTALL_REPLACE_EXISTING;
  39. }
  40. }catch(NameNotFoundExceptione){
  41. }
  42. if((installFlags&PackageManager.INSTALL_REPLACE_EXISTING)!=0){
  43. Log.w(TAG,"Replacingpackage:"+packageName);
  44. }
  45. //Createtempfilebeforeinvokinginstallapi
  46. mTmpFile=createTempPackageFile(path);
  47. if(mTmpFile==null){
  48. //Messagemsg=mHandler.obtainMessage(INSTALL_COMPLETE);
  49. //msg.arg1=PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
  50. //mHandler.sendMessage(msg);
  51. return;
  52. }
  53. UrimPackageURI=Uri.parse("file://"+mTmpFile.getPath());
  54. StringinstallerPackageName=mContext.getIntent().getStringExtra(
  55. Intent.EXTRA_INSTALLER_PACKAGE_NAME);
  56. PackageInstallObserverobserver=newPackageInstallObserver();
  57. pm.installPackage(mPackageURI,observer,installFlags,
  58. installerPackageName);
  59. }
  60. privateFilecreateTempPackageFile(StringfilePath){
  61. FiletmpPackageFile=mContext.getFileStreamPath(TMP_FILE_NAME);
  62. if(tmpPackageFile==null){
  63. Log.w(TAG,"Failedtocreatetempfile");
  64. returnnull;
  65. }
  66. if(tmpPackageFile.exists()){
  67. tmpPackageFile.delete();
  68. }
  69. //Openfiletomakeitworldreadable
  70. FileOutputStreamfos;
  71. try{
  72. fos=openFileOutput(TMP_FILE_NAME,MODE_WORLD_READABLE);
  73. }catch(FileNotFoundExceptione1){
  74. Log.e(TAG,"Erroropeningfile"+TMP_FILE_NAME);
  75. returnnull;
  76. }
  77. try{
  78. fos.close();
  79. }catch(IOExceptione){
  80. Log.e(TAG,"Erroropeningfile"+TMP_FILE_NAME);
  81. returnnull;
  82. }
  83. FilesrcPackageFile=newFile(filePath);
  84. if(!FileUtils.copyFile(srcPackageFile,tmpPackageFile)){
  85. Log.w(TAG,"Failedtomakecopyoffile:"+srcPackageFile);
  86. returnnull;
  87. }
  88. returntmpPackageFile;
  89. }
  90. privateclassPackageInstallObserverextendsIPackageInstallObserver.Stub{
  91. publicvoidpackageInstalled(StringpackageName,intreturnCode){
  92. //Messagemsg=mHandler.obtainMessage(INSTALL_COMPLETE);
  93. //msg.arg1=returnCode;
  94. //mHandler.sendMessage(msg);
  95. Log.i(TAG,"====INSTALL_COMPLETE");
  96. }
  97. }
  98. privateclassPackageDeleteObserverextendsIPackageDeleteObserver.Stub{
  99. publicvoidpackageDeleted(booleansucceeded){
  100. //Messagemsg=mHandler.obtainMessage(UNINSTALL_COMPLETE);
  101. //msg.arg1=succeeded?SUCCEEDED:FAILED;
  102. //mHandler.sendMessage(msg);
  103. Log.i(TAG,"====UNINSTALL_COMPLETE");
  104. }
  105. }
  106. publicvoiduninstall(StringpackageName){
  107. UripackageURI=Uri.parse("package:"+packageName);
  108. IntentuninstallIntent=newIntent(Intent.ACTION_DELETE,
  109. packageURI);
  110. mContext.startActivity(uninstallIntent);
  111. }
  112. publicvoiduninstallBatch(StringpackageName){
  113. PackageDeleteObserverobserver=newPackageDeleteObserver();
  114. mContext.getPackageManager().deletePackage(packageName,observer,0);
  115. }
  116. }


3、别忘记添加权限

[html] view plain copy
  1. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  2. <uses-permissionandroid:name="android.permission.INSTALL_PACKAGES"/>
  3. <uses-permissionandroid:name="android.permission.DELETE_PACKAGES"/>
  4. <uses-permissionandroid:name="android.permission.CLEAR_APP_CACHE"/>
  5. <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
  6. <uses-permissionandroid:name="android.permission.CLEAR_APP_USER_DATA"/>

以上代码在Android2.1的SDK中编译通过,并正确批量安装卸载应用程序

更多相关文章

  1. Android使用Itext生成pdf文件
  2. android下创建文件夹和修改其权限的方法
  3. Android 将少量的数据文件保存在 data/data 目录下
  4. Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析
  5. Android编译系统中头文件搜索路径的顺序问题
  6. Android 如何利用proc有上层想kernel写文件
  7. 仿微信、短信、QQ等消息数目右上角红色小圆球气泡显示(基于Androi
  8. 如何在开发时可以让Android应用程序支持安装到SD卡

随机推荐

  1. android开发(二):android结构
  2. Android入门教程(二)之------环境搭建
  3. android EditText中的inputType
  4. 安卓巴士总结了近百个Android优秀开源项
  5. 简单 4部 完成 android 二维码扫一扫功能
  6. Android中扫描多媒体文件操作详解
  7. Android的源代码结构
  8. Android(安卓)逆向apk的配置文件
  9. android重要包的描述
  10. Android(安卓)- 文件读写操作 总结