豌豆荚搜索手机中的游戏app形成列表的原理

豌豆荚首次打开时会在桌面上创建一个叫做【游戏】的快捷方式。里面就区分了游戏和软件。

这是怎么区分的?
经过Charles抓包分析,得出,豌豆荚是通过把包的应用信息上传到服务器,然后服务器在数据库中进行信息获取之后再返回给本地客户端的。他们服务器存有分类信息,因为本来就是做应用类的嘛。
请求如下

http://api.wandoujia.com/v1/apps?timestamp=1437530874210&id=wandoujia_android&f=phoenix2&v=4.52.1&u=13796e7183104b7b961ac514b9040eb4e5a88db4&token=d0b86e36f0395be5186298ce6c0010e9&pns=%7B%2Ccom.zhihu.daily.android%2Ccom.tencent.pao%2C%7D&opt_fields=title%2CpackageName%2CappType%2Cicons.px256&vc=8061&from=phoenix&ch=wandoujia_wap&net=WIFI

请求参数

豌豆荚搜索手机中的游戏app形成列表的原理

返回的json格式结果

豌豆荚搜索手机中的游戏app形成列表的原理

appType为APP就是应用,为GAME就是游戏。
既然这样,方案一就出来了。
1.自己服务器保存大量的应用分类信息,然后在你的应用启动以及收到应用安装的系统广播时向服务器请求分类信息,然后把获取到的分类信息存到本地。分类信息怎么来,自己处理(后续会说)或者跟第三方应用市场合作获得数据。
2.跟第三方合作,让他们提供接口。

 

如果没钱没资源,那怎么办啊。那怎么获得分类信息啊。别急,还有办法,虽然不能保证所有数据一定准确,但是还是能保证大部分数据的准确性的。
1.用爬虫去爬取第三方网站的前8000(具体数据自己把握)的游戏分类数据保存下来。
2.在本地自动分析应用信息,基于特征值。
我们知道一般游戏都是基于一些引擎开发的,而应用不会这么做。一般引擎都会包含一些特定的类或者文件(核心代码见后),只要判断是否存在一般就可以判断是否是游戏了,常见的检测广告也是基于这个策略的。
比如cocos2dx包含包org.cocos2dx.lib,unity包含com.unity3d.player,libGDX包含com.badlogic.gdx等等。

常见的引擎就那么几款(之前的三款只是举例,并不是说常见的只有这3个),所以这是一个实际可行的方案。关键这个新出的游戏也可以自动检测啊,毕竟基于规则。
当然,你说有的应用会不会基于引擎开发啊,有啊,可以加白名单啊,反正一般不多。不过用引擎做应用也真是蛋疼→_→

上面两种策略可以结合着一起使用。
其他的很多具体细节就得自己好好考虑下喽。

判断应用是否存在特定类

try {
path = context.getPackageManager().getApplicationInfo(packageName, 0).sourceDir;// 获得某个程序的APK路径
} catch (NameNotFoundException e) {
e.printStackTrace();
}
try {
DexFile dexFile = new DexFile(path);// get dex file of APK
Enumeration<String> entries = dexFile.entries();
while (entries.hasMoreElements()) {// travel all classes
String className = (String) entries.nextElement();
}

} catch (IOException e) {
e.printStackTrace();
}

以上为示例代码,需要根据实际需求进行改动以及优化。