您的位置:首页 > 移动开发 > Android开发

Android工程中怎样使用隐藏API

2014-12-20 20:07 288 查看
使用android 隐藏api的前提:我们需要得到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,

//目的文件路径

//显示, 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);//这个方法是隐藏的,若非调用隐藏API,要反射才能调用

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);

}

}

=============================================

ps:通过使用隐藏API,避免了反射调用的麻烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: