一、引用framework.jar
1.首先需要通过源码编译获得framework.jar包,实际源码编译后在out下生成classes.jar 即apk中需要导入的framework.jar
out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
2.将jar包放入工程libs下面,然后配置build.gradle
ProjectName\app\build.gradle中的dependencies下面添加compileOnly files('libs/framework.jar')
dependencies {
...
compileOnly files('libs/framework.jar')
}
//add start
preBuild { doLast { def imlFile = file( project.name + ".iml") println 'Change ' + project.name + '.iml order' 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 'what' + 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" } } }
//add end
说明:实际起的作用就是和有的文章里面描述的修改ProjectName\app\app.iml中的内容起的作用一样,使as引用能使用framework.jar隐藏的api接口,将自己的jar引用放在Android API 28 Platform" jdkType="Android SDK的前面
ProjectName\build.gradle中的allprojects下面如下配置
allprojects { repositories { google() jcenter() } //add start gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar') } } //add end }
3.之后直接在代码里面验证即可,如果没生效,可以rebuild工程试下,
没引用成功前,mActivityManager是调用不了系统隐藏的api接口的
如果引用成后提示
二、引用settinglib.jar
1.首先需要通过源码编译获得settingslib.jar包,实际源码编译后在out下生成classes.jar 即apk中需要导入的settingslib.jar
out\target\common\obj\JAVA_LIBRARIES\SettingsLib_intermediates
2.将jar包放入工程libs下面,然后配置build.gradle
ProjectName\app\build.gradle中的dependencies下面添加compileOnly files('libs/framework.jar')
dependencies {
...
implementation files('libs/settingslib.jar')
}
3.实际代码调用
说明:之前思维定式以为调用系统的jar包都要类似与framework.jar中的方法一样,有的网上也说要将
implementation fileTree(dir: 'libs', include: ['*.jar'])注释掉,实际结果是不需要注释也可以用,且不要用
compileOnly files去引用,否则as调用会没问题,但是一运行就会提示类找不到的错误
补充:实际调试验证log结果,蓝牙接口调用时注意加权限