hashmap中红黑树/SDK开发中的混淆问题/原生夜间模式UIModeManager中的setNightModeActivated方法无法调用

1、hashmap中红黑树,问什么要退化成链表

HashMap当元素超过一定阈值的时候,会从链表变成红黑树。又会在链表元素数目小于6的时候退化成链表。请问 退化成链表的作用是什么?

问题正解:

当对hashMap扩容时,会调用resize方法,resize会以桶(一个哈希表下标下所有元素)为单位,把元素转移到新哈希表中, 当桶为红黑树时,会调用split方法进行红黑树的扩容移动处理。

split方法中会出现红黑树退化为链表情况(整个hashMap中也只有这个方法会出现红黑树退化为链表的情况)。

split方法中,将当前红黑树分割放入lo,hi这两个变量(treeNode类型)里。可以先理解为两条链表。当lo链表中元素<=6,会将lo转换为真正的链表(Node类型),当lo链表中元素>6,则会进行树化处理, 例如对链表中节点的left,right等进行赋值,hi树同理

但是数目小于6的时候,链表更适合,速率更发挥的高效。

2、SDK开发中的混淆问题

在SDK开发中,有用到自定义混淆:

proguard-rules.pro

-obfuscationdictionary src/main/assets/specail-mix.txt

-classobfuscationdictionary src/main/assets/specail-mix.txt

-packageobfuscationdictionary src/main/assets/specail-mix.txt

打包出来的aar包被接入后在debug运行的没问题,但是在release混淆打包中出现了错误:

java.nio.file.NoSuchFileException: C:\Users\LENOVO.gradle\caches\transforms-2\files-2.1\660bd89568480336b31ad37512c02769\xxx\src\main\assets\specail-mix.txt

感觉大概的意思是在app编译时找不到aar里的混淆文件?但是aar包里面是有混淆文件的(assets\specail-mix.txt),但是没有src路径

如何让gradle在app混淆打包中找到aar包中的混淆文件 成功打包?

问题正解:

library模块的混淆是配置在 consumerProguardFiles "consumer-rules.pro"。

app依赖library,library会把consumer-rules.pro传递给app。app使用consumer-rules.pro+自己的proguard-rules.pro 形成最终的混淆配置。

在consumer-rules.pro写上

-obfuscationdictionary src/main/assets/specail-mix.txt

-classobfuscationdictionary src/main/assets/specail-mix.txt

-packageobfuscationdictionary src/main/assets/specail-mix.txt

会从library里的build\intermediates\consumer_proguard_dir\release\lib0中去找 src/main/assets/specail-mix.txt。

没有的话则会报错。

如果specail-mix.txt是写在library的src/main/assets目录下,则需要在consumer-rules.pro配置的内容为:

-obfuscationdictionary .../.../.../.../.../src/main/assets/specail-mix.txt

-classobfuscationdictionary .../.../.../.../.../src/main/assets/specail-mix.txt

-packageobfuscationdictionary .../.../.../.../.../src/main/assets/specail-mix.txt

3、原生夜间模式UIModeManager中的setNightModeActivated方法无法调用

项目需要使用android的原生夜间模式,在aosp的setting中夜间模式开关是使用 mUiModeManager.setNightModeActivated(!active)来开启的,但是搬到自己的代码里面这个方法会爆红找不到该方法,但源码里面这个方法是公开的,也没有@sysetmapi修饰,请问该怎样才能调用?

问题正解:

通过查看发现setNightModeActivated方法为API29 之后新增方法,以@Hide注解修饰的非公开方法。另外通过查看源码发现其需要两个未开放的权限才能调用:MODIFY_DAY_NIGHT_MODE与INTERACT_ACROSS_USERS。

其实思考就知道,系统不会开放这种API给开发者,这个API改变的是整个设备的模式,顶多开放修改你自己应用的模式哦,比如setApplicationNightMode。而低版本没有夜间模式,因此建议使用兼容包AppCompatActivity的getDelegate().setLocalNightMode方式设置

日常水日常开心~今日分享到此结束,对你有帮助的话,点个赞再走呗,每日一个面试小技巧
关注公众号:Android老皮

解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

相关推荐
Digitally23 分钟前
比较 iPhone:全面比较 iPhone 17 系列
android·ios·iphone
被开发耽误的大厨28 分钟前
鸿蒙项目篇-22-项目功能结构说明-写子页面和导航页面
android·华为·harmonyos·鸿蒙
月阳羊1 小时前
【硬件-笔试面试题-93】硬件/电子工程师,笔试面试题(知识点:波特图)
java·经验分享·单片机·嵌入式硬件·面试
wheeldown1 小时前
【Linux】面试常考!Linux 进程核心考点:写时拷贝优化原理 + 进程等待实战,一篇理清进程一生
linux·运维·服务器·面试·php
安然~~~1 小时前
mysql多表联查
android·数据库·mysql
2501_915909065 小时前
HTTPS 错误解析,常见 HTTPS 抓包失败、443 端口错误与 iOS 抓包调试全攻略
android·网络协议·ios·小程序·https·uni-app·iphone
程序猿陌名!7 小时前
Android开发 AlarmManager set() 方法与WiFi忘记连接问题分析
android
骐骥19 小时前
2025-09-08升级问题记录: 升级SDK从Android11到Android12
android·android12·sdk31
青鱼入云9 小时前
【面试场景题】电商订单系统分库分表方案设计
大数据·面试·职场和发展
程序员三藏9 小时前
2025最新的软件测试面试八股文(800+道题)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展