Android Studio优先使用自定义framework.jar

因为需要开发系统级别的应用,所以很多的地方需要调用的被标准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名称来解决这个问题,然后再修改回去就可以了。

You May Also Like

About the Author: ice.zhai

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注