文章目录[x]
- 1:在Framework层添加代码并编译
- 1.1:准备工作
- 1.2:编写自己的API
- 1.3:make update-api
- 1.4:生成framework.jar
- 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后,在命令行中croot到AOSP的根目录下执行如下命令:
make update-api
在Android源码中添加了自定义的包、类、方法或者修改了Android源码中标识为@hide的方法、类,需要这些内容对 Application可见并且需要编译进SDK的Document中的话,这个命令是必须执行的。
生成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 Project的build.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