一、引用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結果,藍牙接口調用時注意加權限