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

MTK平台Android项目开发框架搭建 前言: 不同的项目配置存在差异,原生的SDK无法兼容多个项目作业,按照原生框架创建项目比较繁琐,如果采用GIT分支形式来管理每个项目同样过于繁琐; 因此一套代码多个项目框架是有必要的。 1. 编译脚本: #!/bin/bash ###################################################### # # Author: Tim(1352430027@qq.com) # ############################################# 阅读详情
AI摘要

本文详细介绍了将Android 14 MTK平台系统应用Settings迁移到Android Studio进行独立编译的技术方案,涵盖环境准备、模块拆分与依赖管理(如settingslib及40+子模块)、framework.jar与定制android.jar集成、隐藏API调用、AIDL配置、Compose/Kotlin版本适配、资源冲突处理及私有系统资源引用等关键步骤,并提供了常见编译异常(如JDK不兼容、资源ID错位、jar空实现)的定位与解决方法。

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

一、移植前的准备工作
1.一套mtk的系统源码(包含了Settings,settingslib,setupcompat,setupdesigin,wifitracklib等),其中setupcompat,setupdesigin的源码路径如下:/alps/external/setupcompat,/alps/external/setupdesign
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']
        res.srcDirs = ['src/main/res']
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_9
        targetCompatibility JavaVersion.VERSION_1_9
    }

    buildFeatures {
        aidl = true
    }
}

dependencies {
    implementation libs.annotation

    //在PartnerCustomizationLayout使用了,暂时有问题,注释掉了
    implementation libs.errorprone
}

其他30多个模块都是大同小异,全部一一引入,调试编译通过。

所有子模块都引入并能单独编译通过后,开始调试settingslib模块,直接编译该模块,提示异常提示缺哪个类,在哪个模块下,就在gradle引入这个模块,最终的grade配置如下:

plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace 'com.android.settingslib'
    compileSdk 34

    defaultConfig {
        minSdk 29
        targetSdk 34
        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"
    }

    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:' + getRootDir().getPath() + '/libs' + '/framework.jar:'
                    + getRootDir().getPath() + '/app/libs/framework-bluetooth.jar:'
                    + getRootDir().getPath() + '/app/libs/framework-wifi.jar:'
                    + getRootDir().getPath() + '/app/libs/framework-connectivity.jar:'
                    + getRootDir().getPath() + '/app/libs/framework-connectivity2.jar:'
            )

        }
    }

}

dependencies {

    implementation libs.appcompat
    implementation libs.material
    testImplementation libs.junit
    androidTestImplementation libs.ext.junit
    androidTestImplementation libs.espresso.core
   //android x , add by huangxiaofeng
    implementation libs.annotation
    implementation libs.coordinatorlayout
    implementation libs.core.core
    implementation libs.fragment
    implementation libs.lifecycle.runtime
    implementation libs.loader
    implementation libs.localbroadcastmanager
    implementation libs.preference
    implementation libs.recyclerview
    implementation libs.zxing.core
    implementation libs.room.runtime
    implementation libs.androidx.core.ktx
    implementation libs.window
//    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
//    implementation libs.legacy.support.v4
//    implementation libs.legacy.preference.v14
//    implementation libs.mediarouter.nodeps
//    implementation 'androidx.appcompat:appcompat-resources:1.6.1'


    compileOnly files('../app/libs/iconloader.jar')
    compileOnly files('../libs/framework.jar')
    compileOnly files('../app/libs/core-libart.jar') //for libcore.io.Streams
    compileOnly files('../app/libs/core-icu4j.jar')
    compileOnly files('../app/libs/framework-bluetooth.jar')
    compileOnly files('../app/libs/framework-connectivity.jar')
    compileOnly files('../app/libs/framework-connectivity2.jar')
    compileOnly files('../app/libs/framework-tethering.jar')
    compileOnly files('../app/libs/framework-configinfrastructure.jar')
    compileOnly files('../app/libs/framework-wifi.jar')
//    compileOnly files('../app/libs/ext.jar')
//    compileOnly files('../app/libs/framework-wifi-util-lib.jar')

    //extern dependency
    implementation project(':WifiTrackerLibRes')
    implementation project(':setupdesign') //org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 导致升级了版本,根本原因是该依赖implementation libs.window的版本为1.2.0导致,降低为1.0.0
    implementation project(':setupcompat')
    implementation project(':iconloader')

    //inner module
    implementation project(':SettingsLibHelpUtils')
    implementation project(':SettingsLibRestrictedLockUtils')
    implementation project(':SettingsLibActionBarShadow')
    implementation project(':SettingsLibAppPreference')
    implementation project(':SettingsLibSearchWidget')
    implementation project(':SettingsLibSettingsSpinner')
    implementation project(':SettingsLibIllustrationPreference')
    implementation project(':SettingsLibLayoutPreference')
    implementation project(':SettingsLibMainSwitchPreference')
    implementation project(':SettingsLibActionButtonsPreference')
    implementation project(':SettingsLibEntityHeaderWidgets')
    implementation project(':SettingsLibBarChartPreference')
    implementation project(':SettingsLibProgressBar')
    implementation project(':SettingsLibAdaptiveIcon')
    implementation project(':SettingsLibRadioButtonPreference')
    implementation project(':SettingsLibSelectorWithWidgetPreference')
    implementation project(':SettingsLibDisplayUtils')
    implementation project(':SettingsLibUtils')
    implementation project(':SettingsLibEmergencyNumber')
    implementation project(':SettingsLibTopIntroPreference')
    implementation project(':SettingsLibBannerMessagePreference')
    implementation project(':SettingsLibFooterPreference')
    implementation project(':SettingsLibUsageProgressBarPreference')
    implementation project(':SettingsLibCollapsingToolbarBaseActivity')
    implementation project(':SettingsLibTwoTargetPreference')
    implementation project(':SettingsLibSettingsTransition')
    implementation project(':SettingsLibButtonPreference')
    implementation project(':SettingsLibDeviceStateRotationLock')
    implementation project(':SettingsLibProfileSelector')
}

你可能需要编译若干次,每次都会报某某类找不到,先在当前项目全局查找,看是不是在已经引入的某个子模块下,如果找到,则引入相应的子模块即可,如果没有找到,可能在系统源码里面的某个jar里面,在整编完系统源码后,几乎所有的jar都会在如下目录
out/soong/.intermediates
out/target/common/obj/JAVA_LIBRARIES
比如import static android.uwb.UwbManager.AdapterStateCallback.STATE_ENABLED_INACTIVE;
提示这个找不到,则可以到上述目录下,通过命令:grep android.uwb.UwbManager.class -rn .找到该类所在的jar包,结果如下:
在这里插入图片描述这里我已经把jar包在系统的out目录下找到并放到了其他路径下,所以此处截图的结果并不是在上述提到的两个路径下。
总共大概有40个jar需要引入,settingslib能编译通过后,基本上就完成了一半的移植工作。

移植的过程中需要注意的点以及可能出现的问题:
1.jdk兼容性问题,我建议所有模块的gradle里面配置java的编译环境jdk为1.8,kotlin的也为1.8,

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }

否则会出现一些莫名其妙的错误,比如framework里面的一些接口找不到,因为我的jar包是另外的同事提供的,他编系统源码的过程使用的是jdk17的环境,所以他提供的jar包都是jdk17的,其中有个jar,SettingsLibActivityEmbedding.jar,引用其中的内联函数,报了一个异常:
在这里插入图片描述jdk不兼容导致,后来解决方案是不使用该jar,在如下依赖找到了这个接口
在这里插入图片描述
2.一些资源找不到,比如字符串,可以通过如下配置,可能解决:
在grade.properties中,增加一行配置
android.nonTransitiveRClass=false

3.有些子模块如:SettingsLibBannerMessagePreference,gradle配置没问题,但就是提示找不到settingslib_preferred_minimum_touch_target,可以尝试暂时把该module改为application,不再以library的形式引入,居然就编译通过了,我暂时没搞懂什么原因,在最后调试app的时候,再把对应模块改回以library的形式引入就行,参考如下大佬的文章:添加链接描述

4.Error while processing /home/ls/AndroidStudioProjects/Lens_Settings/setupdesign/main/res/drawable-anydpi-v21/sud_navbar_ic_more.xml : Width (0) and height (0) cannot be <= 0
定义的dimen明明不为0,却报这个异常,无奈硬编码设置宽高,暂时通过编译

5.找不到该资源android:color=“?androidprv:attr/colorSurfaceHighlight”
目前as好像不支持这种写法:?androidprv,我的处理方式是先注释,因为不多,先确保工程能编译通过.

6.implementation ‘com.github.PhilJay:MPAndroidChart:v3.1.0’ 依赖失败原因,要先配置maven,根据官网去配置

7.AS尚不能处理product属性,所以不能通过此属性来区分,出现的重复资源,需要去除,因为涉及很多字符串,需要使用正则表达式去删,不能手动去删,极容易误删,主要命令:

<string name="(.*?)" product="nosdcard" msgid="(.*?)">"(.*?)"</string>

<string name="(.*?)" product="nosdcard">(.*?)</string>

(.*?)<string name="(.*?)" product="tablet" msgid="(.*?)">(.*?)</string>(.*?)

(.*?)<string name="(.*?)" product="tablet">(.*?)</string>(.*?)

(.*?)<string name="(.*?)" product="tablet">\n(.*?)\n(.*?)</string>(.*?)

具体参考文章:添加链接描述,感谢大佬

8.org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
该异常是compose的环境没有配对

9.异常:static import only from classes and interfaces
该异常都是jdk不兼容导致,明明提示的类都在framework.jar里面,但却报了该异常,build.gradle中的jdk都配置为1.8就行.

基本上就这些,最后附上自测能编译出apk的完整版项目结构:
在这里插入图片描述在这里插入图片描述用到的jar包
app module下:
在这里插入图片描述

在这里插入图片描述项目根目录下:
在这里插入图片描述

--------------------------------------------记录运行时异常-----------------------------------------------------------------------
2024.06.19
异常一:系统资源找不到
报错堆栈:

2024-06-19 10:27:33.588 27985-27985 AndroidRuntime          com.android.settings                 E  FATAL EXCEPTION: main
                                                                                                    Process: com.android.settings, PID: 27985
                                                                                                    android.content.res.Resources$NotFoundException: Drawable com.android.settings:drawable/abc_dialog_material_background with resource ID #0x7f080072
                                                                                                    Caused by: java.lang.UnsupportedOperationException: Can't convert value at index 0 to dimension: type=0x4, theme={InheritanceMap=[id=0x7f1403accom.android.settings:style/Theme.AlertDialog, id=0x7f1403adcom.android.settings:style/Theme.AlertDialog.Base, id=0x7f1403b7com.android.settings:style/Theme.AppCompat.DayNight.Dialog.Alert, id=0x7f1403c3com.android.settings:style/Theme.AppCompat.Light.Dialog.Alert, id=0x7f14007bcom.android.settings:style/Base.Theme.AppCompat.Light.Dialog.Alert, id=0x7f14007acom.android.settings:style/Base.Theme.AppCompat.Light.Dialog, id=0x7f1400cacom.android.settings:style/Base.V21.Theme.AppCompat.Light.Dialog, id=0x7f1400e3com.android.settings:style/Base.V7.Theme.AppCompat.Light.Dialog, id=0x7f140078com.android.settings:style/Base.Theme.AppCompat.Light, id=0x7f1400dfcom.android.settings:style/Base.V28.Theme.AppCompat.Light, id=0x7f1400dccom.android.settings:style/Base.V26.Theme.AppCompat.Light, id=0x7f1400d6com.android.settings:style/Base.V23.Theme.AppCompat.Light, id=0x7f1400d4com.android.settings:style/Base.V22.Theme.AppCompat.Light, id=0x7f1400c9com.android.settings:style/Base.V21.Theme.AppCompat.Light, id=0x7f1400e2com.android.settings:style/Base.V7.Theme.AppCompat.Light, id=0x7f1401aecom.android.settings:style/Platform.AppCompat.Light, id=0x7f1401b9com.android.settings:style/Platform.V25.AppCompat.Light, id=0x1030241android:style/Theme.Material.Light.NoActionBar, id=0x1030237android:style/Theme.Material.Light, id=0x103000candroid:style/Theme.Light, id=0x1030005android:style/Theme], Themes=[com.android.settings:style/Theme.AlertDialog, forced, com.android.settings:style/SettingsPreferenceTheme, not forced, com.android.settings:style/Theme.SubSettings, forced, com.android.settings:style/SetupWizardPartnerResource, forced, android:style/Theme.DeviceDefault.Light.DarkActionBar, forced]}
                                                                                                    	at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:795)
                                                                                                    	at android.graphics.drawable.GradientDrawable.updateDrawableCorners(GradientDrawable.java:1663)
                                                                                                    	at android.graphics.drawable.GradientDrawable.applyThemeChildElements(GradientDrawable.java:1571)
                                                                                                    	at android.graphics.drawable.GradientDrawable.applyTheme(GradientDrawable.java:1467)
                                                                                                    	at android.graphics.drawable.DrawableWrapper.applyTheme(DrawableWrapper.java:165)
                                                                                                    	at android.graphics.drawable.InsetDrawable.applyTheme(InsetDrawable.java:150)
                                                                                                    	at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:696)
                                                                                                    	at android.content.res.Resources.loadDrawable(Resources.java:1004)
                                                                                                    	at android.content.res.Resources.getDrawableForDensity(Resources.java:994)
                                                                                                    	at android.content.res.Resources.getDrawable(Resources.java:933)
                                                                                                    	at android.content.Context.getDrawable(Context.java:948)
                                                                                                    	at androidx.core.content.ContextCompat$Api21Impl.getDrawable(ContextCompat.java:1012)
                                                                                                    	at androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:522)
                                                                                                    	at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:149)
                                                                                                    	at androidx.appcompat.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:480)
                                                                                                    	at androidx.appcompat.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:94)
                                                                                                    	at androidx.appcompat.app.AppCompatDelegateImpl.attachToWindow(AppCompatDelegateImpl.java:872)
                                                                                                    	at androidx.appcompat.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:342)
                                                                                                    	at androidx.appcompat.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:303)
                                                                                                    	at androidx.appcompat.app.AppCompatDelegate.create(AppCompatDelegate.java:267)
                                                                                                    	at androidx.appcompat.app.AppCompatDialog.getDelegate(AppCompatDialog.java:178)
                                                                                                    	at androidx.appcompat.app.AppCompatDialog.<init>(AppCompatDialog.java:57)
                                                                                                    	at androidx.appcompat.app.AlertDialog.<init>(AlertDialog.java:98)
2024-06-19 10:27:33.588 27985-27985 AndroidRuntime          com.android.settings                 E  	at androidx.appcompat.app.AlertDialog$Builder.create(AlertDialog.java:983)
                                                                                                    	at androidx.preference.PreferenceDialogFragmentCompat.onCreateDialog(PreferenceDialogFragmentCompat.java:161)
                                                                                                    	at androidx.fragment.app.DialogFragment.prepareDialog(DialogFragment.java:925)
                                                                                                    	at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:839)
                                                                                                    	at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1756)
                                                                                                    	at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:539)
                                                                                                    	at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
                                                                                                    	at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2103)
                                                                                                    	at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2004)
                                                                                                    	at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1941)
                                                                                                    	at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:661)
                                                                                                    	at android.os.Handler.handleCallback(Handler.java:958)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:205)
                                                                                                    	at android.os.Looper.loop(Looper.java:294)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:8194)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

分析:根据日志,是在使用AlertDialog时,找不到对应的资源,在配置文件manifest的application节点
在这里插入图片描述
使用了主题Theme.Settings,里面配置了alertDialogTheme
在这里插入图片描述
在这里插入图片描述原因在这里,系统属性config_dialogCornerRadius找不到,我这里暂时使用硬编码写死28dp,暂时解决这个问题,其本质原因,我猜测是因为AS中编译使用的是原生的SDK,而系统可能有新增的资源,比如如果你们是基于mtk平台的话,就会新增很多系统资源,这就导致,原生sdk中的资源id跟系统生成的对应不上,所以找不到,可以使用系统编译出来的android.jar,替换sdk中的android.jar,去验证这个问题是否解决。我目前没有这个环境,暂未验证(2024.07.09通过另一个string资源不对,已验证)。

----------------------------------update 2024.07.09 begin-------------------------------------------------------
引用系统资源id不对,@*android:string/data_saver_description 该字符串取值不对,原因“异常一”已说明,这里通过手动编译sdk,替换原生sdk中的android.jar,完美解决
编译sdk的方法:
1.需要整编一遍系统的源码
2.在源码根目录执行以下命令
lunch sdk-eng
make sdk
编译成功如下,注意输出的路径Package SDK: out/host/linux-x86/sdk/sdk/android-sdk_eng.ls_linux-x86.zip:
在这里插入图片描述解压该zip,进入platforms-android-34,复制android.jar,替换android studio里面使用的原生sdk中对应platforms-android-34里面的android.jar,重新编译apk,解决

PS:如MTK平台编译sdk报错,又无法解决,整编后,可找到如下jar:
./soong/.intermediates/prebuilts/sdk/sdk_system_current_android/android_common/combined/sdk_system_current_android.jar,解压后该jar的目录结构跟SDK中的android.jar高度一致,可以尝试用这个jar代替android.jar. 但我实际上没有这么干过.

----------------------------------update 2024.07.09 end-------------------------------------------------------

---------------------------------update2026.04.25 start-------------------------------------------------------
访问系统私有资源终极解决方案:

@*android:此类引用的是系统私有资源
通过注入系统编译生成的framework-res.apk
在gradle中配置如下:

// ============================================================================
// Framework color resource stub for AS compilation (NO source modification)
// Problem: drawables use @*android:color/theme_color_settings_xxx
//          (private framework resources)
//
// Solution: Inject system-built framework-res.apk as AAPT2 extra library (-I)
//   - Source files stay as @*android:color/ (NEVER modified)
//   - AAPT2 resolves references from system-compiled framework-res
//   - APK keeps original @*android:color/ references (runtime theme works)
//
// Source: /code/SPRD_A16/SYS/out_system/soong/.intermediates/frameworks/base/core/res/
//         framework-res/android_common/package-res.apk
// ============================================================================
android {
    androidResources {
        // Inject system framework-res so AAPT2 can resolve
        // @*android:color/theme_color_settings_xxx references
            additionalParameters += ['-I', '/code/SPRD_A16/SYS/out_system/soong/.intermediates/frameworks/base/core/res/framework-res/android_common/package-res.apk']
    }
}

---------------------------------update2026.04.25 start-------------------------------------------------------

异常二:JAR依赖冲突
本地JAR:guava.jar
远程依赖:com.google.guava:listenablefuture:1.0在这里插入图片描述远程依赖可在grade通过如下配置去除:

configurations {
    all*.exclude group: 'com.google.guava', module: 'listenablefuture'
}

异常三:使用implement依赖的JAR,编译过程中报如下异常:

com.android.tools.r8.internal.jb: Absent Code attribute in method that is not native or abstract

一般这种是JAR有问题,随便打开JAR包里面的某个类,查看具体方法,是个空实现,替换一个有具体实现逻辑的JAR包,重新编译即可,这种空实现的JAR如果采用compileOnly依赖编译过程中是不会报错的,但运行过程中,会提示相关的方法找不到,报类似异常:NoSuchMethodError

从MTK源码到AS编译:Android 14 Settings应用模块化移植实战指南 本文详细介绍了将MTK平台Android 14系统Settings应用模块化移植到Android Studio进行独立编译与调试的完整实战指南。文章深入剖析了从源码分析、环境搭建、核心依赖库(如SettingsLib)拆解、隐藏API调用处理、到系统JAR包引入等关键步骤,并总结了编译过程中遇到的典型问题与解决方案,旨在帮助开发者大幅提升系统应用定制开发的效率。 阅读详情

相关推荐

保姆级教程:在Android Studio里手动编译MTK Android 14的Settings应用(附完整依赖包清单)

本文提供了一份详细的保姆级教程,指导开发者如何在Android Studio中手动编译MTK Android 14的Settings应用。教程涵盖了环境准备、项目结构配置、依赖处理、关键问题解决方案以及常见编译问题排查,帮助开发者高效完成系统级应用的定制开发。

weixin_42549451的博客 237

【Android篇】MTK平台编译流程

MTK是联发科技的缩写,是一家面向全球的半导体芯片厂商。如果你要编译MTK Android代码,可以按如下步骤进行:在终端输入以下命令,将编译所需的工具链路径加入环境变量中。 下载源码 从MTK官网或其他渠道下载想要编译的MTK Android源码。进入源码目录,执行以下命令进行配置。 开始编译 执行以下命令开始编译。 其中表示使用8个线程进行编译,你可以根据自己的电脑配置设置合适的线程数。完成后,在目录下会生成编译好的系统镜像文件。

https://blog.youkuaiyun.com/qFAFAF 2065

Android14 Mtk平台Settings应用AS编译移植:从源码依赖到APK构建的实战指南

本文详细介绍了将MTK平台Android 14系统源码中的Settings应用移植到Android Studio进行编译的完整实战流程。文章从环境准备、源码依赖分析入手,重点讲解了核心模块SettingsLib的拆分与构建、隐藏API的处理、编译过程中的各类疑难杂症(如资源冲突、依赖问题)的解决方案,并最终提供了解决运行时崩溃的根本方法——使用定制版android.jar进行编译,为开发者提供了从源码到APK构建的全面指南。

websocket5live的博客 464

Android 系统默认参数的修改

Android 系统默认参数的修改 一般在新项目开始之初,我们需要针对客户需求进行各种系统默认属性的配置,通常这些属性都是通过build.prop、settings.db 、default.xml、一些功能package下的 config.xml 等来进行初始化配置的。 那么,要满足客户的定制需求,对于我们开发者来说,修改SettingsProvider默认值,而第一次开机时,用来填充sett

6846

android调试常见问题(持续更新)

1.jni调用时出现以下错误 failed: dlopen failed: cannot locate symbol “rand” referenced by xxx 通常是ndk编译的平台太低导致,打开jni的Application.mk,修改里面的APP_PLATFORM值大一点,比如 APP_PLATFORM := android-11就可以 2.奔溃:android.os.Ne......

雪狼人的宿命 1223

安卓TV流媒体终端轻量适配方案:基于OMX硬解的老旧设备重生实践

流媒体播放器是智能终端内容呈现的核心组件,其性能表现高度依赖底层解码架构与硬件加速能力。在Android TV生态中,MediaCodec作为标准多媒体接口,需结合芯片厂商提供的OMX IL组件实现高效H.264/H.265硬解;而ExoPlayer等高级封装框架虽具备跨平台优势,却常因SoC碎片化导致软解fallback、Z-order冲突与电源管理异常。本方案聚焦低算力终端(如Amlogic S905X2、RK3328)的真实部署瓶颈,通过精简内核、绕过Stagefright框架、强制指定vendor

weixin_34248023的博客 394

解决Android系统应用移植的“硬骨头”:MTK Settings在AS中编译的9大常见错误与修复方案

本文深入解析MTK平台Settings应用移植到Android Studio环境时常见的9大编译错误,提供针对Android14系统的实战修复方案。涵盖资源ID匹配失效、JAR依赖冲突、Compose环境配置等关键问题,帮助开发者高效解决MTK Settings移植中的技术难题。

weixin_28432777的博客 199

Android车机实现CarPlay的三种可行方案

CarPlay是苹果车载生态的核心协议,本质是一套基于USB/蓝牙双通道、融合AVTP音视频流与HID控制指令的专有通信框架。其技术难点在于iOS与Android系统间缺乏原生协议兼容性,需通过协议桥接、系统级注入或外设中继等方式实现跨平台适配。这类方案涉及USB Host模式识别、Android HAL层接管、SELinux策略绕过及Apple加密握手字段逆向等关键环节,广泛应用于比亚迪DiLink、吉利银河OS等主流Android车机系统。本文聚焦CarLinkit、AutoKit定制ROM与USB-C

weixin_33755557的博客 194

Android 随笔集 By tuliyuan

1.反射机制调用系统服务EthernetManager private void getNetInfo(Context context) { try { // Log.d(TAG, "dddd getNetInfo is " ); Method getServiceMethod = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", new Cla

qq_18906227的博客 2283

MTK Android 之MT6577驱动笔记

转载请注明出处:http://blog.youkuaiyun.com/cbk861110/article/details/9385439 1. LCD 1.1怎样新建一个LCD驱动 LCD模组主要包括LCD显示屏和驱动IC。比如LF040DNYB16a模组的驱动IC型号为NT35510。要在MT577平台上新建这个lcd的驱动,步骤如下: A.新建文件夹nt35510: \medi...

caobaokang的专栏 3万+

Android 10.0 mtk平台系统添加公共so库的配置方法

在10.0的系统定制化开发中,由于 Android对应用应用的系统库限制越来越严格,上层应用包括(apk、jar包)不能直接引用系统的一些so库了。如果需要使用,只能使用,系统申明的公共库。 如果使用非系统申明的公共库,apk运行后调用该so库时,app会直接挂掉,或者系统开发中,编译过程中出现is not accessible for the namespace "classloader-namespace"这个问题,所以需要添加系统so库到公共库配置的目录下然后实现功能,接下来 看下mtk平台的相关配置

安卓兼职framework和app工程师的博客 793

Android使用kts发布aar到JitPack仓库

Android使用kts上传aar到JitPack之前做过sdk开发,需要将仓库上传到maven、或JCenter,但是JCenter已停止维护,本文是讲解上传到JitPack的方式,使用KTS语法,记录使用过程中遇到的一些坑.

u012556114的博客 1691

MTK开发源码包全解析:从目录结构到编译调试实战

在嵌入式系统与Android底层开发中,源码包是连接芯片能力与产品功能的桥梁。理解其目录组织、编译工具链及版本管理逻辑,是进行内核裁剪、驱动适配和系统调试的基础。对于采用联发科平台的开发者而言,MTK开发源码包不仅包含Linux内核与AOSP代码,更集成了vendor闭源驱动、preloader与lk等关键组件,其结构复杂度与编译环境要求远超一般项目。从搭建Ubuntu编译环境、启用ccache加速,到通过dts点亮sensor、配置双击唤醒或排查WiFi MAC丢失,再到使用Source Insight

weixin_33806300的博客 371

mtk android 系统代码问题,MTK Android Driver 之 LCM 知识

本帖最后由 TimKing 于 2018-4-8 20:18 编辑1.lcm 相关概念1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口)、DPI(也叫RGB接口)、DSI.在使用DSI接口时,目前75/77都只支持到2条data lane,加上一条clock lane.使用DPI接口时,根据LCM IC支持的情况,可以选择16bus、18bus传输RGB格式文件,在GPIO部...

weixin_39927378的博客 1399

CM系ROM解包打包原理与工程实践指南

Android ROM解包打包并非简单文件压缩解压,而是涉及Brotli/Sparse/Ext4/SELinux四层嵌套结构的逆向工程。其核心原理在于物理存储、逻辑卷与文件系统的三重空间映射,技术价值体现在对分区对齐、AVB签名、OTA元数据及动态分区(super)的精准控制。典型应用场景包括红米第三方ROM适配、MTK平台定制、LineageOS迁移等工程任务。本文深入解析system.new.dat.br解包失败、boot.img校验不通过、刷机黑屏等高频问题的技术根因,聚焦CM系ROM特有的构建逻辑与

weixin_33804582的博客 354

从零理解域随机化:通过Isaac Lab的events.py掌握Sim-to-Real关键技术

本文深入解析域随机化技术如何通过Isaac Lab的events.py实现Sim-to-Real迁移,提升机器人策略在真实世界的鲁棒性。从刚体属性到环境条件的系统级随机化,详细介绍了工程实践中的关键参数配置与调试技巧,帮助开发者有效缩小仿真与现实的差距。

weixin_29062613的博客 260

Android S版本MtkSettings的加载流程(二)

这一篇主要记录设置项prefrence的两种加载方式:静态加载和动态加载。

有何不可的博客 1478

[QMT量化交易小白入门]-九、如何用Python记录每一笔交易和调试,报错信息?

定义一个函数来获取日志记录器。: 返回全局的日志记录器,以便在其他地方调用。

木头大左的博客 2144

Android14 MTK SystemUI中设置时间为12小时制时,状态栏和锁屏界面显示AM/PM

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考。

qq_47114658的博客 2121

一分钟了解 Claude Code

在 AI 编程工具百花齐放的 2026 年,凭借其终端原生、全项目理解、自主执行的核心能力,开辟了全新赛道。它不是要替代你的 IDE 或编辑器,而是成为你最强大的终端扩展,让你在熟悉的环境中,用自然语言驱动开发,专注创意,而非琐事。

h a 6 6 6 c k 为 你解决复杂难题! 2210

告别JavaScript!C#通过WebAssembly在浏览器中实现“原生级“性能

C# + WebAssembly:前端开发的革命性替代方案 摘要:本文探讨了C#通过WebAssembly取代JavaScript开发前端应用的新趋势。文章分析了JavaScript的局限性(弱类型、回调地狱等),并详细介绍了C#+WebAssembly组合的优势:强类型系统、高性能、多线程支持和代码重用。技术实现方面,阐述了C#通过Mono/.NET编译为WebAssembly字节码的原理,重点介绍了Blazor框架的两种模式。文章还提供了实战指南,包括项目创建、多线程配置,以及一个与ChatGPT AP

墨夶的博客 946

深度解读 Android 14 的 8 个重要新特性 | 开发者说·DTalk

本文原作者: 小虾米君,原文发布于:TechMerger一年一度的Android升级永不缺席,今年的代号叫UpsideDownCake,倒置蛋糕,简称U,对外版本为Android14。一般来说,升级任务分为 ROM 角度和 App 角度,前者比较关心系统内部实现的变化,后者则更加关心对外的 New Features 和 Behavior Changes。本文主要聚焦在 App 角...

Android开发者 3589

让 ABAP 再次优雅:全面认知 ABAP Development Tools for SAP HANA(ADT)与可运行示例

本文介绍了ABAP开发工具ADT(ABAP Development Tools for SAP HANA)的核心概念与价值。ADT是基于Eclipse的现代化ABAP集成开发环境,支持ABAP Platform、S/4HANA等后端开发,提供代码编辑、CDS数据建模、质量检查等全流程功能,相比传统SAP GUI具有显著优势。文章详细阐述了ADT与SAP HANA的关系、关键能力模块(如代码重构、CDS建模、质量管控等),并通过一个制造企业案例说明其实际应用场景。最后提供了ADT安装指南和一个完整的ABAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 672
上一篇: 记录修改系统默认导航模式
下一篇: AOSP编译
Only_Studio
博客等级 码龄11年 115粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值