首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

施用Android系统隐藏api 读取*apk 程序安装包信息

2012-09-09 
使用Android系统隐藏api 读取*.apk 程序安装包信息前提:我们需要得到Android系统源码编译输出的一个文件ou

使用Android系统隐藏api 读取*.apk 程序安装包信息

前提:我们需要得到Android系统源码编译输出的一个文件
out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
这个包里面包含所有的系统api, 隐藏的, 公开的
添加 jar方法
右键功能菜单->Properties->Java Build Path?
Libraries选项卡
这时应该有一个列表,? 如果你没有添加过, 应该只有一项, 就是系统自带的Android SDK,? 选中后,右手边有一个删除, 先删除系统添加的sdk.?
点Add Library -> User Library?
选择User Library 按钮, 新建一个User Library 将刚才那个文件 classes.jar 和系统本身的文件都导入进来, 调整下顺序,? 将 classes.jar 调到前面
这样添加了之后, 就可以使用系统隐藏的api了

使用隐藏api, 有个前提:
许多api涉及到系统权限问题, 比如 后台安装文件 api PackageManager.installPackage 要求有安装程序的权限, 而这个安装程序权限不是随便有的, 只有经ROM签名认证的才可以使用这个权限. 虽然说可以在配置文件里面添加这个权限, 但是悲剧的是你仍然不能拥有这个权限, 在这点上, Google做的真绝..

好了, 虽然我们不能安装, 但用api去查看apk总该可以了吧?
Google没有公开这个Api,? 但又了上面这个方法, 我们可以使用了

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->//apk包的文件路径
????????????????String?apkPath?=?"/sdcard/qq.apk";
????????????????//这是一个Package?解释器,?是隐藏的
????????????????//构造函数的参数只有一个,?apk文件的路径
????????????????PackageParser?packageParser?=?new?PackageParser(apkPath);
????????????????//这个是与显示有关的,?里面涉及到一些像素显示等等,?我们使用默认的情况
????????????????DisplayMetrics?metrics?=?new?DisplayMetrics();
????????????????metrics.setToDefaults();
????????????????//这里就是解析了,?四个参数,?
????????????????//源文件File,?
????????????????//目的文件路径(这个我也没搞清楚怎么回事,?看Android安装器源码,?用的是源文件路径,?但名字却是destFileName)?
????????????????//显示,?DisplayMetrics?metrics
????????????????//flags,?这个真不知道是啥
????????????????PackageParser.Package?mPkgInfo?=?packageParser.parsePackage(new?File(apkPath),
????????????????????????apkPath,?metrics,?0);
????????????????
????????????????//应用程序信息包,?这个公开的,?不过有些函数,?变量没公开
????????????????ApplicationInfo?info?=?mPkgInfo.applicationInfo;
????????????????
????????????????//Resources?是用来获取资源的?,?而这里获取的资源是在本程序之外的
????????????????//至于为什么这么弄,?我搞不懂.
????????????????Resources?pRes?=?getResources();
????????????????AssetManager?assmgr?=?new?AssetManager();
????????????????assmgr.addAssetPath(apkPath);
????????????????Resources?res?=?new?Resources(assmgr,?pRes.getDisplayMetrics(),?pRes.getConfiguration());
????????????????
????????????????CharSequence?label?=?null;
????????????????if?(info.labelRes?!=?0)?{
????????????????????try?{
????????????????????????label?=?res.getText(info.labelRes);
????????????????????}?catch?(Resources.NotFoundException?e)?{
????????????????????}
????????????????}
????????????????if?(label?==?null)?{
????????????????????label?=?(info.nonLocalizedLabel?!=?null)??
????????????????????????????info.nonLocalizedLabel?:?info.packageName;
????????????????}
????????????????
????????????????
????????????????//这里就是读取一个apk程序的图标
????????????????if?(info.icon?!=?0){
????????????????????Drawable?icon?=?res.getDrawable(info.icon);
????????????????????ImageView?image?=?(ImageView)?findViewById(R.id.iv_test);
????????????????????image.setVisibility(View.VISIBLE);
????????????????????image.setImageDrawable(icon);
????????????????}
????????????}

转载:http://www.blogjava.net/Green-nut/articles/336494.html

1 楼 yehoubin 2011-02-14   你好,怎么我照你的方法不行啊?

热点排行