A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘笑 中级黑马   /  2012-6-16 10:59  /  2621 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
然而在android中Google很多的类的某些方法不让第三方应用去调用,通过java反射机制能把这些隐藏方法获取出来并调用,三方应用上我们就很方便的去用这些方法。
例如我们需要安全的杀死某个应用的服务和进程调用ActivityManager.forceStopPackage()方法很方便


Java代码

  • Method m = null;
  • try {
  • Class c = Class.forName("android.app.ActivityManager");
  • m = c.getMethod("forceStopPackage", Class.forName("java.lang.String") );
  • m.invoke(am, "com.tencent.mobileqq");
  • } catch (IllegalArgumentException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • } catch (ClassNotFoundException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • } catch (NoSuchMethodException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • } catch (IllegalAccessException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • } catch (InvocationTargetException e) {
  • // TODO Auto-generated catch block
  • e.printStackTrace();
  • }

Method m = null;try {     Class c = Class.forName("android.app.ActivityManager");     m = c.getMethod("forceStopPackage", Class.forName("java.lang.String") );     m.invoke(am, "com.tencent.mobileqq");} catch (IllegalArgumentException e) {     // TODO Auto-generated catch block      e.printStackTrace();} catch (ClassNotFoundException e) {    // TODO Auto-generated catch block     e.printStackTrace();} catch (NoSuchMethodException e) {   // TODO Auto-generated catch block     e.printStackTrace();} catch (IllegalAccessException e) {   // TODO Auto-generated catch block   e.printStackTrace();} catch (InvocationTargetException e) {   // TODO Auto-generated catch block   e.printStackTrace();}
当然隐藏了这些API是为了防止第三方应用打破其他应用程序,停止服务,消除他们的警报等等。隐藏的这些api肯定也是有系统权限的,这些权限也是被隐藏的,那么我们怎么在自己的应用里去调用这些权限呢?
Xml代码

  • <?xml version="1.0" encoding="utf-8"?>
  • <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  • package="com.acer.shadow.apps"
  • android:versionCode="1"
  • android:versionName="1.0"
  • android:sharedUserId="android.uid.system">
  • <uses-permission android:name ="android.permission.FORCE_STOP_PACKAGES"/>

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.acer.shadow.apps"    android:versionCode="1"    android:versionName="1.0"     android:sharedUserId="android.uid.system">        <uses-permission android:name ="android.permission.FORCE_STOP_PACKAGES"/>
如上,我们只需要在AndroidManifest.xml中添加android:sharedUserId="android.uid.system"这句就能调用系统的一些隐藏权限,但是这样还不行,这个应用还得签名。
用命令行进入到目录下面输入
java -jar signapk.jar platform.x509.pem platform.pk8 ResApp.apk DesApp.apk
ResApp.apk:要签名的apk DesApp.apk签名后生成的apk

评分

参与人数 1黑马币 +10 收起 理由
黄奕豪 + 10 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马