实现静默安装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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I