前提:我们需要得到 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包的文件路径                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);                }            }

更多相关文章

  1. 玩转Android---UI篇---EditText(编辑框)
  2. 【Android】App自动更新之通知栏下载
  3. Android(安卓)Studio 集成NDK 报错Error:No toolchains found in
  4. Android系统模拟位置的使用方法
  5. ADB源码分析(一)
  6. MAC操作系统上搭建Android开发平台环境
  7. Android(安卓)应用权限管理默认开关的修改方法
  8. android+eclipse+phonegap1.7(cordova)配置项目 .
  9. Android学习笔记10——Android的调试

随机推荐

  1. 从Android到React Native开发(四、打包流
  2. android分层学习笔记(三)
  3. View视图框架源码分析之一:android是如何
  4. android 增加物理按键关闭wifi实例讲解
  5. 多个Android客户端同步服务器端表中数据
  6. Android的消息机制——Handler的工作过程
  7. android 消息传递机制
  8. 如何进行android开发
  9. Android(安卓)Activity加载Fragment的一
  10. Android NDK Hello