因为需要开发系统级别的应用,所以很多的地方需要调用的被标准framework标记为@hide 的方法。如果调用这类的方法会被标红的。经过网上的一些方法的实践针对于单个是没问题,但是当需要使用多个系统级别的api的时候就可能需要多个jar文件,操作起来就很恼火。所以经过我的优化,目前可以很好的解决这个问题。
1、在项目的根目录创建libs_dynamic目录,放入从编译结果里面拷贝出来的jar文件;
2、修改项目根目录下的“build.gradle”文件,在allprojects{}标签下添加如下内容,Android studio 2.*.*的修改如下(请将“libraries”改成“libs_dynamic”)
allprojects {
repositories {
jcenter()
// google()
maven {
url 'https://maven.google.com/'
}
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
String args = "-Xbootclasspath/p:"
file("libraries").listFiles().each { f ->
args += (f.getPath() + ";")
}
if (args.endsWith(";")) {
args = args.subSequence(0, args.length() - 1)
}
options.compilerArgs << args
}
}
}
Android studio 3.*.*修改如下:
allprojects {
repositories {
google()
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile){
def bootClassPath = "-Xbootclasspath/p:"
fileTree(dir:"./libs_dynamic/",includes: ['*.jar']).visit {
element -> bootClassPath = bootClassPath + "./libs_dynamic/" + element.relativePath+File.pathSeparator
}
options.compilerArgs.add(bootClassPath)
}
}
}
3、修改model下的“build.gradle”文件,在文件末尾添加如下内容,并且需要依赖libs_dynamic目录下的所有jar文件,以下是Android studio 3.*.*版本修。如果Android studio的版本是2.*.*,则需要把compileOnly改成provided
dependencies {
compileOnly fileTree(include: ['*.jar'], dir: '../libs_dynamic')
}
preBuild {
doLast {
def imlFile = file(getBuildFile().getParentFile().getName() + ".iml")
if (!imlFile.exists()) {
return
}
def lines = imlFile.readLines()
String data = ""
String jdkString = ""
for (String line : lines) {
if (line.trim().startsWith("<orderEntry type=\"jdk\" jdkName")) {
jdkString = line
} else {
if (line.trim() == "</component>") {
data += (jdkString + '\n')
}
data += (line + '\n')
}
}
imlFile.write(data)
}
}
特别注意:
有时候即使你修改好了,还是会出现开发的时候隐藏方法无法调用的问题。这个我也找了很久的原因,一直没有解决,所有文章也没发。最近突然发现可以通过修改libs_dynamic目录下面的jar名称来解决这个问题,然后再修改回去就可以了。