- 论坛徽章:
- 0
|
Android 获取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, 但又了上面这个方法, 我们可以使用了 //apk包的文件路径
java代码:- 01.[font=宋体] String apkPath =\"/sdcard/qq.apk\";
- 02. //这是一个Package 解释器, 是隐藏的
- 03. //构造函数的参数只有一个, apk文件的路径
- 04. PackageParser packageParser =new PackageParser(apkPath);
- 05. //这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
- 06. DisplayMetrics metrics =new DisplayMetrics();
- 07. metrics.setToDefaults();
- 08. //这里就是解析了, 四个参数,
- 09. //源文件File,
- 10. //目的文件路径(这个我也没搞清楚怎么回事, 看Android安装器源码, 用的是源文件路径, 但名字却是destFileName)
- 11. //显示, DisplayMetrics metrics
- 12. //flags, 这个真不知道是啥
- 13. PackageParser.Package mPkgInfo = packageParser.parsePackage(new File(apkPath),
- 14. apkPath, metrics, 0);
- 15.
- 16. //应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
- 17. ApplicationInfo info = mPkgInfo.applicationInfo;
- 18.
- 19. //Resources 是用来获取资源的 , 而这里获取的资源是在本程序之外的
- 20. //至于为什么这么弄, 我搞不懂.
- 21. Resources pRes = getResources();
- 22. AssetManager assmgr =
- 23. new AssetManager();
- 24. assmgr.addAssetPath(apkPath);
- 25. Resources res =
- 26. new Resources(assmgr, pRes.getDisplayMetrics(), pRes.getConfiguration());
- 27.
- 28. CharSequence label =null;
- 29. if (info.labelRes !=0) {
- 30. try {
- 31. label = res.getText(info.labelRes);
- 32. } catch (Resources.NotFoundException e) {
- 33. }
- 34. }
- 35. if (label ==null) {
- 36. label = (info.nonLocalizedLabel !=null) ?
- 37. info.nonLocalizedLabel : info.packageName;
- 38. }
- 39.
- 40.
- 41. //这里就是读取一个apk程序的图标
- 42.
- 43. if (info.icon !=0){
- 44. Drawable icon = res.getDrawable(info.icon);
- 45. ImageView image = (ImageView) findViewById(R.id.iv_test);
- 46. image.setVisibility(View.VISIBLE);
- 47. image.setImageDrawable(icon);
- 48. }
- 49. }[/font]
复制代码 |
|