免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2123 | 回复: 0
打印 上一主题 下一主题

Android 获取APK包的信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-04 13:43 |只看该作者 |倒序浏览
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代码:
  1. 01.[font=宋体]    String apkPath =\"/sdcard/qq.apk\";

  2. 02.    //这是一个Package 解释器, 是隐藏的

  3. 03.    //构造函数的参数只有一个, apk文件的路径

  4. 04.    PackageParser packageParser =new PackageParser(apkPath);

  5. 05.    //这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况

  6. 06.    DisplayMetrics metrics =new DisplayMetrics();

  7. 07.    metrics.setToDefaults();

  8. 08.    //这里就是解析了, 四个参数,

  9. 09.    //源文件File,

  10. 10.    //目的文件路径(这个我也没搞清楚怎么回事, 看Android安装器源码, 用的是源文件路径, 但名字却是destFileName)

  11. 11.    //显示, DisplayMetrics metrics

  12. 12.    //flags, 这个真不知道是啥

  13. 13.    PackageParser.Package mPkgInfo = packageParser.parsePackage(new File(apkPath),

  14. 14.    apkPath, metrics, 0);

  15. 15.

  16. 16.    //应用程序信息包, 这个公开的, 不过有些函数, 变量没公开

  17. 17.    ApplicationInfo info = mPkgInfo.applicationInfo;

  18. 18.

  19. 19.    //Resources 是用来获取资源的 , 而这里获取的资源是在本程序之外的

  20. 20.    //至于为什么这么弄, 我搞不懂.

  21. 21.    Resources pRes = getResources();

  22. 22.    AssetManager assmgr =

  23. 23.    new AssetManager();

  24. 24.    assmgr.addAssetPath(apkPath);

  25. 25.    Resources res =

  26. 26.    new Resources(assmgr, pRes.getDisplayMetrics(), pRes.getConfiguration());

  27. 27.

  28. 28.    CharSequence label =null;

  29. 29.    if (info.labelRes !=0) {

  30. 30.    try {

  31. 31.    label = res.getText(info.labelRes);

  32. 32.    } catch (Resources.NotFoundException e) {

  33. 33.    }

  34. 34.    }

  35. 35.    if (label ==null) {

  36. 36.    label = (info.nonLocalizedLabel !=null) ?

  37. 37.    info.nonLocalizedLabel : info.packageName;

  38. 38.    }

  39. 39.

  40. 40.

  41. 41.    //这里就是读取一个apk程序的图标

  42. 42.

  43. 43.    if (info.icon !=0){

  44. 44.    Drawable icon = res.getDrawable(info.icon);

  45. 45.    ImageView image = (ImageView) findViewById(R.id.iv_test);

  46. 46.    image.setVisibility(View.VISIBLE);

  47. 47.    image.setImageDrawable(icon);

  48. 48.    }

  49. 49.    }[/font]
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP