使用系统隐藏api
2015-11-24 14:57
453 查看
原理:
使用隐藏的系统API——installPackage。该方法在1.5版之后的android SDK中是看不见的,查看源码可以看到它设置了@hide属性,但在实际的运行包framework.jar中是存在的,因此只要能编译通过,安装到系统后是可以正常运行的。
步骤:
1. 从模拟器System\framework目录下提取framework.jar
2. 将framework.jar后缀名改为zip,解压后提取其中的classes.dex文件
3. 用dex2jar工具将classes.dex转成classes.dex.dex2jar.jar(注意新版本的dex2jar工具无法转换Android2.2的framework,建议使用dex2jar-0.0.7.8-SNAPSHOT,该工具可以从google官方站上下载到)
4. 将classes.dex.dex2jar.jar改名为classes.dex.dex2jar.zip解压取出android/content/pm/目录下的PackageManager.class,IPackageInstallObserver.class,IPackageDeleteObserver.class及相关的几个class文件备用
5. 找到android-sdk目录下的android.jar,改名为android.zip(注意改名前先备份一下),解压后将步骤4中取得的class文件覆盖到android对应的目录下,重新压缩成android.zip,并改名为android.jar
6. 这个时候android.jar已经是一个更新过的SDK了,重新打开eclipse工程,已经可以实现。
调用方法:
void android.content.pm.PackageManager.installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName)
public void installOnBackground(File file){
Log.i(TAG, "installOnBackground()");
int installFlags = 0;
Uri packageUri = Uri.fromFile(file);<span style="white-space:pre">
</span>//file是要安装的apk文件
PackageManager pm = mContext.getPackageManager();
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
MyPackageInstallObserver observer = new MyPackageInstallObserver();
pm.installPackage(packageUri, observer, installFlags, "com.xxx.xxx包名");
}
private static class MyPackageInstallObserver extends IPackageInstallObserver.Stub{
@Override
public void packageInstalled(String packageName, int returnCode)
throws RemoteException {
//returnCode=1表示安装成功
Log.e(TAG, "packageInstalled()");
Log.i(TAG, "packageName = " + packageName);
Log.i(TAG, "returnCode = " + returnCode);
}
}
说明:
1. 由于更改android.jar可能导致重新加载SDK失败,覆盖之前切记备份一下
2. 实际上该过程可以调用到任何hide属性的API,本文为了影响最小,只覆盖了installPackage相关的class
3. 下载android源码重新编译SDK也可以实现调用隐藏API,不过比较麻烦
使用隐藏的系统API——installPackage。该方法在1.5版之后的android SDK中是看不见的,查看源码可以看到它设置了@hide属性,但在实际的运行包framework.jar中是存在的,因此只要能编译通过,安装到系统后是可以正常运行的。
步骤:
1. 从模拟器System\framework目录下提取framework.jar
2. 将framework.jar后缀名改为zip,解压后提取其中的classes.dex文件
3. 用dex2jar工具将classes.dex转成classes.dex.dex2jar.jar(注意新版本的dex2jar工具无法转换Android2.2的framework,建议使用dex2jar-0.0.7.8-SNAPSHOT,该工具可以从google官方站上下载到)
4. 将classes.dex.dex2jar.jar改名为classes.dex.dex2jar.zip解压取出android/content/pm/目录下的PackageManager.class,IPackageInstallObserver.class,IPackageDeleteObserver.class及相关的几个class文件备用
5. 找到android-sdk目录下的android.jar,改名为android.zip(注意改名前先备份一下),解压后将步骤4中取得的class文件覆盖到android对应的目录下,重新压缩成android.zip,并改名为android.jar
6. 这个时候android.jar已经是一个更新过的SDK了,重新打开eclipse工程,已经可以实现。
调用方法:
void android.content.pm.PackageManager.installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName)
public void installOnBackground(File file){
Log.i(TAG, "installOnBackground()");
int installFlags = 0;
Uri packageUri = Uri.fromFile(file);<span style="white-space:pre">
</span>//file是要安装的apk文件
PackageManager pm = mContext.getPackageManager();
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
MyPackageInstallObserver observer = new MyPackageInstallObserver();
pm.installPackage(packageUri, observer, installFlags, "com.xxx.xxx包名");
}
private static class MyPackageInstallObserver extends IPackageInstallObserver.Stub{
@Override
public void packageInstalled(String packageName, int returnCode)
throws RemoteException {
//returnCode=1表示安装成功
Log.e(TAG, "packageInstalled()");
Log.i(TAG, "packageName = " + packageName);
Log.i(TAG, "returnCode = " + returnCode);
}
}
说明:
1. 由于更改android.jar可能导致重新加载SDK失败,覆盖之前切记备份一下
2. 实际上该过程可以调用到任何hide属性的API,本文为了影响最小,只覆盖了installPackage相关的class
3. 下载android源码重新编译SDK也可以实现调用隐藏API,不过比较麻烦
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件