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。