平时也就只会跑程序,也不知道Android安装程序是个什么原理

Android应用安装有如下四种方式

1.系统应用安装――开机时完成,没有安装界面
2.网络下载应用安装――通过market应用完成,没有安装界面
3.ADB工具安装――没有安装界面。
4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面

应用安装的流程及路径 
应用安装涉及到如下几个目录:
system/app 系统自带的应用程序,无法删除
data/app 用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录
data/data 存放应用程序的数据
data/dalvik-cache 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一);

详细介绍第4 种

apk文件安装,会弹出一个安装界面,其实这是Android调用了另外一个叫PackageInstaller的APP来专门卸载和安装

apk。这个还真没想到

首先讲讲他的主界面 PackageInstallActivity

onCreate() 主要就是解析一大堆的APK信息,来判断有没有错误

initiateInstall() 检查是否安装过,有没有相同的包名

startInstallConfirm() 这里面提取权限的信息,并展示权限列表啥的,源码看的也很是头疼。。。点击确认,又到了另外一个类去进行安装的操作了。

刚开始我的想法就简单了,自己自定义个权限,第三方应用过来了我就检查它的权限列表,没有我定义的权限就不让它走后面安装的步骤,弹出了Dialog警告。

提取权限列表的代码

private List<String> getPermissions(PackageInfo pi){

String[] ps=pi.requestedPermissions;
        if(ps!=null){
            for (String str:ps) {
                Log.e("AAAAAAAAAAAA",str);
            }

return   Arrays.asList(ps);
        }

return  null;
    }

private void showFailDialog(){
        final AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle("安装提示")
                .setMessage("该第三方应用缺少权限:com.example.xiefei.permission,不允许安装")
                .setCancelable(false)
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.cancel();
                        PackageInstallerActivity.this.finish();
                    }
                });
        builder.create().show();
    }

=================================================================================

搞完之后发现功能是实现了,突然想到为什么不检验签名的信息呢,这样不是更加安全么

获得签名信息最为关键的就是比较公钥是不是相同的。

1.首先在系统的目录下创建个文件夹,来存放信任的.pem文件,因为.pem里通常就只包含公钥的信息,都不用加密的

http://blog.csdn.net/mycoolx/article/details/6730435   证书的介绍

2.提取第三方应用的签名信息

//PackageParser对外隐藏,所以在外面做的话可以用反射,还有就是版本不同,API可能也有差异

http://blog.csdn.net/wulianghuan/article/details/18400581  可以看看这个

private Signature showUninstallAPKSignatures(String apkPath) {//apk的路径
        PackageParser pp=new PackageParser();
        PackageParser.Package mPackage=pp.parsePackage(new File(apkPath),PackageManager.GET_SIGNATURES);
        pp.collectCertificates(mPackage,PackageManager.GET_SIGNATURES);
        return pp.mSignatures[0];
    }

public String parseSignature(byte[] signature) {
        String pubKey="";
        try {
            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
            X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));
            pubKey = cert.getPublicKey().toString();//公钥
            String signNumber = cert.getSerialNumber().toString();//证书的序列号
        } catch (CertificateException e) {
            e.printStackTrace();
        }
        return pubKey;
    }

这两个方法就可以提取第三方应用的公钥了

3.获取信任证书的公钥信息,来校验

private boolean isSystemSign(Signature sign1){
        boolean isSystemSign=false;
         File root=new File("/system/etc");
        File[] files = root.listFiles();
        for (File file:files) {
            if (file.isFile()&&file.getName().endsWith(".pem")) {
                if (getPublicKey(file.getAbsolutePath()).toString().equals(parseSignature(sign1.toByteArray()))) {
                    isSystemSign=true;
                    break;
                }
            }
        }
        return isSystemSign;
    }

通过.pem文件获得公钥
    private PublicKey getPublicKey(String filePath){
        try {
            CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509");
            FileInputStream bais=new FileInputStream(filePath);
            X509Certificate Cert = (X509Certificate)certificatefactory.generateCertificate(bais);
            PublicKey pk = Cert.getPublicKey();
            System.out.println("pk:"+pk.toString());
            return pk;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

做的这个东西 感觉很鸡肋,因为只有通过APK安装的方式,才会调PackageInstall这个程序,程序员通常用的adb 方式安装apk的话,完全不管这里,直接照样安装,哈哈,还真没多大的意义,不过还是可以防止比人乱下载东西的

Android 禁止安装没有授权的第三方应用相关推荐

  1. android禁止安装第三方app,Android6.0 禁止安装未知来源应用

    在Android 中可以禁止安装第三方应用,如果你的设备需要禁止所有应用安装,你就可以在这做些文章. /** * @deprecated Use {@link android.provider.Set ...

  2. Android禁止安装三方应用(屏蔽所有安装应用的方式)

    android系统安装应用有四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用 ...

  3. 禁止安装第三方应用(可对某个应用特殊处理),动态通过暗码改变是否能够安装第三方应用。拨号中输入*#数字#进入指定界面。

    禁止安装第三方应用(可对某个应用特殊处理),动态通过暗码改变是否能够安装第三方应用: o版本 主要是在frameworks/base/services/core/java/com/android/se ...

  4. 获取android已安装的应用PackageInfo启动第三方APP应用

    获取android已安装的应用PackageInfo 获取已安装的应用 public static ArrayList<AppInfo> getInstalledApps(Context ...

  5. 长虹电视+刷回android,长虹电视禁止安装怎么解除,不刷机就安装U盘app

    当长虹电视出现"禁止安装"的提示怎么解除?如下图所示.网上很多文章说要刷固件降级才行,其实不然.本文以"蚂蚁市场"这个软件为例,教大家长虹电视解除第三方限制,不 ...

  6. android 7.1 禁止安装第三方软件

    要求:Android 7.1 只允许安装自己的apk软件,禁止安装其他软件 实现: 通过包名对比来实现, 源码路径:/services/core/java/com/android/server/pm/ ...

  7. android11安装第三方,Android Apk安装(兼容Android11 Api30)

    Apk安装 Android11之前可通过 Intent.ACTION_INSTALL_PACKAGE 进行传递Apk的URI进行安装 但是在Android11版本 Intent.ACTION_INST ...

  8. 手机禁止安装app,刷机才能恢复

    手机禁止安装app,刷机才能恢复 让智能手机安装了必要的app之后,永远禁止安装其他任何app,只有通过刷机才能恢复回来,这个需求对于学生来说很有必要. 比如:安装必要的学习软件,微信,地图导航等等之 ...

  9. Android应用安装过程及原理

    Android应用安装的流程及路径: 应用安装涉及到如下几个目录: system/app               系统自带的应用程序,无法删除 data/app                  ...

最新文章

  1. DASH流媒体MPD文件存储
  2. python安装numpy-Python使用pip安装Numpy模块
  3. python编写递归函数、求斐波那契数列第n项_Python非递归算法求解Fibonacci斐波那契数列...
  4. CentOS 7安装Nginx
  5. 笔记 - Ali Cloud 块存储简介
  6. 重磅 | 神策数据微信生态数字化运营解决方案上线!
  7. Spark 实时电商数据分析及可视化
  8. hdu3007(最小覆盖圆问题)
  9. jboss7.1.1 部署_在JBoss AS 7上部署BroadleafCommerce 2.0
  10. 窗口函数和hive优化简记
  11. 懒人图库-JS“焦点图”代码 漂亮的图片变化效果
  12. [2013.8.29]对于多线程编程的几点个人见解
  13. socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
  14. wdatepicker不显示秒_为什么别人电脑开机只要3秒,你有固态硬盘却要等上18秒?...
  15. JUC与JVM并发编程学习笔记01
  16. 自己攒的正则表达式---判断汉字、字符但不要数字
  17. matlab 深度学习环境配置
  18. PLC编程器的功能有什么功能?
  19. 把旧光驱改CD播放机的方法
  20. 更改mysql数据库主键自增时报错ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1

热门文章

  1. 【BUG】MMCV的坑:ImportError: /xxxx/mmcv/_ext.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe
  2. TensorFlow详解猫狗识别(一)--读取自己的数据集
  3. 【pandas】merge和join
  4. 文章标题专业板金优化分析软件
  5. 52岁的周鸿祎,还年轻吗?
  6. 13款宝马x5质量到底怎么样_为什么买宝马X5的车主都后悔不已?
  7. 韩国计算机网络电子书,韩老师 计算机网络安全精讲视频课程 共34节课
  8. 读懂5G机遇,洞悉政策红利:资深5G专家孙松林新书《5G时代》上市
  9. ICLR 2021杰出论文奖公布,DeepMind是最大赢家
  10. 中移动“屠龙”术一刀封喉 免费WAP祸福莫名 【时评】