Android Studio 4.2及以上创建的项目工程 引入本地framework.jar踩坑记录
直接上干货
1.项目根目录下的build.gradle文件,最外层目录结构,添加以下代码
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
Set<File> fileSet = options.bootstrapClasspath.getFiles()
List<File> newFileList = new ArrayList<>();
//相对位置,根据存放的位置修改路径,如下frameworkmodul为项目的一个module
newFileList.add(new File("frameworkmodul/libs/framework.jar"))
newFileList.addAll(fileSet)
options.bootstrapClasspath = files(
newFileList.toArray()
)
}
}
}
2.framework.jar存放的module下的build.gradle文件,最外层目录结构,添加以下代码,把.iml里的
<orderEntry type="jdk" jdkName="Android API XX Platform" jdkType="Android SDK"/>
放到该文件最后(该行原来的是在iml文件中,第二个component结构中的第一个orderEntry)
.iml文件已存放在了项目根目录下的.idea/modules目录下了,填写格式如下,其中“../”为相对路径,frameworkmodule为framework.jar存放的module;
preBuild {
doLast {
def imlFile = file("../.idea/modules/frameworkmodul/" + project.parent.name + "." + project.name + ".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 Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
} catch (FileNotFoundException e) {
}
}
}
3.framework.jar存放的module下的build.gradle文件,dependencies结构中,增加
dependencies {
compileOnly files('/libs/framework.jar')
}
4.framework.jar所在的module中,如果要使用framework中的隐藏的方法或实现隐藏的接口,该类建议使用Java Class(Kotlin Class项目代码会报红,代码无法追踪到本地的framework.jar中),这样可以直接引用到相应的方法,而且项目不报红(若刚开始引用不到,先运行下项目试下),如下:
import android.media.AudioRecord;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class FrameworkTestActivity extends AppCompatActivity implements AudioRecord.ICAEListener {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_framework);
}
@Override
public void onWakeup(float v, int i, int i1, String s) {
}
@Override
public void onASRAudioCallback(byte[] bytes, int i) {
}
@Override
public void onDWakeupAudioCallback(byte[] bytes, int i) {
}
}
如有错误欢迎指正,如有疑问请留言~
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码