framework-jar-for-android

  1. 不同版本 AndroidStudio 引入 Framework

不同版本 AndroidStudio 引入 Framework

配置生成*.iml文件

在File >> Settings >> Build… >> Build Tools >> Gradle 中勾选generate *.iml,否则项目中将没有Application.app.main.iml这个文件

将framework.jar放入app/libs中

build.gradle(:app)中添加framework.jar依赖

build.gradle(:app)中添加framwork.jar依赖

dependencies {
compileOnly files(“libs/framework.jar”)
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add(“-Xbootclasspath/p:$rootProject.rootDir/app/libs/framework.jar”)
}
}
preBuild {
doLast {
//测试版本 Android Studio Giraffe | 2022.3.1 Patch 1
//需要先在File >> Settings >> Build… >> Build Tools >> Gradle 中勾选generate *.iml,
//否则项目中将没有My_Application.app.main.iml这个文件
def imlFile = file(“$rootProject.rootDir/.idea/modules/app/My_Application.app.main.iml”)
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 30 Platform”
new Node(parsedXml.component[1], ‘orderEntry’, [‘type’: ‘jdk’, ‘jdkName’: sdkString, ‘jdkType’: ‘Android SDK’])
groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
} catch (FileNotFoundException e) {
e.printStackTrace()
}
}
}
至此,MainActivity中framework.jar的测试代码将不再报红

—————————-我是分割线—————————-
2023-11-15 更新
上次更新的是单独模块引用framework.jar的配置方法,今天带来的是全局所有模块引用framework.jar的配置方法

2 全局模块引用framework.jar配置方法
2.1 同上

2.2 同上

2.3 将framework.jar放入项目根目录下的libs中

2.4 build.gradle(:app)中添加framwork.jar依赖

dependencies {
compileOnly files(“../libs/framework.jar”)
}

2.5 修改项目级build.gradle文件

subprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add(“-Xbootclasspath/p:$rootProject.rootDir/libs/framework.jar”)
}
preBuild {
doLast {
def rootProjectName = rootProject.name.replace(“ “, ““)
def projectName = project.name.replace(“ “, “
“)
def iml_path = “$rootProject.rootDir\.idea\modules\“ + projectName + “\“ + rootProjectName + “.” + projectName + “.main.iml”
def imlFile = file(iml_path)
try {
def parsedXml = (new XmlParser()).parse(imlFile)
def jdkNode = parsedXml.component[1].orderEntry.find { it.‘@type’ == ‘jdk’ }
def sdkString = jdkNode.‘@jdkName’
parsedXml.component[1].remove(jdkNode)
new Node(parsedXml.component[1], ‘orderEntry’, [‘type’: ‘jdk’, ‘jdkName’: sdkString, ‘jdkType’: ‘Android SDK’])
groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
} catch (FileNotFoundException e) {
e.printStackTrace()
}
}
}
}
}

修改完成后,点击Build->Make Project使配置生效,framework.jar中隐藏api或者系统级api将可正常调用并且不会报红,测试结果如下图所示:

—————————-我是分割线—————————-
2024-01-20 更新
上述使用的framework.jar一定是从以下路径获得,否则可能无法在android studio中编译通过,并且正常运行,android 12 版本

out\target\common\obj\JAVA_LIBRARIES\framework-minus-apex_intermediates\classes.jar

—————————-我是分割线—————————-
2024-12-26 更新
测试Android Studio版本为–>Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1

app/build.gradle

dependencies {
//必须添加
compileOnly files(‘libs/framework.jar’)

implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout

}

build.gradle

//测试的AS版本【Android Studio Ladybug Feature Drop | 2024.2.2 Beta 1】
subprojects {
//所有project配置完成后调用
gradle.projectsEvaluated {
/**

  • 1、解决编译失败问题
    /
    getTasks().configureEach {
    /
    *

  • compileDebugAndroidTestJavaWithJavac

  • compileDebugJavaWithJavac

  • compileDebugUnitTestJavaWithJavac

  • compileReleaseJavaWithJavac

  • compileReleaseUnitTestJavaWithJavac
    /
    if (it.name.endsWith(‘JavaWithJavac’)) {
    it.dependsOn(‘processDebugResources’)
    }
    }
    getTasks().withType(JavaCompile.class).configureEach {
    def newFiles = new ArrayList<>()
    newFiles.add(0, file(‘app/libs/framework.jar’))
    newFiles.addAll(it.classpath.files)
    //解决‘找不到符号’问题
    it.classpath = files(newFiles.toArray())
    }
    /
    *

  • 2、以下内容不添加不影响编译,但是在代码中会存在方法调用报红现象,同样也就没有代码提示功能,要想实现方法调用不

  • 报红,需添加compileOnly files(‘libs/framework.jar’)到对应模块dependencies中,并且在当前文件当前

  • 位置下方添加以下内容
    */
    //为什么是prepareKotlinBuildScriptModel任务而不是网上其他版本的preBuild任务,因为执行Sync Now操作就是执
    //行prepareKotlinBuildScriptModel任务,在Build小锤子日志窗口中有显示,而preBuild基本上要手动去执行,所
    //以这里用其代替preBuild任务,如果Sync Now还是有报红,手动打开xxx.app.main.iml然后再关闭应该就可以了
    prepareKotlinBuildScriptModel {
    doLast(new Action() {
    @Override
    void execute(Task task) {
    println(‘开始执行xxx.app.main.iml依赖重排序逻辑’)

                  //在【File | Settings | Build, Execution, Deployment | Build Tools | Gradle】位置
                  //勾选generate *.iml files for modules imported from Gradle选项,如不这样操作项目中将
                  //不会生成xxx.app.main.iml这个文件
                  def imlFilePath = String.format("%1s/.idea/modules/app/%2s.app.main.iml"
                          , rootProject.rootDir
                          , rootProject.name)
                  if (!new File(imlFilePath).exists()) {
                      println('要重排序的iml文件【' + imlFilePath + '】不存在')
                      return
                  }
                  def document = DocumentBuilderFactory.newInstance()
                          .newDocumentBuilder()
                          .parse(imlFilePath)
                  def root = document.getDocumentElement()
    
                  //删除带jdk属性的orderEntry节点
                  def jdkNode = (root.getElementsByTagName('orderEntry').item(0) as Element)
                  if (jdkNode.getAttribute('type') != 'jdk') {
                      println('首个orderEntry不是jdk,不用重新排序')
                      return
                  }
                  def parentNode = jdkNode.getParentNode()
                  //移除第一个jdk节点
                  parentNode.removeChild(jdkNode)
                  //将jdk节点添加到最后
                  parentNode.appendChild(jdkNode)
    
                  def transformer = TransformerFactory.newInstance().newTransformer()
                  transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8")
                  //解决调用报红问题
                  transformer.transform(new DOMSource(root), new StreamResult(new FileOutputStream(imlFilePath)))
    
                  println('iml依赖重排序完成')
              }
          })
      }
    

    }

}

部分内容参考自:https://blog.csdn.net/u014175785/article/details/116235760

测试用Android 14源码编译framework.jar下载链接:
https://download.csdn.net/download/lmjssjj/89107722


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nathanwriting@126.com

文章标题:framework-jar-for-android

字数:1.2k

本文作者:Nathaniel

发布时间:2025-01-03, 23:48:12

最后更新:2025-01-03, 23:55:28

原始链接:http://example.com/2025/01/03/framework-jar-for-android/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏