转 android 4.0.4系统下实现apk的静默安装和启动

分类: Android 1762人阅读 评论(10) 收藏 举报

最近在android 4.0.4系统下实现apk的静默安装和启动的功能,这里和大家分享一下,希望能有所帮助。

源码如下:

[java] view plain copy
  1. importjava.io.DataOutputStream;
  2. importjava.io.File;
  3. importjava.io.IOException;
  4. importjava.io.OutputStream;
  5. importjava.util.ArrayList;
  6. importjava.util.List;
  7. importandroid.content.Context;
  8. importandroid.content.Intent;
  9. importandroid.content.pm.ActivityInfo;
  10. importandroid.content.pm.PackageInfo;
  11. importandroid.content.pm.PackageManager;
  12. importandroid.content.pm.ResolveInfo;
  13. publicclassInstallApkUtils{
  14. publicstaticvoidinstallAndStartApk(finalContextcontext,finalStringapkPath){
  15. if((apkPath==null)||(context==null)){
  16. return;
  17. }
  18. Filefile=newFile(apkPath);
  19. if(file.exists()==false){
  20. return;
  21. }
  22. newThread(){
  23. publicvoidrun(){
  24. StringpackageName=getUninstallApkPackageName(context,apkPath);
  25. if(silentInstall(apkPath)){
  26. List<ResolveInfo>matches=findActivitiesForPackage(context,packageName);
  27. if((matches!=null)&&(matches.size()>0)){
  28. ResolveInforesolveInfo=matches.get(0);
  29. ActivityInfoactivityInfo=resolveInfo.activityInfo;
  30. startApk(activityInfo.packageName,activityInfo.name);
  31. }
  32. }
  33. };
  34. }.start();
  35. }
  36. publicstaticStringgetUninstallApkPackageName(Contextcontext,StringapkPath){
  37. StringpackageName=null;
  38. if(apkPath==null){
  39. returnpackageName;
  40. }
  41. PackageManagerpm=context.getPackageManager();
  42. PackageInfoinfo=pm.getPackageArchiveInfo(apkPath,
  43. PackageManager.GET_ACTIVITIES);
  44. if(info==null){
  45. returnpackageName;
  46. }
  47. packageName=info.packageName;
  48. returnpackageName;
  49. }
  50. publicstaticList<ResolveInfo>findActivitiesForPackage(Contextcontext,StringpackageName){
  51. finalPackageManagerpm=context.getPackageManager();
  52. finalIntentmainIntent=newIntent(Intent.ACTION_MAIN,null);
  53. mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  54. mainIntent.setPackage(packageName);
  55. finalList<ResolveInfo>apps=pm.queryIntentActivities(mainIntent,0);
  56. returnapps!=null?apps:newArrayList<ResolveInfo>();
  57. }
  58. publicstaticbooleansilentInstall(StringapkPath){
  59. Stringcmd1="chmod777"+apkPath+"\n";
  60. Stringcmd2="LD_LIBRARY_PATH=/vendor/lib:/system/libpminstall-r"+apkPath+"\n";
  61. returnexecWithSID(cmd1,cmd2);
  62. }
  63. privatestaticbooleanexecWithSID(String...args){
  64. booleanisSuccess=false;
  65. Processprocess=null;
  66. OutputStreamout=null;
  67. try{
  68. process=Runtime.getRuntime().exec("su");
  69. out=process.getOutputStream();
  70. DataOutputStreamdataOutputStream=newDataOutputStream(out);
  71. for(Stringtmp:args){
  72. dataOutputStream.writeBytes(tmp);
  73. }
  74. dataOutputStream.flush();//提交命令
  75. dataOutputStream.close();//关闭流操作
  76. out.close();
  77. isSuccess=waitForProcess(process);
  78. }catch(IOExceptione){
  79. e.printStackTrace();
  80. }
  81. returnisSuccess;
  82. }
  83. publicstaticbooleanstartApk(StringpackageName,StringactivityName){
  84. booleanisSuccess=false;
  85. Stringcmd="amstart-n"+packageName+"/"+activityName+"\n";
  86. try{
  87. Processprocess=Runtime.getRuntime().exec(cmd);
  88. isSuccess=waitForProcess(process);
  89. }catch(IOExceptione){
  90. NLog.i(TAG,e.getMessage());
  91. e.printStackTrace();
  92. }
  93. returnisSuccess;
  94. }
  95. privatestaticbooleanwaitForProcess(Processp){
  96. booleanisSuccess=false;
  97. intreturnCode;
  98. try{
  99. returnCode=p.waitFor();
  100. switch(returnCode){
  101. case0:
  102. isSuccess=true;
  103. break;
  104. case1:
  105. break;
  106. default:
  107. break;
  108. }
  109. }catch(InterruptedExceptione){
  110. e.printStackTrace();
  111. }
  112. returnisSuccess;
  113. }
  114. }

如果要使用,还需以下步骤:

1、在AndroidManifest.xml文件里添加如下权限:

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

2、进行系统签名。命令如下:

java -jar signapk.jar platform.x509.pem platform.pk8 XXX.apk Signed_XXX.apk

备注:一般可在源码的目录\out\host\linux-x86\framework\下找到signapk.jar,在\build\target\product\security下找到签名文件platform.x509.pem和platform.pk8。

好了,现在大功告成!!!

更多相关文章

  1. android中如何执行java命令
  2. AVD 简介
  3. H264解码器源码(Android(安卓)1.6 版)
  4. Android之——自动挂断电话的实现
  5. Android(安卓)单击listview弹出popupwindow弹出框
  6. Android(安卓)下面的一些命令
  7. Android(安卓)4.0 Launcher2源码分析——主布局文件
  8. 两分钟彻底让你明白Android中onInterceptTouchEvent与onTouchEve
  9. Android(安卓)4.0 Launcher2源码分析——主布局文件

随机推荐

  1. android解析json数组
  2. android:configChanges名词解析(文档翻译)
  3. android在service中使用AsyncHttpClient
  4. Android(安卓)SDK更新 Connection to htt
  5. Android(安卓)ndk 入门5 - opencv实现
  6. Android(安卓)Timer 更好方法
  7. 在服务器上使用 gradle 打包 android 源
  8. android aosp 源码版本
  9. 2013.09.09——— android 判断存储卡是
  10. 八款android日历 [Calendar] 开源项目框