Android SDK中的一些类或方法由于某些原因而被隐藏,导致开发者不能正常的访问这些类和方法,如果访问,导致编译出错。由于SDK中隐藏,而手机环境中的确存在,所以只要我们通过编译,那么在手机上是可以运行的。
看了网上的一些资料,主要的处理方法有两种:
- 在项目中使用重新编译后的,暴露隐藏类和方法的SDK;
- 在项目中利用Java的反射机制来访问隐藏的类和方法;
- 把项目用到的相关类从源码中复制到项目中或者单独导入到一个项目中『后者需要建立目标项目和依赖类所在项目的依赖关系』,保持类所在路径和源码一致,找出并处理掉类中的错误;
说明:
- 方法1:前期准备较多,但后期开发较容易;
- 方法2:需要对Android源码有所了解才能正确编码;
- 方法3:需要的类和一些其它类必然有依赖关系,而真实开发中不需要源码中所有的类,故需要找到并处理掉相关类中的错误;
本文主要想说一下反射操作,并示例中不涉及到Android SDK中相关的隐藏类!
Java反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。『百度百科』
和Java反射有关的类有:
- Class;
- Field;
- Method;
- Constructor;
- Array;
获取Class对象的方法有:
- getClass;
- getSuperClass;
- Class.forName;
- 类型.class;
- 基本类型包装类.TYPE;
Class<?> classObject; // getClass(); String string = new String(); classObject = string.getClass(); // getSuperClass(); Object object = new Object(); classObject = object.getClass().getSuperclass(); // Class.forName(); try { classObject = Class.forName("package-name" + "class-name"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 类名.class classObject = String.class; classObject = Integer.class; classObject = int.class; // 基本类型封装类.TYPE classObject = Integer.TYPE; classObject = Boolean.TYPE;
对于类中方法和属性的访问,参考下面代码:
package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; interface Animal { } class Person implements Animal { public String publicString = "this is a public string!"; private String name; private int age; public Person() { System.out.println("Person()" + this.hashCode()); name = ""; age = -1; } public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this(); this.name = name; } public Person(int age) { this(); this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void say(String message) { System.out.println(message); } private void sing(String message) { System.out.println(message); } @Override public String toString() { return "{Name:" + name + " Age:" + age + "}"; } } public class TestReflect { public static void main(String[] args) { try { Class<?> classPerson = Class.forName("reflect.Person"); Person person = (Person) classPerson.newInstance(); System.out.println("Person:" + person); person.setName("Tom"); person.setAge(18); System.out.println("Person:" + person); Constructor<?>[] constructors = classPerson.getConstructors(); for (int i = 0, length = constructors.length; i < length; i++) { System.out.println("构造函数:" + constructors[i]); Class<?>[] parameterTypes = constructors[i].getParameterTypes(); for (int j = 0, lengthPatamter = parameterTypes.length; j < lengthPatamter; j++) { System.out.println("参数类型:" + parameterTypes[j].getName()); } } Class<?>[] interfaces = classPerson.getInterfaces(); for (int i = 0, length = interfaces.length; i < length; i++) { System.out.println("实现接口:" + interfaces[i].getName()); } Class<?> superClass = classPerson.getSuperclass(); System.out.println("父类:" + superClass); Method[] methods = classPerson.getMethods(); for (int i = 0, length = methods.length; i < length; i++) { Class<?> returnType = methods[i].getReturnType(); System.out.println("方法名称:" + methods[i]); System.out.println("返回类型:" + returnType); } Field[] fields = classPerson.getDeclaredFields(); for (int i = 0, length = fields.length; i < length; i++) { System.out.println("属性:" + fields[i].getName() + " 类型:" + fields[i].getType()); } Method methodToString = classPerson.getMethod("toString"); System.out.println("toString:" + methodToString.invoke(classPerson.newInstance())); Method methodSay = classPerson.getDeclaredMethod("say", String.class); methodSay.invoke(classPerson.newInstance(), "This is a message to say!:)"); Method methodSing = classPerson.getDeclaredMethod("sing", String.class); methodSing.setAccessible(true); Object object = classPerson.newInstance(); methodSing.invoke(object, "This is a song to sing!:)"); Field publicStringField = classPerson.getField("publicString"); System.out.println(publicStringField.get(object).toString()); publicStringField.set(object, ":)"); System.out.println(publicStringField.get(object).toString()); Field nameField = classPerson.getDeclaredField("name");青蛙咬到手 nameField.setAccessible(true); System.out.println(nameField.get(object).toString()); nameField.set(object, ":)"); System.out.println(nameField.get(object).toString()); } catch (Exception e) { e.printStackTrace(); } } }
说明:为了可以访问私有的方法或属性,需要调用setAccessible方法!
多说一句:在程序员的世界里,问题总有解决的办法!如果暂时没有找到,要么是没有理解问题产生的原因,要么是自己知识欠缺!
相关推荐
访问隐藏API通常需要通过Java的反射机制。反射允许程序在运行时动态地获取类的信息(如类名、方法名)并调用。使用`Class`, `Method`, `Constructor`等类,开发者可以调用隐藏API的私有方法或访问私有字段。 5. **...
总结来说,虽然Android的隐藏API提供了更广泛的系统访问和功能,但使用它们也伴随着诸多挑战和风险。开发者在考虑使用隐藏API时,应充分评估其必要性,并做好充分的测试和适配工作,确保应用的稳定性和兼容性。同时...
本文将详细介绍如何访问并利用Android系统的隐藏API,并探讨其中涉及的关键技术和注意事项。 #### 前提条件 要使用Android系统中的隐藏API,首先需要获得Android系统的源代码,并进行编译。编译完成后,可以获得一...
在本主题中,我们聚焦于一个特殊的“Android带有隐藏API的jar包”,这个jar包对应的是API level 25,即Android 7.1.1 (Nougat)。 通常,Android SDK公开的API可以通过官方的开发者文档进行查阅,这些API被设计为...
它涉及到了如何使用和理解Android系统中的隐藏API,并且提供了一个重新编译过的`framework.jar`文件,这个文件包含了可以访问`@hide` API的功能。 `@hide`是Android源码中用于注解的一个特殊标签,它的主要作用是不...
通过反射,开发者可以访问到那些被`@hide`注解的类和方法,从而调用隐藏API。 2. **安全与稳定性问题**:使用隐藏API虽然可以实现一些公开API无法达到的功能,但也带来了一些潜在的风险。首先,这些API可能未经过...
### Android 4.0 ActionBar API 知识点详解 #### 一、ActionBar 概述 ActionBar 是 Android 4.0 (API 级别 14) 引入的一个新特性,它替代了传统的标题栏 (title bar),并提供了一个更丰富、更灵活的界面控件,用于...
为了访问这些隐藏API,我们需要使用Java的反射机制。反射允许我们在运行时动态地获取类的信息(如方法、字段)并调用它们,即使这些信息在编译时不可见。 以下是一个简单的反射示例代码片段,用于打印`...
Android API提供了丰富的组件,如Activity、Intent、BroadcastReceiver等,以及硬件访问接口,如摄像头、GPS等。开发者通常会使用Java或Kotlin语言来调用这些API。 3. **jQuery API**: jQuery是一个广泛使用的...
此外,从Android 5.0(API级别21)开始,引入了“沉浸式模式”(Immersive Mode),它提供了更加无缝的隐藏系统栏体验。通过增加`SYSTEM_UI_FLAG_IMMERSIVE`或`SYSTEM_UI_FLAG_IMMERSIVE_STICKY`旗标,系统栏会在...
Android隐藏的API Android隐藏API是Google由于稳定性原因向您隐藏的类,方法和资源。 这些功能被隐藏,因为它们可能会在下一个API版本中更改。 内部API位于包com.android.internal ,可在framework.jar ,而隐藏的...
在Android系统中,`android_serialport_api`是一个用于与硬件串行端口通信的重要API,它使得开发者可以访问和控制设备上的串行接口,从而实现更底层的数据传输和硬件交互。串口通信在物联网(IoT)、嵌入式设备、工业...
15. **身份验证和权限管理**: API支持不同的身份验证模式,如OAuth2.0,用于保护地理服务的安全访问。 通过对ArcGIS for Android API的深入理解和应用,开发者可以构建出功能强大、用户友好的GIS应用程序,满足从...
开发者可以通过反射等手段访问隐藏API,但这并不被官方推荐,因为这些API可能在未来的Android版本中发生变化或被移除,对应用的稳定性构成风险。 ### 使用隐藏API的风险 1. **兼容性问题**:隐藏API可能在不同的...
Android Hidden API Android Hidden API is a modified jar file which combines the android.jar from the Android SDK with the framework.jar from a real device. This jar enables to use Android's internal/...
"android-api-SecureKeys"库的核心理念是使用Android的加密API来加密并隐藏常量,确保即使数据被盗,也难以解密。它可能利用了Android的KeyStore系统,这是一个硬件支持的安全存储区,可以用来创建、存储和管理加密...
### Android 4.0 ActionBar API 知识点详解 #### 一、ActionBar 概述 在 Android 4.0 版本中引入了一个新的组件叫做 ActionBar,它替代了早期 Android 版本中常见的传统标题栏(title bar)。ActionBar 的位置位于...
在Android系统中,访问相机功能通常需要以下几个关键知识点: 1. **权限管理**:在AndroidManifest.xml文件中,必须声明`<uses-permission>`标签,以请求`CAMERA`权限。自Android 6.0(API级别23)起,还需要在运行...
最新android4.2 sdk jar包,包含android最新版本的所有隐藏类。 在引入时可添加包,或直接替换开发包中的android.jar
首先,Android系统是一个基于Linux内核的开源移动操作系统,它允许开发者通过Java API进行应用程序开发。在Android中,锁屏功能是由系统的`KeyguardService`提供的,它是系统服务的一部分,负责管理屏幕锁定和解锁的...