产品需求,木有办法。android系统是跟厂商定制的,保证系统开机就运行我们的app,并且实现自己静默安装,完全自动化,无需人工操作。

网上有很多办法,

1、要么要通过android 源码拿到密钥文件,参考:http://www.cnblogs.com/brucenan/archive/2012/10/04/2711817.html

2、通过root权限,可以参考代码(已测试安装别人的apk可以,但是不能安装自己):

  1. import java.io.File;
  2. import java.io.PrintWriter;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.net.Uri;
  6. import android.util.Log;
  7.  
  8. public class ApkController {
  9. /**
  10. * 描述: 安装
  11. */
  12. public static boolean install(String apkPath,Context context){
  13. // 先判断手机是否有root权限
  14. if(hasRootPerssion()){
  15. // 有root权限,利用静默安装实现
  16. return clientInstall(apkPath);
  17. }else{
  18. // 没有root权限,利用意图进行安装
  19. File file = new File(apkPath);
  20. if(!file.exists())
  21. return false;
  22. Intent intent = new Intent();
  23. intent.setAction("android.intent.action.VIEW");
  24. intent.addCategory("android.intent.category.DEFAULT");
  25. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  26. intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
  27. context.startActivity(intent);
  28. return true;
  29. }
  30. }
  31.  
  32. /**
  33. * 描述: 卸载
  34. */
  35. public static boolean uninstall(String packageName,Context context){
  36. if(hasRootPerssion()){
  37. // 有root权限,利用静默卸载实现
  38. return clientUninstall(packageName);
  39. }else{
  40. Uri packageURI = Uri.parse("package:" + packageName);
  41. Intent uninstallIntent = new Intent(Intent.ACTION_DELETE,packageURI);
  42. uninstallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  43. context.startActivity(uninstallIntent);
  44. return true;
  45. }
  46. }
  47.  
  48. /**
  49. * 判断手机是否有root权限
  50. */
  51. public static boolean hasRootPerssion(){
  52. PrintWriter PrintWriter = null;
  53. Process process = null;
  54. try {
  55. process = Runtime.getRuntime().exec("su");
  56. PrintWriter = new PrintWriter(process.getOutputStream());
  57. PrintWriter.flush();
  58. PrintWriter.close();
  59. int value = process.waitFor();
  60. return returnResult(value);
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. }finally{
  64. if(process!=null){
  65. process.destroy();
  66. }
  67. }
  68. return false;
  69. }
  70.  
  71. /**
  72. * 静默安装
  73. */
  74. public static boolean clientInstall(String apkPath){
  75. PrintWriter PrintWriter = null;
  76. Process process = null;
  77. try {
  78. process = Runtime.getRuntime().exec("su");
  79. PrintWriter = new PrintWriter(process.getOutputStream());
  80. PrintWriter.println("chmod 777 "+apkPath);
  81. PrintWriter.println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib");
  82. PrintWriter.println("pm install -r "+apkPath);
  83. // PrintWriter.println("exit");
  84. PrintWriter.flush();
  85. PrintWriter.close();
  86. int value = process.waitFor();
  87. return returnResult(value);
  88. } catch (Exception e) {
  89. e.printStackTrace();
  90. }finally{
  91. if(process!=null){
  92. process.destroy();
  93. }
  94. }
  95. return false;
  96. }
  97.  
  98. /**
  99. * 静默卸载
  100. */
  101. public static boolean clientUninstall(String packageName){
  102. PrintWriter PrintWriter = null;
  103. Process process = null;
  104. try {
  105. process = Runtime.getRuntime().exec("su");
  106. PrintWriter = new PrintWriter(process.getOutputStream());
  107. PrintWriter.println("LD_LIBRARY_PATH=/vendor/lib:/system/lib ");
  108. PrintWriter.println("pm uninstall "+packageName);
  109. PrintWriter.flush();
  110. PrintWriter.close();
  111. int value = process.waitFor();
  112. return returnResult(value);
  113. } catch (Exception e) {
  114. e.printStackTrace();
  115. }finally{
  116. if(process!=null){
  117. process.destroy();
  118. }
  119. }
  120. return false;
  121. }
  122.  
  123. /**
  124. * 启动app
  125. * com.exmaple.client/.MainActivity
  126. * com.exmaple.client/com.exmaple.client.MainActivity
  127. */
  128. public static boolean startApp(String packageName,String activityName){
  129. boolean isSuccess = false;
  130. String cmd = "am start -n " + packageName + "/" + activityName + " \n";
  131. Process process = null;
  132. try {
  133. process = Runtime.getRuntime().exec(cmd);
  134. int value = process.waitFor();
  135. return returnResult(value);
  136. } catch (Exception e) {
  137. e.printStackTrace();
  138. } finally{
  139. if(process!=null){
  140. process.destroy();
  141. }
  142. }
  143. return isSuccess;
  144. }
  145.  
  146. private static boolean returnResult(int value){
  147. // 代表成功
  148. if (value == 0) {
  149. return true;
  150. } else if (value == 1) { // 失败
  151. return false;
  152. } else { // 未知情况
  153. return false;
  154. }
  155. }
  156. }

3、通过走系统应用的方法(因为机器是我们定制生产,所以可以将app预置到system/app目录下,无需安装,直接重启,可以看到系统再次开机时会显示系统升级,然后就可以看到我们的app安装成功),可以试着先adb命令执行,再复制到代码中去执行。注意,如果app的lib中有.so文件,则还需要将.so文件拷贝到system/libs目录,否则报错(我的解决办法是暂时将用到.so文件的地方注释掉,等有时间再做)

adb 命令:

  1. $ adb push SecureSetting.apk /sdcard/ // 上传要安装的文件,为安装做准备。
  2.  $ adb shell $ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。
  3. # mount //显示当前mount情况
  4.  # mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。
  5. # cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。
  6. chmod 777 chetou.apk
  7. # mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
  8. # exit $ exit

代码执行:

  1. /**
  2. * 将文件复制到system/app 目录
  3. * @param apkPath 特别注意格式:该路径不能是:/storage/emulated/0/app/QDemoTest4.apk 需要是:/sdcard/app/QDemoTest4.apk
  4. * @return
  5. */
  6. public static boolean copy2SystemApp(String apkPath){
  7. PrintWriter PrintWriter = null;
  8. Process process = null;
  9. String appName = "test.apk",cmd;
  10.  
  11. try {
  12. process = Runtime.getRuntime().exec("su");
  13. PrintWriter = new PrintWriter(process.getOutputStream());
  14. cmd = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system";
  15. Log.e("copy2SystemApp", cmd);
  16. PrintWriter.println(cmd);
  17.  
  18. cmd = "cat "+apkPath+" > /system/app/"+appName;
  19. Log.e("copy2SystemApp", cmd);
  20. PrintWriter.println(cmd);
  21.  
  22. cmd = "chmod 777 /system/app/"+appName +" -R";
  23. Log.e("copy2SystemApp", cmd);
  24. PrintWriter.println(cmd);
  25.  
  26. cmd = "mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system";
  27. Log.e("copy2SystemApp", cmd);
  28. PrintWriter.println(cmd);
  29. PrintWriter.println("reboot"); //重启
  30. PrintWriter.println("exit");
  31. PrintWriter.flush();
  32. PrintWriter.close();
  33. int value = process.waitFor();
  34. return returnResult(value);
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }finally{
  38. if(process!=null){
  39. process.destroy();
  40. }
  41. }
  42. return false;
  43. }

注意代码里有差异性,因为需要给文件 chmod 777权限,否则不会自动升级安装。流程可以参考:http://blog.163.com/wwj0925@126/blog/static/19120110201522242241563/

android开发,关于android app实现静默安装自己(系统签名)的更多相关文章

  1. 基于Android开发的天气预报app(源码下载)

    原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...

  2. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  3. CSharp程序员学Android开发---3.Android内部元素不填充BUG

    最近公司组织项目组成员开发一个Android项目的Demo,之前没有人有Andoid方面的开发经验,都是开发C#的. 虽说项目要求并不是很高,但是对于没有这方面经验的人来说,第一步是最困难的. 项目历 ...

  4. Android开发之定义app在手机的安装位置

    定义app在手机的安装位置,可以通过在清单文件中添加属性 android:installLocation="" 该属性有三个值:auto(自动),preferExternal(外部 ...

  5. Android PackageManager源码浅析以及静默安装实现方式

    Aandroid应用管理    >http://blog.csdn.net/sk719887916/article/details/50314017 skay整理.        >201 ...

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

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

  7. 搭建Android开发环境附图详解+模拟器安装(JDK+Eclipse+SDK+ADT)

    ——搭建android开发环境的方式有多种,比如:JDK+Eclipse+SDK+ADT或者JDK+Eclipse+捆绑好的AndroidSDK或者Android Studio. Google 决定将 ...

  8. Android为TV端助力 apk静默安装

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢 ...

  9. Android开发最强模拟器Genymotion的安装及使用教程。附注释图详解

    前沿   呵呵,笔者第一次在公开的博客网站写心得,想让自己的Android开发生涯留下点足迹,并且为自己做点笔记,如果该文章能帮到广大的Android小白朋友最好了(其实我也是一小白,(●'◡'●)) ...

随机推荐

  1. 【Linux】程序内获取文件系统挂载信息

    Linux shell可通过查看/etc/mtab或者/proc/mounts文件来获取当前文件系统挂载信息,示例: 程序内读取/etc/mtab或者/proc/mounts,解析字符串较为繁琐,可以 ...

  2. css半透明

    filter:alpha(opacity=80); /*支持 IE 浏览器*/-moz-opacity:0.80; /*支持 FireFox 浏览器*/opacity:0.80; /*支持 Chrom ...

  3. zend studio导入thinkphp的乱码问题

    刚刚导入thinkphp有乱码还有错误怎么办? windows -> preference -> Work space -> text file encodeing设置为 UTF-8 ...

  4. WinForm程序安装、发布流程

    一  签名 所谓签名就是给应用程序一个身份,申请一个专利.签名的时候需要选择证书.就向我们上学一样,得奖了老师给你发个证书.如果不进行签名,杀毒软件会把你打包后的exe文件作为病毒处理. 签名的步骤: ...

  5. VS2010 自动关闭的问题解决方法

    分为如下几个解决方法: 没有安装VS2010的SP1,安装后,问题解决了 自定义设置,出现了不正确的情况,执行 devenv.exe /resetsettings 可以排除故障 使用 devenv.e ...

  6. js构造函数,索引数组和属性的属性

    本文主要介绍和小结js的构造函数,关联数组的实现方式和使用,及不可变对象和它的实现方式及他们使用过程中要注意的点 <script> function p(){ var len=argume ...

  7. 【转】MYISAM表批量压缩

    关于对MYISAM表的压缩,可以使用myisampack和myisamchk完成(myisampack完之后必须进行myisamchk才能使用压缩后的表,而且是只读的), 其详细地用法可以参考官方文档 ...

  8. PHP 把GBK编码转换为UTF8

    //把GBK编码转换为UTF8 $name="勿以善小而不为"; $name=iconv("GBK", "UTF-8", $name);

  9. Moses manual 中Basline System 2.3.4节用IRSTLM创建语言模型的命令有误

    手册里写到: ~/irstlm/bin/compile-lm \ --text yes \ news-commentary-v8.fr-en.lm.en.gz \ news-commentary-v8 ...

  10. 在SQL Server 2012中新建用户

    一.问题描述 在最开始装SQL Server 2012时我选择的是Windows身份认证方式,现在想添加一个用户采用SQL Server身份验证. 二.具体思路 1.新建用户 2.将新建的用户添加到相 ...