天天看點

使用 hideApi SystemApi 在 Android Studio 中開發系統級 APP

使用 hideApi SystemApi 在 Android Studio 中開發系統級 APP

歡迎入群交流
使用 hideApi SystemApi 在 Android Studio 中開發系統級 APP
擷取 jar 包

GitHub:

https://github.com/anggrayudi/android-hidden-api

從安卓源碼擷取:

out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/

添加 jar 包到 Android Studio
使用 hideApi SystemApi 在 Android Studio 中開發系統級 APP
app 的 build.gradle 配置
dependencies {
//    implementation fileTree(dir: "libs", include: ["*.jar"])
    compileOnly files('libs/mini_framework.jar')
}
           
  • api 或 compile 關鍵字引用的包對于其他 module 來說是可見的
  • implementation 關鍵字引用的包對于其他 module 來說是不可見的
  • compileOnly 隻需要參與編譯,而不需要将 mini_framework.jar 的内容編譯進 apk 中
preBuild {
    doLast {
        def imlFile = file("../.idea/modules/app/app.iml")
        println('preBuild file exists:' + imlFile.exists())
        if (imlFile.exists()) {
            try {
                println('preBuild start')
                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 groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])

//                def settingslibName ='Gradle: ./app/libs/settingslib.jar'
//                def jdkNode1 = parsedXml.component[1].orderEntry.find { it.'@name' == settingslibName }
//                parsedXml.component[1].remove(jdkNode1)
//                new groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'library', 'name': settingslibName, 'level': 'project'])

                groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
                println('preBuild end')
            } catch (Exception e) {
                println('preBuild Exception:' + e.getMessage())
            }
        }
    }
}
           

此方法是優先加載 libs 下的 jar 包,實際過程中此方法不需要

使用此方法會将系統的 API 加載放到最後

使用 hideApi SystemApi 在 Android Studio 中開發系統級 APP
根目錄下的 build.gradle 配置
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }

    def path = getRootDir().getAbsolutePath() + '\\app\\libs\\mini_framework.jar'
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:' + path)
//            options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\settingslib.jar')
            println('bootpath:' + path)
        }
    }
}
           
簽名成系統包

用到的檔案

platform.pk8、platform.x509.pem、signapk.jar、libconscrypt_openjdk_jni.so

  • 在 AndroidManifest 中添加
  • 在 android 系統目錄 build/target/product/security/拷貝系統簽名檔案

    platform.x509.pem、platform.pk8

  • 在 out/host/linux-x86/framework 目錄下找到 signapk.jar 檔案;
  • 在 out/host/linux-x86/lib64 下拷貝 libconscrypt_openjdk_jni.so 檔案;
  • 将以上檔案放到同一檔案夾下,并将需要系統簽名的 apk 也放在同一檔案夾
  • 進入該檔案目錄下執行以下指令即可完成簽名
    java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 app.apk 
    app_sign.apk
               
微信公衆号【他曉】,關注并轉發,謝謝
使用 hideApi SystemApi 在 Android Studio 中開發系統級 APP