Android 禁止安装没有授权的第三方应用
平时也就只会跑程序,也不知道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 禁止安装没有授权的第三方应用相关推荐
- android禁止安装第三方app,Android6.0 禁止安装未知来源应用
在Android 中可以禁止安装第三方应用,如果你的设备需要禁止所有应用安装,你就可以在这做些文章. /** * @deprecated Use {@link android.provider.Set ...
- Android禁止安装三方应用(屏蔽所有安装应用的方式)
android系统安装应用有四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用 ...
- 禁止安装第三方应用(可对某个应用特殊处理),动态通过暗码改变是否能够安装第三方应用。拨号中输入*#数字#进入指定界面。
禁止安装第三方应用(可对某个应用特殊处理),动态通过暗码改变是否能够安装第三方应用: o版本 主要是在frameworks/base/services/core/java/com/android/se ...
- 获取android已安装的应用PackageInfo启动第三方APP应用
获取android已安装的应用PackageInfo 获取已安装的应用 public static ArrayList<AppInfo> getInstalledApps(Context ...
- 长虹电视+刷回android,长虹电视禁止安装怎么解除,不刷机就安装U盘app
当长虹电视出现"禁止安装"的提示怎么解除?如下图所示.网上很多文章说要刷固件降级才行,其实不然.本文以"蚂蚁市场"这个软件为例,教大家长虹电视解除第三方限制,不 ...
- android 7.1 禁止安装第三方软件
要求:Android 7.1 只允许安装自己的apk软件,禁止安装其他软件 实现: 通过包名对比来实现, 源码路径:/services/core/java/com/android/server/pm/ ...
- android11安装第三方,Android Apk安装(兼容Android11 Api30)
Apk安装 Android11之前可通过 Intent.ACTION_INSTALL_PACKAGE 进行传递Apk的URI进行安装 但是在Android11版本 Intent.ACTION_INST ...
- 手机禁止安装app,刷机才能恢复
手机禁止安装app,刷机才能恢复 让智能手机安装了必要的app之后,永远禁止安装其他任何app,只有通过刷机才能恢复回来,这个需求对于学生来说很有必要. 比如:安装必要的学习软件,微信,地图导航等等之 ...
- Android应用安装过程及原理
Android应用安装的流程及路径: 应用安装涉及到如下几个目录: system/app 系统自带的应用程序,无法删除 data/app ...
最新文章
- DASH流媒体MPD文件存储
- python安装numpy-Python使用pip安装Numpy模块
- python编写递归函数、求斐波那契数列第n项_Python非递归算法求解Fibonacci斐波那契数列...
- CentOS 7安装Nginx
- 笔记 - Ali Cloud 块存储简介
- 重磅 | 神策数据微信生态数字化运营解决方案上线!
- Spark 实时电商数据分析及可视化
- hdu3007(最小覆盖圆问题)
- jboss7.1.1 部署_在JBoss AS 7上部署BroadleafCommerce 2.0
- 窗口函数和hive优化简记
- 懒人图库-JS“焦点图”代码 漂亮的图片变化效果
- [2013.8.29]对于多线程编程的几点个人见解
- socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
- wdatepicker不显示秒_为什么别人电脑开机只要3秒,你有固态硬盘却要等上18秒?...
- JUC与JVM并发编程学习笔记01
- 自己攒的正则表达式---判断汉字、字符但不要数字
- matlab 深度学习环境配置
- PLC编程器的功能有什么功能?
- 把旧光驱改CD播放机的方法
- 更改mysql数据库主键自增时报错ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1
热门文章
- 【BUG】MMCV的坑:ImportError: /xxxx/mmcv/_ext.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe
- TensorFlow详解猫狗识别(一)--读取自己的数据集
- 【pandas】merge和join
- 文章标题专业板金优化分析软件
- 52岁的周鸿祎,还年轻吗?
- 13款宝马x5质量到底怎么样_为什么买宝马X5的车主都后悔不已?
- 韩国计算机网络电子书,韩老师 计算机网络安全精讲视频课程 共34节课
- 读懂5G机遇,洞悉政策红利:资深5G专家孙松林新书《5G时代》上市
- ICLR 2021杰出论文奖公布,DeepMind是最大赢家
- 中移动“屠龙”术一刀封喉 免费WAP祸福莫名 【时评】