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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章