基于Android14 Mtk平台移植系统应用Settings到AS中编译

废话不多说,直接进入正题

一、移植前的准备工作
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,源码如下图
SettingsLib源码结构新建一个module,名字为settingslib,包名以源码目录中的AndroidManifest.xml里面的为准,com.android.settingslib
创建一个module删除src下面的androidTest跟test,保留main目录,然后把SettingsLib目录下的src,res以及AndroidManifest的配置文件拷贝到该module,其中SettingsLib又依赖很多子模块,可以查看bp文件
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的版本对应,有个对应关系表:
compose编译器与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包优先级方法如下:
提高jar包优先级该配置可以方法项目级别下的build.gradle文件,也就是最外层的gradle,这样就不需要在每个子模块都配置。
5.还有一些模块使用了aidl,比如setupcompat模块,找到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'</
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值