一.环境准备
首先需要特定版本的AndroidStudio,由于AndroidStudio与gradle版本相关联,所以也需要注意gradle版本,如下是我的AndroidStudio与gradle版本
在gradle-wrapper.properties中配置gradle版本如下:
|
在Settings中的build.gradle中gradle配置如下:
|
如果没有上面AndroidStudio版本可以进行下载,不用卸载原先的AndroidStudio,是可以运行多个不同版本的AndroidStudio的,AndroidStudio下载地址:Android Studio 下载文件归档 | Android 开发者 | Android Developers
Java版本如下:
二.理解Settings Android.bp文件里面的依赖关系
首先我们找到Settings项目位置:QCM6125_Android13.0_R04_r020\QSSI.13\packages\apps\Settings
然后分析Settings里面的Android.bp文件
|
分析结果:
1.生成Settings.apk的android_app编译配置,通过Settings-core间接依赖于srcs:["src/**/*java"]
- 所以未直接使用自己目录下的源码来生成
- 若依照此配置构建AS工程,则工程中没有Settings源码,而是由各种库组成
- 我们构建AS工程,本身是为了调试Settings源码,所以jar就失去了构建AS工程的意义
- 结论:我们构建的Settings AS工程,其Settings.app的build.gradle将直接依赖源码,而不是Settings-core.jar
2.从Settings-core模块的defaults应用得知,我们还需要依赖模块:SettiingsLibDefaults和SettingsLib-search-defaults
- 从后续SettingsLib的依赖分析得知,Settings需要依赖于SettingsLib,所以我们还得继续分析SettingsLib的Android.bp
3.以androidx开头的,均为安卓的支持库,通过Maven远程仓库获取
三.理解SettingsLib中的Android.bp文件中依赖关系
上面说了Settings中需要依赖SettingsLib,首先我们找到SettingsLib的位置:\\10.66.100.21\disk1\project\QCM6125_Android13.0_R04_r020\QSSI.13\frameworks\base\packages\SettingsLib
然后分析里面的Android.bp文件
|
分析结果
1.因为"Settings-core"模块默认引用的一组名为"SettingsLibDefaults"的配置,所以我们需要先解决"SettingsLibDefaults"
2.通过对"SettingsLibDefaults"分析,我们得知,需要引入"SettingsLib"的模块,此模块负责编译srcs:["src//*.java","src//*.kt"]
3.“SettingsLib”依赖于WifiTrackerLib、WifiTrackerLibRes模块
4.“SettingsLib”模块还依赖于一连串的子模块,例如:"SettingsLibHelpUtils"..."SettingsLibButtonPreference"
5.“SettingsLib”模块还依赖于一些其他模块,"setupdesign"、"zxing-core-1.7"、"iconloader"
6."SettingsLib"模块依赖于一些Androidx为安卓支持库,可以直接通过maven仓获取。
四.静态库与动态库的依赖方式
1.静态链接库:static_libs
静态库特点:
- 每一个被static_libs命名的模块,他的数据都会被合并到目标apk中
- 同时,这些static_libs还将承担编译时被引用符号的解析工作
例如:
static_libs: ["android.hardware.dumpstate-V1.1-java"],
转换成build.gradle:
implementation files('../libs/android.hardware.dumpstate-V1.1-java.jar')
2.动态库链接:shared_libs、libs
- 与静态链接库的区别,动态库为所有程序都可使用,在运行时由对应的进程映射、加载到自己的内存空间
- 所以动态链接库的内容,只是在编译时参与链接,它的数据则不会被合并到目标APK中
例如:
libs: ["ims-common"],
转换成build.gradle
compileOnly files('../libs/ims-common.jar')
五.移植整体流程概述及思路
1.需要完成的前置工作
- 首先环境,最好用我上面的AndroidStudio版本及gradle配置
- 将代码整编得到out产物
2.移植的基本思路和步骤
- 分析android.bp和AndroidManifest.xml文件,了解Settings、SettingsLib等依赖情况、包名、版本号等重要信息
- 根据AndroidManifest.xml文件获得包名,创建同名的AS项目或者模块
- 根据android.bp分析对应的build.gradle内容
- 根据android.bp的依赖配置,到out目录下复制对应的名称classes.jar,重命名后复制到libs目录下
- 根据android.bp的依赖配置,补全其他可从网络获取的依赖,如:androidx依赖、zxing依赖
- 解决其他模块的编译错误、依赖问题、并编译通过
- 解决SettingsLib模块的编译错误、依赖问题,并编译通过
- 解决Settings模块的编译错误、依赖问题,并编译通过
- 解决Settings.app模块的编译错误,特别是依赖问题,有依赖缺失、依赖冲突是主要问题
- 对Settings.app模块进行签名、运行到设备上,解决运行时错误,验证各个主要菜单功能正常,不发生闪退、崩溃
- 搞定!!!
六.创建一个与Settings同包名的AS项目
1.AS创建新项目
2.选择[No Activity]
3.填写包名,完成创建
Name:Settings
Package name:com.android.settings
最后,点击【Finish】
4.删除新建的Settings AS项目中的src与res目录
删除后的目录结构如下
|
5.将原版的Settings中src、res、libs、AndroidManifest.xml文件复制到AS相应目录下(这一步可以放到最后和添加Settings.gradle的依赖一起做)
如下图内容复制到AndroidStudio的Settings对应目录下面
复制后对应的Settings项目中如下:
注意values可以按照需要保存相应的文件夹,我这边是只保留默认的values和中文的values的
其实这些步骤也可以放到最后将所有模块导入差不多了在做Settings模块,不然会有很多报错,这里我暂时不说Settings的gradle配置的了,这些都放到最后来说
七.移植SettingsLib模块
1.创建New Module
2.选择Android Library类型,填写包名com.android.settingslib,模块名:SettingsLib
然后点击Finish
3.将原版的文件和配置移植到SettingsLib中
和Settings一样,将res,src,xml移植到SettingsLib中
找到原版的SettingsLib的位置
位置:\QCM6125_Android13.0_R04_r020\QSSI.13\frameworks\base\packages\SettingsLib
然后将目录的内容移植到SettingsLib中
然后分析Android.bp文件,将依赖配置添加到SettingsLib的gradle中,最终效果如下图:
后续完整内容请关注微信公众号: