AOSP - 修改Framework层代码并导入Android Studio

文章目录[x]
  1. 1:在Framework层添加代码并编译
  2. 1.1:准备工作
  3. 1.2:编写自己的API
  4. 1.3:make update-api
  5. 1.4:生成framework.jar
  6. 2:导入Android Studio

在开发系统级的应用时,开发者通常会遇到需要使用系统级別接口或是供应商定制接口的情況。本文将介绍在Framework层添加自己的Java代码,并提供修改过的源码来提供给其他人在Android Studio中进行开发。本文AOSP默认分支版本为android-10.0.0_r41,请注意repo初始化仓库的版本。

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r41

在Framework层添加代码并编译

准备工作

. build/envsetup.sh

lunch aosp_x86_64-eng

编写自己的API

假设需要在android包下创建包定义自己的类:

cd frameworks/base/core/java/android
mkdir melrose
vim melrose/Melrose.java

Melrose.java编辑为如下:

package android.melrose;

public class Melrose {

private Melrose(){}

private static Melrose mInstance;

public static Melrose getInstance() {
if(mInstance == null){
mInstance = new Melrose();
}
return mInstance;
}

public String getAnchor(){
return "Melrose";
}
}

make update-api

在编写完自己的API后,在命令行中crootAOSP的根目录下执行如下命令:

make update-api

Android源码中添加了自定义的包、类、方法或者修改了Android源码中标识为@hide的方法、类,需要这些内容对 Application可见并且需要编译进SDKDocument中的话,这个命令是必须执行的。

生成framework.jar

在执行完make update-api后,就可以重新编译生成framework.jar包:

make installclean
m

在编译后生成的jar包位于out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar

导入Android Studio

复制一份classes.jar,將之更名为framework.jar并放到libs文件夹下。然后在项目的Root Projectbuild.gradle下的allprojects块下更改为:

allprojects {
repositories {
google()
jcenter()
}

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

app模块的build.gradle中添加如下task:

preBuild {
 doLast {
 def imlFile = file( ".." + File.separator + ".idea" + File.separator
 + "modules" + File.separator + "app" + File.separator
 + rootProject.name + ".app.iml")
 println 'Changing the library priority order: ' + imlFile.getPath()
 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 'Android sdk version: ' + 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"
 }
 }
}

app模块中添加编译编译依赖:

compileOnly files('libs/framework.jar')

在rebuild Project后就可以导入使用自定义的API了:

findViewById<TextView>(R.id.sample_text).text = Melrose.getInstance().anchor
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00