有点标题党了,本文档主要针对已经解耦的系统应用。
何为解耦,这里的解耦为可以脱离系统独立编译的app。
一般的系统APP都需要依赖系统编译,使用make命令,这样编译比较慢,而且也没有像Android Studio这么好用的开发工具

原理

我们需要编译生成framework.jar,这个jar是系统编译的中间产物,这个里边会包含隐藏的api。
我们平时调用不到隐藏的api,是因为我们使用的Android sdk中的环境变量中已经剔除了隐藏的api。
所以我们需要把自己编译的jar放到Android studio的环境变量里边。

下面介绍具体实现,我们首先有一个基于gradle的项目。

build framework.jar:

运行命令进行编译

make framework

生成到./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes-full-debug.jar

对于不同版本的源码,编译方式不太一样,具体的可以Google

module 的 build.gradle 修改

dependencies {
  ........
  compileOnly files('../sharelibs/framework-27.jar')
}

添加下下面的脚本,把module.iml里的放到最后

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"
      println 'what' + sdkString
      new 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
      println "no iml found"
    }
  }
}

project 的build.gradle 添加

allprojects {
  ..............
  gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
      options.compilerArgs.add('-Xbootclasspath/p:sharelibs/framework-27.jar')
    }
  }
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

Android源码阅读导图 上一篇
定制适合自己的Android studio插件 下一篇