为了调用系统隐藏方法和参数,可使用自定义framework.jar方式来进行调用
一 修改要调用的信息
在Android源代码中将需要调用的方法或者变量上的hide信息删掉,如下:
/************************删之前***************************/
/** @hide */
public static final int MIRACAST_DISABLED = 0;
/** @hide */
public static final int MIRACAST_SOURCE = 1;
/** @hide */
public static final int MIRACAST_SINK = 2;
/** Internal use only @hide */
public void setMiracastMode(int mode) {
try {
mService.setMiracastMode(mode);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/************************删之后***************************/
public static final int MIRACAST_DISABLED = 0;
public static final int MIRACAST_SOURCE = 1;
public static final int MIRACAST_SINK = 2;
public void setMiracastMode(int mode) {
try {
mService.setMiracastMode(mode);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
二 拷贝Jar文件
将Android源码编译后中的 android\out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar文件拷贝到Android Studio项目中的libs文件,我这里将其重命名为framework
三 配置Jar文件
第一步
在app的build.gradle的依赖中修改,如下:
一定要注释掉之前对libs下所有Jar依赖
// 添加对该jar的依赖,并注释掉对libs所有jar依赖的配置
compileOnly files('libs/framework.jar')
// implementation fileTree(dir: 'libs', include: ['*.jar'])
第二步
在项目的build.gradle中添加对framework的依赖信息,如下:
allprojects {
repositories {
google()
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
}
}
}
四 重新同步项目
将项目重新同步,即可调用到隐藏方法(虽然方法调用时可能为红色)
五 可能出现的问题
将项目同步后,修改app目录下的app.iml文件
将自定义framework.jar的依赖顺序调整到Android sdk之前
在文件内搜索framework.jar,然后剪切粘贴到Android API 26 Platform上方
注意:每次同步项目后app.iml的顺序都会变,所有每次都有手动调整
调整后如下:
<orderEntry type="library" name="Gradle: __local_aars__:E.\work\android_studio_project\WFDSindDroid\app\libs\framework.jar:unspecified@jar" level="project"/>
<orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />