1. 原生系统判断方法
根据这个分析,必要条件有:
1) 发出intent的方式(启动PackageInstallerActivity的方式)
必须forresult
2) intent必须设置不明来源为false
感觉这个设计相当扯淡,第三方APP可以肆意为之。
估计chrome默认下载后安装的方式没有去满足上述条件,所以只要是chrome下的一律为不明。
而appstore则肆意为之,一律为明,哪个傻子appstore会将自己的设为不明?
packages\apps\PackageInstaller\src\com\android\packageinstaller\PackageInstallerActivity.java
2. Android定制
目标:只能从自己的应用商店进行下载。
各个浏览器和其他商店的都不能进行安装。SD卡暂不限制。
■案1
1) 定制系统的安卓市场app,在启动PackageInstallerActivity时指定intent的特殊数据。
2) PackageInstallerActivity在 isInstallRequestFromUnknownSource时强制检查特殊数据。
(但这样会影响系统本身app的安装的样子吧,系统第一次启动的时候应该会进行预装,预装的时候如果也走这个路径就狗屁了。所以还要区分是否预装?)
3) PackageInstallerActivity 设置为不允许未知来源的安装。isInstallingUnknownAppsAllowed
■案2
备选方案:
从网络上下载的应用,都会进入这个更早的入口。这个直接判断Uri就可以了。
本地安卓市场下载之后的路径为指定目录,凡是Uri不是该目录的一律禁止安装。
PackageManagerService类的installPackage
public void installPackage(
final Uri packageURI, final IPackageInstallObserver observer, final int flags,
final String installerPackageName)】
注: 应用安装有4个方式。
・ 系统自动安装
\frameworks\base\services\java\com\android\server\PackageManagerService.java
系统自扫描system/app data/app目录,进行选择性安装。
查看了下,这些目录都是--r权限的目录,各个第三方app无法直接在根目录下生成apk文件、所以该路径不需要预防。
该安装调用的是底层mInstaller.install
・ 网络下载应用
上面介绍过的高层的API,最后走的底层和系统自动安装是一样的
・ ADB工具安装
忽视
frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java
・SD卡安装
vortex-8inch-for-hoperun/packages/apps/PackageInstaller/src/com/android/packageinstaller
方式1和他们无关。方式2如果是从market安装也和他们无关,如果是从浏览器下载安装,暂不十分确定是本方式,有一点小可能是方式2。