实现静默安装APK的两种方法

2024-03-31 08:08

本文主要是介绍实现静默安装APK的两种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/sodino/article/details/6238818


 Android上的静默安装似乎是个很诱人的功能,好多人都问这个问题。今天分享下实现静默安装的两种方法,但当看完这篇文章后,仍会让一些人失望滴。

      Android把所有的Permission依据其潜在风险(属性名为protectionLevel )划分为四个等级,即"normal "、 "dangerous "、 "signature "、 "signatureOrSystem "。INSTALL_PACKAGES属于后两者。让我们看一下官方文档对后两类的描述吧。

 

"signature ": A permission that the system grants only if the requesting application is signed with the same certificate as the application that declared the permission.If the certificates match, the system automatically grants the permission without notifying the user or asking for the user's explicit approval.

 

"signatureOrSystem ": A permission that the system grants only to applications that are in the Android system image   or   that are signed with the same certificates as those in the system image. Please avoid using this option, as thesignature   protection level should be sufficient for most needs and works regardless of exactly where applications are installed. The "signatureOrSystem " permission is used for certain special situations where multiple vendors have applications built into a system image and need to share specific features explicitly because they are being built together.

 

      所以,这儿介绍的两种方法各自需要的苛刻条件如下:

      1.内置到ROM。即APK包的安装位置是/system/app下。

      2.使用APK的目标安装系统同样的签名。

 

 

      好了,先不管这些苛刻的条件,下面讲下如何编写直接安装APK的代码,这儿使用pm install <apk_path>命令,而不是繁杂的未公开的PackageManager.install()方法。

[java]  view plain copy
  1. String[] args = { "pm""install""-r", apkAbsolutePath };  
  2. String result = "";  
  3. ProcessBuilder processBuilder = new ProcessBuilder(args);  
  4. Process process = null;  
  5. InputStream errIs = null;  
  6. InputStream inIs = null;  
  7. try {  
  8.     ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  9.     int read = -1;  
  10.     process = processBuilder.start();  
  11.     errIs = process.getErrorStream();  
  12.     while ((read = errIs.read()) != -1) {  
  13.         baos.write(read);  
  14.     }  
  15.     baos.write('/n');  
  16.     inIs = process.getInputStream();  
  17.     while ((read = inIs.read()) != -1) {  
  18.         baos.write(read);  
  19.     }  
  20.     byte[] data = baos.toByteArray();  
  21.     result = new String(data);  
  22. catch (IOException e) {  
  23.     e.printStackTrace();  
  24. catch (Exception e) {  
  25.     e.printStackTrace();  
  26. finally {  
  27.     try {  
  28.         if (errIs != null) {  
  29.             errIs.close();  
  30.         }  
  31.         if (inIs != null) {  
  32.             inIs.close();  
  33.         }  
  34.     } catch (IOException e) {  
  35.         e.printStackTrace();  
  36.     }  
  37.     if (process != null) {  
  38.         process.destroy();  
  39.     }  
  40. }  
  41. return result;  

      代码执行后,如果安装成功的话获取到的result值是“        pkg: /data/local/tmp/Calculator.apk  /nSuccess”,如果是失败的话,则没有结尾的“Success”。

      安装代码有了,现在开始介绍第一种方法,将你自己的APK内置到ROM中。前提是,你这手机已经刷机过并且保留了recovery-windows.bat/recover-linux.sh 文件。

      针对HTC-Legend的具体操作步骤为:

      1.USB连接你的设备然后在命令行输入 "adb reboot recovery" ,机子重启,启动后将显示一个红色的三角形和箭头图标   

      2 .(在PC下)进入到你的刷机文件夹然后运行 './recover-linux.sh' ,屏幕将显示绿色的菜单

      3 .如果得到的结果是 "error:device not found" ,运行 "./adb-linux kill-server" 后再一次运行 './recovery-linux.sh' 直到显示绿色菜单.

      4 .执行 "adb shell mount /dev/block/mtdblock3 /system" ,至此,可对/system进行写操作。

      5.在PC上运行命令:adb push <your_apk_path> /system/<your_apk_name>。至此,内置成功。

 

 

      第二种方法,需要先打一个未签名的APK包,然后用系统签名对其进行签名。这个方面的东西在我之前的一篇博文已说明,这儿就不重复了。[Android]使用platform密钥来给apk文件签名的命令 

      由于HTC-Legend是“原装”的,所以静默安装倒是顺利。但对于一些MOTO或乐Phone的手机,一般上是不支持的。


      以上这两种方法都在AndroidManifest中声明android.permission.INSTALL_PACKAGES,有一点比较奇怪的是执行“ int result = checkCallingOrSelfPermission(Intent.ACTION_PACKAGE_INSTALL) ”,result的值为android.content.pm.PackageManager.PERMISSION_DENIED而不是PERMISSION_GRANTED。

 

     OK,讲完了,睡觉。


这篇关于实现静默安装APK的两种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863841

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文