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
分享
二维码

)">
< <上一篇
下一篇>>