将Android10的SystemUI移到AS

news2024/11/15 11:10:14

准备工作

写在最前面,迁移过程中必然会出现很多的问题,整个过程可能会花费比较长的时间,所以要做好心理准备,有问题可留言,一起探讨。

  1. 需要先在虚拟机上源码整编通过,因为迁移会用到一些编译生成的jar包之类的
  2. 环境:
    1. AndroidStudio:最开始是Android Studio 3.5.2 后面因为一直报错就更新到 Android Studio Electric Eel | 2022.1.1 Patch 1
    2. gradle:最开始是是用的3.5.2,后面一直报错就跟as一起升级了,gradle版本用的4.0.1
    3. 我这边是迁移的Android 10的systemui
    4. jdk 永远的1.8

迁移

参考文章:
https://blog.csdn.net/A601023332/article/details/108028937
https://www.jianshu.com/p/6efee2c698a6
https://blog.csdn.net/Mr_ZJC/article/details/104173196

  1. 新建空as项目(建议选择有kt版本的,因为systemui里面有kt的代码,就不用后面自己来引包配置之类的了)

  2. 把源码com.anroid下面的systemui和keyguard代码拿进来放到app/src/main/java/com.android下,把源码的res和res-keyguard 拿进来放到app/src/main 下

  3. 新建4个module-new Android Library

    模块名包名
    legacycom\android\systemui\recents
    plugincom\android\systemui\plugins
    plugin-corecom\android\systemui\plugins
    sharedcom\android\systemui\shared
    settingslibcom.android.settingslib
  4. 把所有模块的源码的src下面的代码,以及.bp和manifest文件放入到对于的路径下面

如果需要转成Androidx 可以看下这篇 文章:https://www.jianshu.com/p/1466ebefe4d0

此时的路径长这样:
e9b9aedda587194ffc0d91313d7427b.png

遇见的错误及解决方案

  • 错误: -source 1.7 中不支持默认方法
    (请使用 -source 8 或更高版本以启用默认方法)

请参考:https://blog.csdn.net/China_Style/article/details/88418139

  • Found item String/kg_failed_attempts_almost_at_wipe more than one time

重复的资源配置,删除tablet的这一类

//使用如下正则可以快速替换
(.*?)<string name="(.*?)" product="tablet" msgid="(.*?)">(.*?)</string>(.*?)
  • AAPT: error: resource android:color/notification_material_background_color not found.

资源找不到,我是直接替换成具体的RGB颜色值的,用chatgpt问的每一个颜色对应的rgb

  • MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (–min-api 26)

修改所有模块下的gradle的minSdkVersion为26

  • error: resource android:style/Theme.Material.QuickSettings not found.

修改gradle配置文件(这个搞了几乎一整天!!!)

之前:
android {
    compileSdkVersion 34
    buildToolsVersion "34.0.0"
    defaultConfig {
        applicationId "com.android.systemui"
        minSdkVersion 29
        targetSdkVersion 34
        ...
    }
}

现在:
android {
    compileSdkVersion 29
    buildToolsVersion "34.0.0"
    defaultConfig {
        applicationId "com.android.systemui"
        minSdkVersion 29
        targetSdkVersion 29
        ...
    }
}
  • 错误: 找不到符号
    符号类 WirelessUtils
    位置:程序包 com.android.settingslib

这个问题是因为我的settingslib模块的gradle配置错了

以前的:
java.srcDirs = [
                    '../src/main/java',
            ]
现在的:
java.srcDirs = [
                    'src/main/java',
            ]
  • androidx.mediarouter_mediarouter-nodeps

我的settingslib模块的Android.bp 里面有一个静态引用是androidx.mediarouter_mediarouter-nodeps,build.gradle直接改成即可

implementation 'androidx.mediarouter:mediarouter:1.0.0'

1689229675822.jpg

  • Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.1.16.

systemui源码里面有kotlin的代码,当初新建项目的时候新建的是java语言的,所以项目里面没有配置kotlin相关的,导致编译代码的时候报错找不到kt的文件,于是我自己手动加了一些kotlin的配置进去后,就报了这个错误。最后我是参考这篇文章来解决的: https://juejin.cn/post/7114218994831687688#comment 。我的做法比较粗暴:将kotlin的依赖版本号改为报错里面最高的一个版本号,这个看情况而定,最好选择新建一个kotlin的项目,应该就不会有这个问题了

  • Error: Duplicate resources

这个简单,删除重复的就行,需要注意的是:我最开始点击的下面具体的报错这里是不会给你指出具体是哪一个资源配置在报错的,应该点击上面的这个就能看见所有的具体的报错的资源名称。
1689297848636.jpg,

在经历过九九八十一难过后终于能编译通过了
但是跑出来似乎没看见我的systmeui呀!!我痛哭!
1689313482396.jpg

  • LeakReporter_Factory
    29ea2de7a26ddf2cecf653771b64ac8.png

根据报错日志可以发现是找不到类LeakReporter_Factory,于是跟了下代码,最终发现这个类在SystemUI-tags.jar里面定义的,于是…修改app的build.gralde对 SystemUI-tags.jar的依赖方式:

之前:
compileOnly files('../jar/SystemUI-tags.jar')
现在:
implementation files('../jar/SystemUI-tags.jar')
  • Duplicate class android.support.v4.xxxx

ok,没有意外,又报错了,类重复引用错误,由于我刚刚把SystemUI-tags也引用进来了,所以报了很多重复的问题,看了最下面一行,区区3586个错误而且(图片是删了一些类后编译再报的错误数量,最开始忘记截图了),来吧,我采用的方式是将SystemUI-tags解压,直接删除里面的重复类,试了下这种方式是可以减少重复类引用的报错的…
d047d17a7dc7463f19c865cf06389b5.png

  • More than one file was found with OS independent path META-INF/androidx.localbroadcastmanager_localbroadcastmanager.version

果然,经过我一阵删除之后依旧报错
可以借鉴这位老哥的文章:https://blog.csdn.net/qq_38287890/article/details/101204604

  • Program type already present: androidx.core.app.INotificationSideChannel

因为引用的库太多了,所以有时候可能你引用的本地jar里面跟Android自身引用的jar有重复的地方,比如这个INotificationSideChannel类就是在androidx.core和SystemUI-tags.jar!\android\support\v4\app 也有,我删了systemui_tag 里面的类在重新编译的
或者 参考这位老哥的文章 : https://blog.csdn.net/Calvin_zhou/article/details/80880501,使用configurations将多余的依赖排除掉,后面我发现这种all*全部排除的方式也不是很好,可能其他库会用到这个group,这样又会导致其他库找不到这个group里面的类了,所以还是按需exclude。

//直接全部排除掉重复冲突的整个group
configurations {
    all*.exclude group: 'xxx'
}
//按需选择需要排除的依赖里面的group,此时依赖树的重要性就体现出来了,因为你需要通过查看依赖树来判断哪些是引用了这个group的
implementation ('group:module:version') {
    exclude group: 'xxx', module: 'xxx'
}

  • Unresolved reference: BATTERY_ESTIMATES_LAST_UPDATE_TIME

这个是settingslib模块的Estimate类引用的系统的全局常量找不到了,但是能点进去而且能看到这个常量,仔细看就可以发现这个常量是被hide了的,所以我直接在代码里面把常量值拿进来用了,hh

  • error: resource style/TextAppearance.Compat.Notification.Info (aka com.android.systemui:style/TextAppearance.Compat.Notification.Info) not found.

内心逐渐崩溃… == 这个问题可能就是由于上面exclude了导致的,折腾了一天,我没在代码里面看见哪里在引用这个style,所以我 在app里面的styles.xml加了一个报错的这个空样式

  • 错误: 找不到符号
    符号: 方法 newInstance(Context,AttributeSet,Boolean,Object,AmbientPulseManager,DynamicPrivacyController,ConfigurationController,ActivityStarterDelegate,StatusBarStateControllerImpl)
    位置: 类 NotificationStackScrollLayout_Factory

app的gradle里面引用了dagger相关的依赖,版本最开始用的2.19,但是由于之前报错 error:Program type already present: androidx.core.os.IResultReceiver$Stub$Proxy 类冲突的时候把版本改到2.46.1 然后解决了这个IResultReceiver类冲突问题,但是现在在2.46.1版本里面的DaggerSystemUIFactory_SystemUIRootComponent类要引用的 NotificationStackScrollLayout_Factory.newInstance()不存在,

  • Program type already present: androidx.core.os.IResultReceiver$Stub$Proxy

又是熟悉的bug… 给 androidx.legacy:legacy-support-v4:1.0.0 加了 exclude group: ‘androidx.core’, module: 'core’后解决

后面又经历了几天的Program type already present: androidx.core.os.IResultReceiver$Stub$Proxy这个问题,改了改去,改了好久都没改好,一直报这个错误,都把所有的远程依赖都exclude排除了androidx.core但是还是会有这个问题,已经崩溃了…
昨天周一,心情不好,请假了一天,一天都在家窝着,感觉不错,用投影仪看了动漫《空想新子和她的千年魔法》,感觉挺治愈的,看了一点荒野求生,然后买了一坨喜欢吃的榴莲,有点熟过头了…
然后今天周二一早来就想着用新建空项目来把gradle里面的依赖都放进来看看会不会报错,版本号这些参考了下以前自己的项目,但是由于gradle版本太新了,我目前 用的这个as不支持,所以去找了个今年一月份的版本,然后依赖拿进来编译是不报错的,能正常生成apk,然后把systemui的gradle版本号这些参考这个空项目改一下,就可以编译成功了!!!
所以我想说的是:如果有一个bug卡了好几天,别急,停下来休息一下,或许明天就会有意想不到的收获,祝你幸运。
至此算是一个阶段性胜利。yeah!

1690268790872.jpg

总结一下:以上这么长一段话可以总结成一句话就是:换了个新一点的as编辑器

但是,还是没有ui显示出来,logcat中看见有崩溃日志,这里就不细说了,大家按照自己的报错来修改就行

  • android:textColor=“?attr/wallpaperTextColor”

类似attr/xxx的这种分两种情况:
1、自定义的属性:在attrs.xml中定义的,然后在styles.xml中,对应的清单文件引用的style样式中去赋值,这里有时候赋值是用的Android原生的xml资源,引用方式类似 @android:color/xxx,但是这种方式有时候会引用不到,会报运行时错误,去掉号的话能点进去看到对应的具体的样式,但是运行的话会报错说这个资源是private的,所以我是直接把这个资源拷贝到res下面去引用的
2、Android 源码里面的属性:并且是在源码里面赋值的,但是不知道为什么这个资源还是引用不到,会报错找不到。留坑~

  • Caused by: android.view.InflateException: Binary XML file line #59 in com.android.systemui:layout/super_status_bar: uid=10012 needs permission android.permission.READ_CONTACTS to read lock_screen_owner_info_enabled for user 0
    07-13 18:52:11.890 2402 2402 E AndroidRuntime: Caused by: java.lang.SecurityException: uid=10012 needs permission android.permission.READ_CONTACTS to read lock_screen_owner_info_enabled for user 0

权限错误,参考了这个老哥的方法解决的,执行adb命令即可。
adb shell pm grant “com.android.systemui” “android.permission.READ_CONTACTS”
adb shell pm grant “com.android.systemui” “android.permission.READ_EXTERNAL_STORAGE”

  • 耗时半个月,还好没有放弃,虽然有些ui面目全非了,但是好歹迁移过来了,按需修改吧!加油!
    1b3ec6bc43062379d95fecc8353cb1a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/818691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android水波纹按压效果(不按时透明)

按压后的效果&#xff08;左边"Cancle"是不按压的效果&#xff09; button_water_ripple_bg.xml <?xml version"1.0" encoding"utf-8"?> <ripple xmlns:android"http://schemas.android.com/apk/res/android"android:colo…

别再分库分表了,来试试它吧

什么是NewSQL传统SQL的问题 升级服务器硬件数据分片NoSQL 的问题 优点缺点NewSQL 特性NewSQL 的主要特性三种SQL的对比TiDB怎么来的TiDB社区版和企业版TIDB核心特性 水平弹性扩展分布式事务支持金融级高可用实时 HTAP云原生的分布式数据库高度兼容 MySQLOLTP&OLAP&#xff…

nginx入门 - 学习笔记(ing)

一、初识 1、相关概念 1&#xff09;正向代理 一个位于客户端和原始服务器之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理发送一个请求并指定目标&#xff0c;然后代理向原始服务器转交请求并将获得内容返回给客户端。 2&#xff09;反向代理…

电气防火限流式保护器在汽车充电桩使用上的作用

【摘要】 随着电动汽车行业的不断发展&#xff0c;电动汽车充电设施的使用会变得越来越频繁和广泛。根据中汽协数据显示&#xff0c;2022年上半年&#xff0c;我国新能源汽车产销分别完成266.1万辆和260万辆,同比均增长1.2倍,市场渗透率达21.6%。因此&#xff0c;电动汽车的安全…

C语言,vs各种报错分析(不断更新)

1.引发了异常: 写入访问权限冲突2.#error: Error in C Standard Library usage 1.引发了异常: 写入访问权限冲突 这里是malloc没有包含头文件<stdlib.h>&#xff0c;包含之后就好了 2.#error: Error in C Standard Library usage 这里就是用C语言写程序时使用了C的头文件…

特大消息春秋链向web4.0进军

新疆春秋文创科技股份有限公司7月28日在新疆春秋艺术博物馆召开了“春秋链开放网络白皮书”新闻发布会。 该公司CEO高建新先生介绍说&#xff1a;“筹建春秋链开放网络是新疆春秋文创科技股份有限公司未来的重要项目&#xff0c;是公司的第一个五年发展计划&#xff0c;将在未来…

详解主流的Hybrid App 技术框架与研发方案

移动操作系统在经历了诸神混战之后&#xff0c;BlackBerry OS、Symbian OS、Windows Phone等早期的移动操作系统逐渐因失去竞争力而退出。目前&#xff0c;市场上主要只剩下安卓和iOS两大阵营&#xff0c;使得iOS和安卓工程师成为抢手资源。然而&#xff0c;由于两者系统的差异…

嵌入式工程师面试经常遇到的30个经典问题

很多同学说很害怕面试&#xff0c;看见面试官会露怯&#xff0c;怕自己的知识体系不完整&#xff0c;怕面试官考的问题回答不上了&#xff0c;所以今天为大家准备了嵌入式工程师面试经常遇到的30个经典问题&#xff0c;希望可以帮助大家提前准备&#xff0c;不再惧怕面试。 1&a…

C++ 自定义数据类型

C自定义数据类型有&#xff1a;枚举类型、结构类型、联合类型、数组类型、类类型 1. typedef 声明 在编写程序时&#xff0c;除了可以使用内置的基本数据类型名和自定义的数据类型名以外&#xff0c;还可以为一个已有的数据类型另外命名。这样&#xff0c;就可以根据不同的应…

《MySQL》第十三篇 SELECT * 和 SELECT 字段名的区别

在实际开发中&#xff0c;进行数据查询的SQL无非有两种写法&#xff0c;使用SELECT * from tableName或者SELECT 字段名(多个) from tableName&#xff0c;二者各有利弊 SELECT * 写法 优点&#xff1a; 写法简单&#xff0c;不需要手动输入具体的字段&#xff0c;一定程度上…

【【萌新的stm32学习-2】】

萌新的stm32学习-2 STM32 启动模式 可以通过BOOT0和BOOT1 引脚设置启动模式 BOOT1 BOOT0 X 0 启动模式 主闪存存储器 0 1 系统存储器 1 1 选择 内置SRAM&#xff08;少&#xff09; 我们使用串口给 STM32 下载程序&#xff0c;但是串口下载并不能仿真调试代码&#xff0c;只…

程序员做项目必用的工具【更新中...】

每个程序员多多少少都会有自己简化项目的小工具&#xff0c;我采访了我们公司所有的工程师总结了程序员必备工具篇。 一.unisms 官网&#xff1a;https://unisms.apistd.com/ 不会有人这年头写注册登录还是自己写验证码模块吧&#xff1f; 你该得拥有一个短信验证码平台了&…

【雕爷学编程】MicroPython动手做(24)——掌控板之拓展掌控宝2

掌控拓展板(parrot)是掌控板衍生的一款体积小巧、易于携带的拓展板。支持电机驱动、语音播放、语音合成等功能的IO引脚扩展板,可扩展12路IO接口和2路I2C接口。 技术参数 该板具有以下特性: 两路DC马达驱动,单路电流150mA 支持音频功放和喇叭输出(掌控板P8&#xff0c;P9引脚…

不可错过的家装服务预约小程序商城开发指南

在当今社会&#xff0c;家装行业发展迅速&#xff0c;越来越多的人开始寻求专业的家装预约和咨询服务。对于不懂技术的新手来说&#xff0c;创建一个自己的家装预约咨询平台可能听起来很困难&#xff0c;但实际上通过一些第三方制作平台和工具&#xff0c;这个过程可以变得简单…

网络安全学习笔记——burp和SqlMap的tips

一、Burp 爆破 1、Burp爆账号密码 burp爆破的前提条件——该网站账号密码没有进行加密而是明文&#xff0c;且验证码可以重复使用&#xff0c;如下图数据包中直接显示账号与密码且验证码不需要重复提交&#xff08;此处需要自己使用burp进行测试&#xff09; 1、进入burp&am…

生态伙伴 | 华秋硬创联合长虹创投,共同打造更优生态系统

01大赛介绍 中国硬件创新创客大赛始于2015年&#xff0c;由深圳华秋电子有限公司主办&#xff0c;至今已经成功举办八届&#xff0c;赛事范围覆盖华南、华东、华北三大地区&#xff0c;超10个省市区域。 大赛影响了超过45万工程师群体&#xff0c;吸引了35000多名硬创先锋报名参…

Android 之 TelephonyManager (电话管理器)

本节引言&#xff1a; 本章节是Android基础入门教程的最后一章&#xff0c;主要讲解是一些零零散散的一些知识点&#xff0c;以及一些遗漏 知识点的补充&#xff0c;这些零散的知识点包括&#xff0c;各种系统服务的使用&#xff0c;比如本节的电话管理器&#xff0c;短信管理器…

ALLEGRO之Place

本文主要讲述了ALLEGRO的Place菜单。 &#xff08;1&#xff09;Manually&#xff1a;手动放置&#xff0c;常用元器件放置方法&#xff1b; &#xff08;2&#xff09;Quickplace&#xff1a;快速放置&#xff1b; &#xff08;3&#xff09;Autoplace&#xff1a;自动放置&a…

ARM裸机-9

1、ARM汇编指令集 1.1、两个概念&#xff1a;指令与伪指令 (汇编) 指令是CPU机器指令的助记符&#xff0c;经过编译后会得到一串10组成的机器码&#xff0c;可以由CPU读取执行。 (汇编)伪指令本质上不是指令 (只是和指令一起写在代码中)&#xff0c;它是编译器环境提供的&…

最新版CleanMyMac X4.14.1苹果电脑系统数据清理工具

最新版CleanMyMac X 让您的Mac焕然一新&#xff0c;时刻保持安全CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff…