Soong 构建系统原理
Soong 构建系统原理非常好的问题!我们来深入解析 AOSP 的 Soong 构建系统,它的编译原理、设计思想以及与传统构建系统的区别。 🌟 一句话总结 Soong 是 Google 为 AOSP 量身打造的下一代构建系统,它使用 Go 语言编写,基于 Ninja 构建引擎,通过 Android.bp 文件描述模块依赖和构建规则,目标是替代旧的 Make 系统(Android.mk),实现更快、更清晰、更可维护的系统级编译。 🔧 Soong 的核心组成 组件 作用 soong_ui 用户接口,替代 make,调用 soong_build soong_build (Go) Soong 的核心逻辑,解析 Android.bp Blueprint Soong 的底层框架(由 Google 开发),用于解析 .bp 文件 Android.bp 构建配置文件(类似 JSON 的语法) Ninja 实际执行编译命令的底层引擎 Kati 将旧的 Android.mk 转成 Ninja 规则(兼容层) 🔄 Soong 的编译流程(原理详解)✅ 阶段...
Kotlin语法糖
Kotlin语法糖Kotlin 是一种现代编程语言,它引入了许多语法糖和特性,旨在提高代码的简洁性和可读性。以下是一些 Kotlin 中常用的语法糖和特性: 1. 数据类(Data Classes)Kotlin 的数据类自动生成常见的方法,如 equals(), hashCode(), toString(), copy() 等。 1data class User(val name: String, val age: Int) 2. 属性委托(Property Delegates)属性委托允许你将属性的 getter 和 setter 代理给另一个对象。 12345class User { var name: String by Delegates.observable("John Doe") { prop, old, new -> println("$old -> $new") }} 3. 智能转换(Smart Casts)Kotlin 的智能转换允许你在类型...
ip定位
1、自有搭建IP 定位框架 GeoIP2 for Java:https://blog.csdn.net/GodSuzzZ/article/details/108095385官网:https://www.maxmind.com/en/geoip2-services-and-databasespy:https://pypi.org/project/geoip2/#description 2、免费转接寻找免费获取ip信息站点经过我们自己服务转一下https://ipapi.co/218.104.82.74/json 3、付费接口https://timezoneapi.io/api/ip/?token=aeLjNqtdVzUgQeiYumTC
图片下载及保存
图片下载及保存 确定文件的下载路径,context.getExternalFilesDir(“images”),即app外部存储的files路径,无须动态权限声明 创建URL对象,val url = URL(path),由图片的下载地址创建 通过url.openConnection()打开连接,获取连接对象 连接conn.connect() 获取输入流,val input: InputStream = conn.getInputStream() 创建输出流,准备写入val fos = FileOutputStream(out) 标准io操作,将读到的字节写入到文件中 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253try { val buf = ByteArray(1024) var numRead: Int fos.run { while ((inpu...
国内镜像地址
国内镜像地址1234567891011121314151617181920buildscript { repositories { maven { url 'https://mirrors.huaweicloud.com/repository/maven/' } maven { url 'https://maven.aliyun.com/repository/public/' } }}allprojects{ repositories { maven { url 'https://mirrors.huaweicloud.com/repository/maven/' } maven { url 'https://maven.aliyun.com/repository/public/' } }}
Retrofit面试问题
Retrofit面试问题介绍下Retrofit框架,Retrofit为什么要包装okhttp呢? Retrofit 是一个类型安全的HTTP客户端,用于Android和Java应用。它允许你通过定义接口来描述HTTP请求,包括URL、请求方法(GET, POST等)、请求头以及请求体等内容。 Retrofit 包装了 OkHttp 主要是为了提供更高级别的抽象,简化网络请求的配置与执行。OkHttp 是一个高效的HTTP客户端,而 Retrofit 在其基础上提供了对REST API更加友好的支持,如动态代理、注解配置请求、数据转换等。 Retrofit主要实现机制?Retrofit的作用、原理 Retrofit 的核心是使用动态代理来创建接口的实现类,将HTTP请求的方法调用转化为实际的网络请求。它的作用是让开发者以一种声明式的方式来定义网络请求,并且可以很容易地进行扩展和修改。 底层是如何用 OkHttp 请求的? 在底层,Retrofit 使用 OkHttp 发送网络请求。当你构建了一个 Retrofit 实例时,你可以为其指定一个 OkHttpClient 对象,这样...
core-ktx及appcompat是什么
core-ktx及appcompat是什么core-ktx是Android官方发布的一个Kotlin扩展库,主要提供了对Android原生API的Kotlin语言扩展和优化。 core-ktx的主要作用包括: 为Android原生API提供了惯用的Kotlin语法扩展,使代码更简洁。比如View.show()隐藏了findViewById。 提供了一些Kotlin特有的语言功能来优化Android API,如空安全、高阶函数等。 加入了一些Kotlin协程相关的扩展,可以更方便地使用协程。 提供了部分标准库函数的扩展,如集合相关的扩展函数。 简化了资源访问,避免重复代码。 支持了一些Kotlin版本更新带来的新特性。 向下兼容旧版本Android API。 总之,使用core-ktx可以写出更优雅简洁的Android代码,提高开发效率。它降低了从Java转换到Kotlin的学习成本,是一个非常值得引入的库。主流的Android项目基本上都会依赖该扩展库。 appcompat是AndroidX中的一个重要支持库,它主要提供了向后兼容旧版Android系统的功能。...
VideoView视频播放
VideoView视频播放123456789101112131415val videoView = findViewById<VideoView>(R.id.videoView)val videoUri = Uri.parse("android.resource://$packageName/${R.raw.my_video}")videoView.setVideoURI(videoUri)// 添加播放控制val mediaController = MediaController(this)videoView.mediaController = mediaControllermediaController.setAnchorView(videoView)// 循环播放videoView.setOnCompletionListener { videoView.start()}videoView.start()
创建前台服务通知
创建前台服务通知ANR(Application Not Responding) 错误,是 Android 系统中一个典型的 前台服务启动违规 问题。具体错误信息如下: 12Reason: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{... com.hansong.orion.sipclient/.service.SipAidlService} 🔍 问题原因从 Android 8.0(API 级别 26)开始,Google 对 前台服务(Foreground Service) 的使用做了严格限制: 如果你通过 Context.startForegroundService() 启动一个服务, 那么该服务 必须在 5 秒内 调用 startForeground(int id, Notification notification), 否则系统会抛出 ANR,并可能杀死你的应用。 你的 SipAidlService 被通过...
列表匹配
列表匹配12345calendarEvent?.userList?.let { list -> // 先转成map,时间复杂度从 O(n×m) 降到 O(n + m),性能更好 val relatedUserMap = users.associateBy { it.uid } mAdapter.setNewInstance(list.mapNotNull { relatedUserMap[it.uid] }.toMutableList())}




