废话不多说,直接进入正题
一、移植前的准备工作
1.一套mtk的系统源码(包含了Settings,settingslib,setupcompat,setupdesigin,wifitracklib等)
2.Android Studio环境
3.最好使用ubuntu系统,或者虚拟机装ubuntu系统
4.确保网络通畅,因为有很多依赖需要下载,最好能翻墙,否则有些下载失败
5.建议gradle版本不要用太高的,我用的8.0的,agp也用的8.0,kotlin版本用的1.8.10
二、正式开始
1.在AS里面新建一个Android项目,包名为com.android.settings,把源码Settings里面的src,res,res-export,res-product,res_ext,libs,还有protos以及配置文件导入工程,覆盖。
Settings源码目录
2.Settings依赖很多子模块,其中最大的一块SettingsLib,源码如下图
新建一个module,名字为settingslib,包名以源码目录中的AndroidManifest.xml里面的为准,com.android.settingslib
删除src下面的androidTest跟test,保留main目录,然后把SettingsLib目录下的src,res以及AndroidManifest的配置文件拷贝到该module,其中SettingsLib又依赖很多子模块,可以查看bp文件
把这些子模块依次以module的形式引入,有些子模块是直接在SettingsLib这个目录下,有些则不在,比如iconloader,还有setupcompat,setupdesign,wifitracklib,这些模块自己去源码里面找,然后一个个以module的形式引入,一共差不多有40来个。每次引入一个,单独调试编译确保最小的单元能编译通过。
3.举个具体的子模块,SettingsLib里面的spa模块,按照上面说的创建好module,这里命名为SpaLib,导入src以及res,配置文件,跟bp文件去配置gradle,该模块使用了compose,需要配置compose的运行环境,如果kotlin版本低于2.0,则采用以下配置
composeOptions {
kotlinCompilerExtensionVersion '1.4.2'
}
buildFeatures {
compose true
}
此处需要注意,kotlinCompilerExtensionVersion这个版本号要跟kotlin的版本对应,有个对应关系表:
我项目里kotlin使用的是1.8.10版本,所以这里compose编译版本用的是1.4.2,这里关系一定要对应,否则编译会失败,其他的一些依赖根据bp文件引入相应的库就行,大多为androidx库,最终的grade配置如下:
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.jetbrains.kotlin.android)
// alias(libs.plugins.compose.compiler)
}
android {
namespace 'com.android.settingslib.spa'
compileSdk 34
defaultConfig {
minSdk 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
composeOptions {
kotlinCompilerExtensionVersion '1.4.2'
}
buildFeatures {
compose true
}
}
dependencies {
implementation platform(libs.androidx.compose.bom)
implementation libs.appcompat
implementation libs.material
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
implementation libs.slice.builders
implementation libs.slice.core
implementation libs.slice.view
implementation libs.compose.animation
implementation libs.compose.material3
implementation libs.compose.material.icons.extended
implementation libs.compose.runtime
implementation libs.compose.runtime.livedate
implementation libs.compose.ui.ui.tooling.preview
implementation libs.lifecycle.livedata.ktx
implementation libs.lifecycle.runtime.compose
implementation libs.navigation.compose
implementation libs.lottie.compose
implementation libs.mpandroidchart
implementation libs.androidx.activity.compose
implementation libs.compose.ui
//支持koltin
implementation libs.androidx.core.ktx
// implementation libs.kotlin.stdlib.jdk8
}
这个模块使用了kotlin,所以要引入kotlin插件
4.还有一些模块调用了sdk里面隐藏的接口,或者sdk里面没有的接口,这些接口都在framework.jar里面,需要引入这个jar,比如SettingsLib模块下的子模块Utils,如果没有引入framework,会报如下异常:
PackageManager.MATCH_ANY_USER该属性是隐藏的,引入framework.jar后,还必须要提高其优先级,才能使用隐藏的属性或者方法,提高jar包优先级方法如下:
该配置可以方法项目级别下的build.gradle文件,也就是最外层的gradle,这样就不需要在每个子模块都配置。
5.还有一些模块使用了aidl,比如setupcompat模块,找到setupcompat模块,其目录结构如下:
build.gradle需要增加aidl的配置:
apply plugin: 'com.android.library'
android {
// Not specifying compileSdkVersion here so clients can specify it; must be at least Q
namespace 'com.google.android.setupcompat'
compileSdk 34
defaultConfig {
minSdkVersion 29
targetSdkVersion 34
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.flags'
}
}
sourceSets.main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src/main/java','partnerconfig/java']
aidl.srcDirs = ['src/main/aidl'</

最低0.47元/天 解锁文章
3506

被折叠的 条评论
为什么被折叠?



