1.Android Framework定制API

1.1.增加API编译

一般增加Java API后会编译报错,根据如下提示执行(Android Q为例)

You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
   1. You can add '@hide' javadoc comments to the methods, etc. listed in the
      errors above.

   2. You can update current.txt by executing the following command:
         make api-stubs-docs-update-current-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.
执行命令
make api-stubs-docs-update-current-api

1.2.生成系统签名文件keystore

(1)找到平台签名文件“platform.pk8”和“platform.x509.pem”

文件位置 android/build/target/product/security/

(2)把pkcs8格式的私钥转化成pkcs12格式:

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt

(3)把x509.pem公钥转换成pkcs12格式

openssl pkcs12 -export -in platform.x509.pem -inkey     shared.priv.pem -out shared.pk12 -name xxx-androidkey

密码都是(根据需要自行定义):xxxandroid

(4)生成platform.keystore

keytool -importkeystore -deststorepass xxxandroid -destkeypass xxxandroid -destkeystore platform.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass xxxandroid -alias xxx-androidkey

最终在同一个目录下生成platform.keystore文件。

2.Android Studio应用适配

2.1.源码编译的framework.jar

android 系统应用二次开发的导入包,生成位置
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar

可以自行重命名为framework.jar

2.2.Android Studio引入源码编译的包

2.2.1.系统签名

(1)在 AndroidMainfest.xml 中显示添加系统权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ymf.demoapp"
    android:sharedUserId="android.uid.system">

(2)选择生成platform.keystore添加到android studio的Store File并填入密码
在这里插入图片描述

2.2.2.引入framework.jar

(1)将拷出来的jar文件命名为framework.jar或androidXX.jar,放在Module的libs下面

(2)右键framework.jar,选择“Add As Library”
原来无法索引的就会找到

2.2.3.编译调试

2.2.1.引入framework.jar后造成的超方法数
Caused by: java.lang.ArrayIndexOutOfBoundsException: 65535

或者

Execution failed for task ':app:mergeExtDexDebug'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > java.lang.ArrayIndexOutOfBoundsException: Index 65535 out of bounds for length 61483

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

这个异常可以理解为,总函数数量超出java虚拟机的限制.

解决方案:修改framework.jar的编译方式
在build.gradle中将:implementation files(‘libs/framework.jar’)的引用方式更换为compileOnly files(‘libs/framework.jar’),不在Android Studio的选框里选择,因为没有这个选项!
后者的含义为只编译不集成进apk或者jar包中, 相当于编译的时候有framework.jar环境,但是却不会将framework.jar的相关引用编译进jar或者apk中.

2.2.2.引入framework.jar后还是默认索引的AS的android.jar

可以在模块的build.gradle中添加如下代码,就会优先索引framework.jar

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        Set<File> fileSet = options.bootstrapClasspath.getFiles()
        List<File> newFileList =  new ArrayList<>();
        //建议用绝对位置
        newFileList.add(new File("libs/framework.jar"))
        newFileList.addAll(fileSet)
        options.bootstrapClasspath = files(newFileList.toArray())
        //或者
        //options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
    }
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐