1.定义一些全局变量,文件位置:

Build.java (frameworks\base\core\java\android\os)

  1. /**
  2. * 包管理方式名称<br>
  3. * whitelist: 白名单方式
  4. * certificate: 证书认证方式
  5. * none: 不进行管理
  6. */
  7. public static String packageManage = "none";
  8. /**
  9. * 允许 Launch 显示的 APP 及 APP 白名单
  10. */
  11. public static String[] packageAllow = new String[]{ "com.baidu.searchbox",
  12. "com.thinta.product.thintazlib",
  13. "com.thinta.product.x4usertool"};
  14. /**
  15. * 允许 Launch 显示的 APP的 证书存放路径
  16. */
  17. public static String certificatePath = "/system/etc/security/media.zip";

2.修改安装APK过程,在安装过程添加验证

修改文件的位置:

PackageManagerService.java (frameworks\base\services\core\java\com\android\server\pm)

首先添加一个函数:

  1. private static HashSet<X509Certificate> getTrustedCerts(File keystore)
  2. throws IOException, GeneralSecurityException {
  3. HashSet<X509Certificate> trusted = new HashSet<X509Certificate>();
  4. if (keystore == null) {
  5. return trusted;
  6. }
  7. ZipFile zip = new ZipFile(keystore);
  8. try {
  9. CertificateFactory cf = CertificateFactory.getInstance("X.509");
  10. Enumeration<? extends ZipEntry> entries = zip.entries();
  11. while (entries.hasMoreElements()) {
  12. ZipEntry entry = entries.nextElement();
  13. InputStream is = zip.getInputStream(entry);
  14. try {
  15. trusted.add((X509Certificate) cf.generateCertificate(is));
  16. } finally {
  17. is.close();
  18. }
  19. }
  20. } finally {
  21. zip.close();
  22. }
  23. return trusted;
  24. }

修改的函数:private void installPackageLI(InstallArgs args, PackageInstalledInfo res)

  1. 第一处修改:
         if(Build.ThintaCust.packageManage.equals("certificate"))
  2. tmp_flags = PackageManager.GET_SIGNATURES;
  3. final int parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY
  4. | (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0)
  5. | (onSd ? PackageParser.PARSE_ON_SDCARD : 0) | tmp_flags;
  6.  
  7. 第二处修改:
  8. if(Build.ThintaCust.packageManage.equals("none")){
  9. Log.d("XYP_DEBUG", "packageManage = none \n");
  10. }else if(Build.ThintaCust.packageManage.equals("whitelist")){
  11. Log.d("XYP_DEBUG", "packageManage = whitelist \n");
  12. List<String> list = Arrays.asList(Build.ThintaCust.packageAllow);
  13. if(list.contains(pkg.packageName)){
  14. Log.d("XYP_DEBUG", "can install \n");
  15. }else{
  16. Log.d("XYP_DEBUG", "forbid install \n");
  17. res.setError(PackageManager.INSTALL_FAILED_USER_RESTRICTED, "installPackageLI, forbid install");
  18. return;
  19. }
  20. }else if(Build.ThintaCust.packageManage.equals("certificate")){
  21. int verify_pass = 0;
  22. try{
  23. File file = new File(Build.ThintaCust.certificatePath);
  24. HashSet<X509Certificate> trusted = getTrustedCerts(file);
  25. CertificateFactory cf = CertificateFactory.getInstance("X.509");
  26.  
  27. for (X509Certificate c : trusted) {
  28. String tmp_public_key = c.getPublicKey().toString();
  29. for(Signature sig : pkg.mSignatures)
  30. {
  31. X509Certificate cert = (X509Certificate)cf.generateCertificate(new ByteArrayInputStream(sig.toByteArray()));
  32. String tmp_key = cert.getPublicKey().toString();
  33. if(tmp_public_key.equals(tmp_key)){
  34. verify_pass = 1;
  35. break;
  36. }
  37. }
  38. if(verify_pass == 1)
  39. break;
  40. }
  41. if(verify_pass != 1){
  42. Log.d("XYP_DEBUG", "forbid install \n");
  43. res.setError(PackageManager.INSTALL_FAILED_USER_RESTRICTED, "installPackageLI, forbid install");
  44. return;
  45. }
  46. }catch(FileNotFoundException e){
  47. Log.d("XYP_DEBUG", e.toString());
  48. }catch(CertificateException e){
  49. Log.d("XYP_DEBUG", e.toString());
  50. }catch(IOException e){
  51. Log.d("XYP_DEBUG", e.toString());
  52. }catch(GeneralSecurityException e){
  53. Log.d("XYP_DEBUG", e.toString());
  54. }
  55. }

3.证书的压缩方式:

zip -r media.zip media.x509.pem

直接用命令把*.x509.pem 打包成zip文件,然后放到目标板的合适位置;

用第一步中的certificatePath指向存放该zip文件的位置。

APK安装时的过滤方式:包名白名单、证书认证的更多相关文章

  1. 解决chrome插件安装时出现的“程序包无效”问题信息:程序包无效。

    https://blog.csdn.net/bluexuemei/article/details/35213117 2014-06-27 09:00:51 bluexuemei 阅读数 14374更多 ...

  2. android .apk安装时遇到NSTALL_FAILED_CONTAINER_ERROR错误

    在一台酷派上装apk时遇到问题: android Installation error: INSTALL_FAILED_CONTAINER_ERROR 遇到问题后baidu google修改为andr ...

  3. Oozie安装时放置Mysql驱动包的总结(网上最全)

    不多说,直接上干货! 对于在oozie里放置Mysql驱动包的总结 根据网上的参考以及我个人经验安装的使用 (1)放一份到$OOZIE_HOME/libext下 (是 mysql-connector- ...

  4. 解决Chrome插件安装时出现的“程序包无效”问题

    问题原因,新版的插件头部文件的修改,导致旧版的插件包无法使用,解决方式:解压. 1.把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar(如果看不到Chrome插件的扩展 ...

  5. Android apk安装时出现“解析软件包错误”

    有时候在安装apk的时候会出现解析软件包出错 (Android studio)解决方法如下: 关闭Instant Run功能: File-Settings-...看下图: 将红色框内的勾取消. 如果还 ...

  6. R安装时出现辑程包不存在,解决方法

    R > -------------------------------------------------[解决方案]1.使用命令单独安装caret,安装的时间很长.install.packag ...

  7. android-获得".apk"文件的相关信息。包名、版本号等等

    String filePath = "/sdcard/feijiedemo.apk"; PackageManager packageManager = getPackageMana ...

  8. CloudStack 安装时需要的第三方包

    1.mysql-connector-java 2.jakarta-commons-daemon-jsvc 3.jsvc   rpm -ivh cloudstack-common-4.1.1-0.el6 ...

  9. php7 安装时需求的依赖包

    php70 php70-bcmath php70-cli php70-common php70-devel php70-fpm php70-gd php70-json php70-mbstring p ...

随机推荐

  1. 2013 Esri全球用户大会之元数据支持

    1.1 是否支持FGDC CSDGMArcGIS是否支持FGDC CSDGM和North American Profile (NAP)元数据标准?如何支持? 支持,从ArcGIS forDesktop ...

  2. Memcached 学习笔记(二)——ruby调用

    Memcached 学习笔记(二)——ruby调用 上一节我们讲述了怎样安装memcached及memcached常用命令.这一节我们将通过ruby来调用memcached相关操作. 第一步,安装ru ...

  3. 文件对话框WPF(5)----文件浏览对话框

    废话就不多说了,开始... WPF中文件浏览对话框的实现可以利用Windows API Code Pack,它是一个用于访问Windows Vista/7 特性的托管代码函数库,但并没有包含在.NET ...

  4. mongodb两次被黑后......

    先说说事情的经过...... 2017年1月8号星期天,在家翻头条无意中看到一条新闻说很多用户的mongodb被黑了,数据都被删了.当时想着公司的爬虫用的也是mongodb做存储,应该不会被黑吧,不可 ...

  5. 前端MVC学习笔记(四)——NodeJS+MongoDB+AngularJS+Bootstrap书店示例

    这章的目的是为了把前面所学习的内容整合一下,这个示例完成一个简单图书管理模块,因为中间需要使用到Bootstrap这里先介绍Bootstrap. 示例名称:天狗书店 功能:完成前后端分离的图书管理功能 ...

  6. Docker集群实验环境布署--swarm【4 管理组件--manager】

    主机分配如下,支持双活,中断其中1台,primary会通过consul自动重新选举   10.40.100.141 docker-manager0.venic.com 10.40.100.142 do ...

  7. [pinyin4j] java版汉字转换拼音(大小写)

    pinyin4J 是一个可以将汉字转换成拼音的lib,非常实用,其maven地址为:http://mvnrepository.com/artifact/com.belerweb/pinyin4j/2. ...

  8. HDU 2045 不容易系列之(3)—— LELE的RPG难题(递归/动态规划)

    不容易系列之(3)—— LELE的RPG难题 Problem Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即" ...

  9. 2014 ACM/ICPC Asia Regional Beijing Site

    1001 A Curious Matt 1002 Black And White 1003 Collision 1004 Dire Wolf 1005 Everlasting L 1006 Fluor ...

  10. Thymeleaf 3与Spring MVC 4 整合配置

    Thymeleaf 3与Spring MVC 4 整合配置 Maven 依赖配置 Spring 相关依赖就不说了 <dependency> <groupId>org.thyme ...