本文不是正经技能文,仅仅一次探究的进程,如题。
省流版:大约率是纯 Jetpack Compose 做的 UI,各项技能栈十分新。
如果你对如何得出这个定论的进程比较好奇,欢迎点进来读一读。
前语
这两天在 B 站刷视频,看到了 ChatGPT 新出的语音对话(如:炸裂更新!亲测GPT4语音交互,几十门语言都到达母语水平,外语老师风险了),十分惊叹。不得不说,OpenAI 不出手则已,一出手则一鸣惊人。那我作为一个 Android 学习者,却也不免想到了一个其他问题:作为新的 App,ChatGPT 的 Android 端是用什么写的呢?
装置试一下
ChatGPT Android 版现在能够在 Google 商店直接下载,这需求 Google 服务的支持。部分 Android 设备自带的有(比方小米,能够在设置里,查找“谷歌”或许“Google”找到对应项开启)。当然,运用 GP 需求你有一个外区的 Google 账号,详细细节略过不谈。查找 ChatGPT,排名榜首的便是
下载完结后点击翻开,登录你的账号即可。如果出现
Something went wrong. Please make sure your device has the latest version of Google Play.
就去 ApkPure 下载一个最新的 下载Google Play Store (有必要的话,再加上 下载Google Play服务),就能顺利登陆了。
详细运用不是重点,直接略过。接下来测验看看本篇的主题吧
一些依靠
运用 LibChecker 检查此运用的根本信息,如下:
根本信息 | Activity |
---|---|
一些要害的依靠如下:
- Kotlin 1.9.10
- AGP 8.1.1
- Jetpack Compose 1.5.1
- compileSdk 34
- targetSdk 33
这个依靠版本能够说十分之新了,我相信读者如果是 Android 开发,所经手的 Android 项目根本没有能到达这种簇新程度的(如果有的话,也能够在评论区提一嘴,让我也震动一下)。
App 的要害 Activity 只有两个,一个 MainActivity 承载了各种页面;另一个 VoiceModeActivity 应该便是上面视频里演示的语音模式。其实到这儿,现已能够很大程度的猜测,这个运用是 Compose 运用了。不过单靠猜必定不够,接下来咱们继续探究一下
检查页面布局
东芝写的 “开发者帮手”(这儿本来有个链接的,但它在酷安被下架了,我也找不到了)里有一个“界面布局剖析”的功用。能够看到每个 Widget 的根本信息。翻开之后能够经过 Slider 或许音量键挑选指定控件
尽管不能协助直接获取到是否是由 Compose 编写的,但它能额外提供一些信息。比方,如果咱们聚集到一个文本上,你会发现这个文本是没有 ID 的
很显然,在传统 View 系统中,根本上都是经过 ID 找到对应控件,然后进行各种操作的。而类似于 Jetpack Compose 这种结构则是直接改动对应 State,以触发对应 UI 更新,因而不需求 ID。到这儿,咱们就进一步确定了。
另一个能够佐证的部分是,当挑选的控件是整个列表时,此处显现的类依然仅仅 View
,而非 RecyclerView
或许 ListView
。这是因为,在 Jetpack Compose 中,显现列表用的是 LazyList
,例如,一个对话列表的代码可能是:
@Composable
fun ChatList() {
LazyColumn {
items(chatList) {
if (it.sendByMe) SendByMeItem(it)
else SendByBotItem(it)
}
}
}
简练。轻快。
当然,这样依然有问题,比方“开发者帮手”的这个功用在某些场景下是工作不正常的,找不到对应 ID。所以接下来咱们试着看看代码
反编译代码
经过 MT管理器 提取出 apks 文件,再进一步解压获得 apk 文件,咱们就能够测验对它反编译。这儿有很多工具链能够选,比方手机端的 MT管理器自己(需求 VIP)、NP管理器(旧版免费、新版收费);PC 端的 ApkTool + dex2jar + jd-gui 三件套,或许 JADX 等。为了便利,在这儿咱们挑选 JADX 一键完结。下载 Releases skylot/jadx 后拖动 Apk 进去,等候即可
完结反编译后,咱们能够查找找到 MainActivity
和 VoiceModeActivity
,发现两个的代码都很简略,戋戋几十行。尽管代码混淆了导致反编译出来很难看懂,但共同点是,它们都调用了 j.a
办法。
检查此办法的详细代码,一个了解的字眼映入眼帘:Composition
!而它是 Jetpack Compose 中的重要概念。从这个办法的代码也能够确定,j.a
办法实际上是 ComponentActivity.setContent(content: @Composable () -> Unit)
拓展函数,它是 Jetpack Compose 在 Android 渠道的入口~
顺带一提,这个办法原始长这样:
public fun ComponentActivity.setContent(
parent: CompositionContext? = null,
content: @Composable () -> Unit
) {
val existingComposeView = window.decorView
.findViewById<ViewGroup>(android.R.id.content)
.getChildAt(0) as? ComposeView
if (existingComposeView != null) with(existingComposeView) {
setParentCompositionContext(parent)
setContent(content)
} else ComposeView(this).apply {
// Set content and parent **before** setContentView
// to have ComposeView create the composition on attach
setParentCompositionContext(parent)
setContent(content)
// Set the view tree owners before setting the content view so that the inflation process
// and attach listeners will see them already present
setOwners()
setContentView(this, DefaultActivityContentLayoutParams)
}
}
到此结束!这便是文章开始的定论来历,咱们根本能够必定,此 App 是用 Jetpack Compose 完结的 UI 部分。
其他细节
其实仅看 UI ,我也根本确定了这是 Jetpack Compose 写的。比方,它的菜单背景色是 Material You 中的颜色(而不是纯白)。
因为 Jetpack Compose 的 material3 系列控件是在 Material You 设计标准出了之后才逐步完善起来的,因而它从诞生之日起就遵从着相应标准,在很多细节上有比较好的诠释。我自己的开源运用 译站 也是用的 Compose + MY,因而翻开运用就感觉对味儿了。
做个比照
同样是新运用,而且都是新的 AI 运用,文章的最后咱们不妨挑一个其他比照一下。咱们这儿挑选了文心一言
叠甲:挑选文心一言并不出于任何其他原因考量,单纯因为我本机上装置的有。自己下列的陈说仅从技能角度出发,仅作为技能交流和学习运用。自己无任何歹意贬低、曲解之意。
同样是 LibChecker ,咱们来看看文心一言的状况
根本 | Activity |
---|---|
作为比照仍是很有意思的,尽管是新项目,但能感受到很多历史沉积的气息。唯二被标注的分别是 Kotlin 1.6.21
和 RxAndroid 1
。它直接包括 61 项 Native Libraries,Activity 更是到达了 330 个之多(尽管绝大部分都是为了插件化和动态能力预留的)。当然也要指出,文心的功用比 ChatGPT Android 多很多,比方社区、发现版块,比方语音朗诵答复,比方自定义人物等。
结束
本文大约展示了一些技能,可能能够用来判定一个 App 的部分技能栈。除此之外也从旁边面答复一个很多人疑问:Jetpack Compose 真的有人用吗?事实是,有。不过大多数集中在国外。举个栗子,除了本文提到的,最近对标 X 的 Threads 也是基于 Jetpack Compose 构建的,国内的不少公司也有相关探究。
Compose 有什么长处?实话说,只需你上手写过,就能感受到它的简练;那有缺点吗?不得不承认,有。一是对各项依靠较为严苛的要求(AGP、Gradle、Kotlin、乃至 AS 都要是比较新的版本),在十分旧的项目中集成有必定难度;二是功能现在依然有差距。这也是 Compose 团队一直在测验攻克的点,而比较开始的 1.0,其实现已有很大进步。总的来说,仍是能够期待一下的。
学习 Compose -> Compose 中文社区文档:compose.funnysaltyfish.fun/ 或 官方文档:developer.android.google.cn/jetpack/com…