使用Android系统隐藏api

http://www.devdiv.com/thread-39304-1-1.html


前提:我们需要得到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,  但又了上面这个方法, 我们可以使用了

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


你可能感兴趣的:(使用Android系统隐藏api)