本文基于如下版本环境:
gradle版本8.6,gradle plugin版本8.4.0。Gradle JDK为17。
Android Studio Jellyfish | 2023.3.1
Build #AI-233.14808.21.2331.11709847, built on April 13, 2024
1.确保.idea下生成modules文件夹
新建一个工程后,首先进入这个路径下:File | Settings | Build, Execution, Deployment | Build Tools | Gradle
,把 Generate *.xml files for modules imported from Gradle
勾选上,
确保.idea/modules
这个文件夹存在。
2.找到framework.jar并使用
这里我使用combined这个目录下的framework.jar(这里编译的aosp,版本是android14-release版本)。
find ./out/soong/ -name "framework.jar"
./out/soong/dexpreopt_x86_64/dex_bootjars_input/framework.jar
./out/soong/.intermediates/frameworks/base/framework/android_common/turbine-combined/framework.jar
把jar放到MyApplication/app/libs文件夹下,
修改MyApplication/app/build.gradle,使用compileOnly files('libs/framework.jar')
引用jar,并配置修改My_Application.app.main.iml文件。
dependencies {
compileOnly files('libs/framework.jar')
implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add("-Xbootclasspath/p:$rootProject.rootDir/app/libs/framework.jar")
}
}
preBuild {
doLast {
// 注意:iml的路径要根据自己的实际情况来写
def imlFile = file("../.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 " + 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) {
}
}
}
这样build的时候My_Application.app.main.iml
中 <orderEntry type="jdk" jdkName="Android API 34 Platform" jdkType="Android SDK" />
位置就会发生变化,编程最后一行,Android SDK的引用优先级低于framework.jar。
3.验证是否成功引用
把以下代码加入MainActivity,然后运行即可。
float aaa = AdaptiveIconDrawable.MASK_SIZE;
int bbb = WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
Log.e("Test", "onCreate: " + aaa + " " + bbb);//onCreate: 100.0 2019
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.....
float aaa = AdaptiveIconDrawable.MASK_SIZE;
int bbb = WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
Log.e("Test", "onCreate: " + aaa + " " + bbb);//onCreate: 100.0 2019
}
}
这里能正常运行就表示成功引用。
注意:虽然引用framework.jar,但是实际运行中使用的是设备里的代码,也就是system/framework下的,而不是这里的framework.jar里面的代码。可以单编修改framework.jar去测试。
参考链接:
Android Studio Giraffe引用framework.jar方法
Android Studio 导入自己编译的 framework.jar
高版本 Android Studio 集成 framework.jar