Android Studio 优先源码编译的framework.jar(android.jar)

本文介绍了解决Android Studio中由于@hide注释导致的API访问受限问题的方法。通过替换framework.jar并调整Gradle配置,使得开发者能够访问原本被隐藏的接口方法和常量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    接触Android Studio不久,很多都不会,最近开发一个应用时,发现很多接口方法或者一些定义的全局静态常量都不能访问,在Android Studio按住Ctrl再点击类名进入类后,发现有这些方法和常量,怎么不能访问呢,仔细一看,发现定义这些方法或常量的前面的注释处加了一个@hide,明白了,这是隐藏不让访问的意思(另外还有MTK,高通等他们自己在Framework里定义的一些类肯定是找不到的),所以就通过编译源码,把framework.jar(以MTK为例,如果编译debug版本,直接在out/target/product/projectXX/system/framewor下面拷出来,如果是user版本,out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar)拷贝出来,放入工程的Module里。

    如何替换或优先使用源码编译出来的SDK呢?网上找了很多别人提的方法都没使用成功或者说没有具体完成的方法,今天结合了网上找的所有方法和自己琢磨的方法写上来,具体如下:

    1.将拷出来的jar文件命名为framework.jar或androidXX.jar,放在Module的libs下面(我的是android4.4的jar包):

     

    2.右键android19.jar,选择“Add As Library”:

     

    3.右键Module选择“Open Module Settomgs,进入Project Structure界面,把android19.jar移到最顶上,把Scope改为Provided(默认Compile),点击确定:

    

    4.在工程的根目录下打开build.gradle,并找到allprojects,加入如下代码

allprojects {
    repositories {
        jcenter()
    }
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile)
                {
                    options.compilerArgs.add('-Xbootclasspath/p:factorytest\\libs\\android19.jar')
                }
    }
}
 5.在Module下打开build.gradle,在最后加入如下代码:

 

preBuild {
    doLast {
        def imlFile = file(project.name + ".iml")
        println('Change ' + project.name + '.iml order')
        try {
            def parsedXml = (new XmlParser()).parse(imlFile)
            def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
            parsedXml.component[1].remove(jdkNode)
            def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
            new groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
            groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
        } catch (FileNotFoundException e) {
            // nop, iml not found
        }
    }
}

  自动更改module.iml,将下面代码会移动最后

   <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK"/>
通过以上步骤后,就可以引用源码的Api了,但可能在运行时会出错,提示odex超出了65536,所以再加上如下设置就不会出错了

 6.在Module下面的build.gradle里找到defaultConfi加入multiDexEnabled = true

  

  在dependencies下加入compile 'com.android.support:multidex:1.0.0'


大功告成了,编译运行都没问题了。

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值