android apk如何引用系统framework.jar,settingslib.jar

mac2024-05-20  37

一、引用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的前面

<orderEntry type="library" name="Gradle: __local_aars__:D.\yxzWork\workspace\FrameworkLibTest\app\libs\settingslib.jar:unspecified@jar" level="project" /> <orderEntry type="jdk" jdkName="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结果,蓝牙接口调用时注意加权限

最新回复(0)