Android系统架构开篇(深度解析)(android的系统架构中包含有哪几层?分别有什么作用?)
ccwgpt 2024-10-11 11:11 26 浏览 0 评论
阅读前请点击右上角“关注”,每天免费获取Android知识解析及面试解答。Android架构解析,只做职场干货,完全免费分享!
原文作者:Gityuan
一、引言
本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制。虽然Android系统非常庞大且错综复杂,需要具备全面的技术栈,但整体架构设计清晰。Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、框架层组成,通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。
为了能让大家整体上大致了解Android系统涉及的知识层面,先来看一张Google官方提供的经典分层架构图,从下往上依次分为Linux内核、HAL、系统Native库和Android运行时环境、Java框架层以及应用层这5层架构,其中每一层都包含大量的子模块或子系统。
上图采用静态分层方式的架构划分,众所周知,程序代码是死的,系统运转是活的,各模块代码运行在不同的进程(线程)中,相互之间进行着各种错综复杂的信息传递与交互流,从这个角度来说此图并没能体现Android整个系统的内部架构、运行机理,以及各个模块之间是如何衔接与配合工作的。为了更深入地掌握Android整个架构思想以及各个模块在Android系统所处的地位与价值,计划以Android系统启动过程为主线,以进程的视角来诠释Android M系统全貌,全方位的深度剖析各个模块功能,争取各个击破。这样才能犹如庖丁解牛,解决、分析问题则能游刃有余。
二、Android架构
Google提供的5层架构图很经典,但为了更进一步透视Android系统架构,本文更多的是以进程的视角,以分层的架构来诠释Android系统的全貌,阐述Android内部的环环相扣的内在联系。
系统启动架构图
图解: Android系统启动过程由上图从下往上的一个过程是由Boot Loader引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App,接来下简要说说每个过程:
关于Loader层:
- Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在ROM里的预设代码开始执行,然后加载引导程序到RAM;
- Boot Loader:这是启动Android系统之前的引导程序,主要是检查RAM,初始化硬件参数等功能。
2.1 Linux内核层
Android平台的基础是Linux内核,比如ART虚拟机最终调用底层Linux内核来执行功能。Linux内核的安全机制为Android提供相应的保障,也允许设备制造商为内核开发硬件驱动程序。
- 启动Kernel的swapper进程(pid=0):该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作;
- 启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。kthreadd进程是所有内核进程的鼻祖。
2.2 硬件抽象层 (HAL)
硬件抽象层 (HAL) 提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。
2.3 Android Runtime & 系统库
每个应用都在其自己的进程中运行,都有自己的虚拟机实例。ART通过执行DEX文件可在设备运行多个虚拟机,DEX文件是一种专为Android设计的字节码格式文件,经过优化,使用内存很少。ART主要功能包括:预先(AOT)和即时(JIT)编译,优化的垃圾回收(GC),以及调试相关的支持。
这里的Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进程的鼻祖。
- init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;
- init进程还启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务
- init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程),Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来的。
2.4 Framework层
- Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:
- 加载ZygoteInit类,注册Zygote Socket服务端套接字
- 加载虚拟机
- 提前加载类preloadClasses
- 提前加载资源preloadResouces
- System Server进程,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务。
- Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。
2.5 App层
- Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;
- Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。
- 所有的App进程都是由Zygote进程fork生成的。
2.6 Syscall && JNI
- Native与Kernel之间有一层系统调用(SysCall)层,见Linux系统调用(Syscall)原理;
- Java层与Native(C/C++)层之间的纽带JNI,见Android JNI原理分析。
三、通信方式
无论是Android系统,还是各种Linux衍生系统,各个组件、模块往往运行在各种不同的进程和线程内,这里就必然涉及进程/线程之间的通信。对于IPC(Inter-Process Communication, 进程间通信),Linux现有管道、消息队列、共享内存、套接字、信号量、信号这些IPC机制,Android额外还有Binder IPC机制,Android OS中的Zygote进程的IPC采用的是Socket机制,在上层system server、media server以及上层App之间更多的是采用Binder IPC方式来完成跨进程间的通信。对于Android上层架构中,很多时候是在同一个进程的线程之间需要相互通信,例如同一个进程的主线程与工作线程之间的通信,往往采用的Handler消息机制。
想深入理解Android内核层架构,必须先深入理解Linux现有的IPC机制;对于Android上层架构,则最常用的通信方式是Binder、Socket、Handler,当然也有少量其他的IPC方式,比如杀进程Process.killProcess()采用的是signal方式。下面说说Binder、Socket、Handler:
3.1 Binder
Binder作为Android系统提供的一种IPC机制,无论从系统开发还是应用开发,都是Android系统中最重要的组成,也是最难理解的一块知识点,想了解为什么Android要采用Binder作为IPC机制?可查看我在知乎上的回答。深入了解Binder机制,最好的方法便是阅读源码,借用Linux鼻祖Linus Torvalds曾说过的一句话:Read The Fucking Source Code。下面简要说说Binder IPC原理。
Binder IPC原理
Binder通信采用c/s架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其中ServiceManager用于管理系统中的各种服务。
- 想进一步了解Binder,可查看Binder系列—开篇,Binder系列花费了13篇文章的篇幅,从源码角度出发来讲述Driver、Native、Framework、App四个层面的整个完整流程。根据有些读者反馈这个系列还是不好理解,这个binder涉及的层次跨度比较大,知识量比较广,建议大家先知道binder是用于进程间通信,有个大致概念就可以先去学习系统基本知识,等后面有一定功力再进一步深入研究Binder机制。
Binder原理篇
- Binder系列-开篇 - Gityuan博客 | 袁辉辉的Android博客
- Binder系列3-启动ServiceManager - Gityuan博客 | 袁辉辉的Android博客
- Binder系列4-获取ServiceManager - Gityuan博客 | 袁辉辉的Android博客
- Binder系列5-注册服务(addService) - Gityuan博客 | 袁辉辉的Android博客
- Binder系列6-获取服务(getService) - Gityuan博客 | 袁辉辉的Android博客
- Binder系列7-framework层分析 - Gityuan博客 | 袁辉辉的Android博客
- 进程的Binder线程池工作过程 - Gityuan博客 | 袁辉辉的Android博客
- 彻底理解Android Binder通信架构
- Binder系列10-总结 - Gityuan博客 | 袁辉辉的Android博客
- Binder IPC的权限控制 - Gityuan博客 | 袁辉辉的Android博客
- Binder死亡通知机制之linkToDeath - Gityuan博客 | 袁辉辉的Android博客
Binder驱动篇:
- Binder系列1-Binder Driver初探
- Binder系列2-Binder Driver再探
Binder使用篇:
- Binder系列8-如何使用Binder - Gityuan博客 | 袁辉辉的Android博客
- Binder系列9-如何使用AIDL - Gityuan博客 | 袁辉辉的Android博客
3.2 Socket
Socket通信方式也是C/S架构,比Binder简单很多。在Android系统中采用Socket通信方式的主要有:
- zygote:用于孵化进程,system_server创建进程是通过socket向zygote进程发起请求;
- installd:用于安装App的守护进程,上层PackageManagerService很多实现最终都是交给它来完成;
- lmkd:lowmemorykiller的守护进程,Java层的LowMemoryKiller最终都是由lmkd来完成;
- adbd:这个也不用说,用于服务adb;
- logcatd:这个不用说,用于服务logcat;
- vold:即volume Daemon,是存储类的守护进程,用于负责如USB、Sdcard等存储设备的事件处理。
等等还有很多,这里不一一列举,Socket方式更多的用于Android framework层与native层之间的通信。Socket通信方式相对于binder比较简单,这里省略。
3.3 Handler
Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信,Handler消息机制是由一组MessageQueue、Message、Looper、Handler共同组成的,为了方便且称之为Handler消息机制。
有人可能会疑惑,为何Binder/Socket用于进程间通信,能否用于线程间通信呢?答案是肯定,对于两个具有独立地址空间的进程通信都可以,当然也能用于共享内存空间的两个线程间通信,这就好比杀鸡用牛刀。接着可能还有人会疑惑,那handler消息机制能否用于进程间通信?答案是不能,Handler只能用于共享内存地址空间的两个线程间通信,即同进程的两个线程间通信。很多时候,Handler是工作线程向UI主线程发送消息,即App应用中只有主线程能更新UI,其他工作线程往往是完成相应工作后,通过Handler告知主线程需要做出相应地UI更新操作,Handler分发相应的消息给UI主线程去完成,如下图:
由于工作线程与主线程共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程与主线程都能直接使用该对象,只需要注意多线程的同步问题。工作线程通过mHandler向其成员变量MessageQueue中添加新Message,主线程一直处于loop()方法内,当收到新的Message时按照一定规则分发给相应的handleMessage()方法来处理。所以说,Handler消息机制用于同进程的线程间通信,其核心是线程间共享内存空间,而不同进程拥有不同的地址空间,也就不能用handler来实现进程间通信。
上图只是Handler消息机制的一种处理流程,是不是只能工作线程向UI主线程发消息呢,其实不然,可以是UI线程向工作线程发送消息,也可以是多个工作线程之间通过handler发送消息。更多关于Handler消息机制文章:
- Android消息机制-Handler(framework篇)
- Android消息机制-Handler(native篇)
- Android消息机制3-Handler(实战)
要理解framework层源码,掌握这3种基本的进程/线程间通信方式是非常有必要,当然Linux还有不少其他的IPC机制,比如共享内存、信号、信号量,在源码中也有体现,如果想全面彻底地掌握Android系统,还是需要对每一种IPC机制都有所了解。
四、核心提纲
博主对于Android从系统底层一路到上层都有自己的理解和沉淀,通过前面对系统启动的介绍,相信大家对Android系统有了一个整体观。接下来需抓核心、理思路,争取各个击破。后续将持续更新和完善整个大纲,不限于进程、内存、IO、系统服务架构以及分析实战等文章。
当然本站有一些文章没来得及进一步加工,有时间根据大家的反馈,不断修正和完善所有文章,争取给文章,再进一步精简非核心代码,增加可视化图表以及文字的结论性分析。基于Android 6.0的源码,专注于分享Android系统原理、架构分析的原创文章。
建议阅读群体: 适合于正从事或者有兴趣研究Android系统的工程师或者技术爱好者,也适合Android App高级工程师;对于尚未入门或者刚入门的App工程师阅读可能会有点困难,建议先阅读更基础的资料,再来阅读本站博客。
看到Android整个系统架构是如此庞大的, 该问如何学习Android系统, 以下是我自己的Android的学习和研究论,仅供参考如何自学Android。
从整理上来列举一下Android系统的核心知识点概览:
4.1 系统启动系列
Android系统启动-概述: Android系统中极其重要进程:init, zygote, system_server, servicemanager 进程:
- Android系统启动-Init篇 - Gityuan博客 | 袁辉辉的Android博客
- Android系统启动-zygote篇 - Gityuan博客 | 袁辉辉的Android博客
- Android系统启动-SystemServer上篇 - Gityuan博客 | 袁辉辉的Android博客
- Android系统启动-SystemServer下篇 - Gityuan博客 | 袁辉辉的Android博客
- Binder系列3-启动ServiceManager - Gityuan博客 | 袁辉辉的Android博客
- 理解Android进程创建流程 - Gityuan博客 | 袁辉辉的Android博客
再来看看守护进程(也就是进程名一般以d为后缀,比如logd,此处d是指daemon的简称), 下面介绍部分守护进程:
- debuggerd
- installd
- lmkd
- logd
4.2 系统稳定性系列
Android系统稳定性主要是异常崩溃(crash)和执行超时(timeout),:
- 理解Android ANR的触发原理
- Input系统-ANR原理分析 - Gityuan博客 | 袁辉辉的Android博客
- 理解Android ANR的信息收集过程
- 解读Java进程的Trace文件 - Gityuan博客 | 袁辉辉的Android博客
- Native进程之Trace原理 - Gityuan博客 | 袁辉辉的Android博客
- WatchDog工作原理 - Gityuan博客 | 袁辉辉的Android博客
- 理解Android Crash处理流程
- 理解Native Crash处理流程
- global reference限制策略
4.3 Android进程系列
进程/线程是操作系统的魂,各种服务、组件、子系统都是依附于具体的进程实体。深入理解进程机制对于掌握Android系统整体架构和运转机制是非常有必要的,是系统工程师的基本功,下面列举进程相关的文章:
- 理解Android进程创建流程 - Gityuan博客 | 袁辉辉的Android博客
- 理解杀进程的实现原理 - Gityuan博客 | 袁辉辉的Android博客
- Android四大组件与进程启动的关系 - Gityuan博客 | 袁辉辉的Android博客
- Android进程绝杀技--forceStop - Gityuan博客 | 袁辉辉的Android博客
- 理解Android线程创建流程 - Gityuan博客 | 袁辉辉的Android博客
- 彻底理解Android Binder通信架构
- 进程的Binder线程池工作过程 - Gityuan博客 | 袁辉辉的Android博客
- Android进程生命周期与ADJ - Gityuan博客 | 袁辉辉的Android博客
- Android LowMemoryKiller原理分析
- 进程优先级 - Gityuan博客 | 袁辉辉的Android博客
- Android进程调度之adj算法 - Gityuan博客 | 袁辉辉的Android博客
- 进程篇-进程整理 - Gityuan博客 | 袁辉辉的Android博客
4.4 四大组件系列
对于App来说,Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider最为核心,接下分别展开介绍:
- startActivity启动过程分析 - Gityuan博客 | 袁辉辉的Android博客
- 简述Activity生命周期 - Gityuan博客 | 袁辉辉的Android博客
- startService启动过程分析 - Gityuan博客 | 袁辉辉的Android博客
- bindService启动过程分析 - Gityuan博客 | 袁辉辉的Android博客
- 彻底理解Android Binder通信架构
- Android Broadcast广播机制分析
- 理解ContentProvider原理 - Gityuan博客 | 袁辉辉的Android博客
- ContentProvider引用计数 - Gityuan博客 | 袁辉辉的Android博客
- Activity与Service生命周期 - Gityuan博客 | 袁辉辉的Android博客
- 简述Activity与Window关系 - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之综述 - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之ServiceRecord - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之BroadcastRecord - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之ContentProviderRecord - Gityuan博客 | 袁辉辉的Android博客
- 理解Android Context
- 理解Application创建过程 - Gityuan博客 | 袁辉辉的Android博客
- unbindService流程分析 - Gityuan博客 | 袁辉辉的Android博客
- 四大组件之ActivityRecord - Gityuan博客 | 袁辉辉的Android博客
- AMS总结(一) - Gityuan博客 | 袁辉辉的Android博客
4.5 图形系统系列
图形也是整个系统非常复杂且重要的一个系列,涉及WindowManager,SurfaceFlinger服务。
- WMS-启动过程 - Gityuan博客 | 袁辉辉的Android博客
- WMS-启动窗口(StartingWindow) - Gityuan博客 | 袁辉辉的Android博客
- 以Window视角来看startActivity - Gityuan博客 | 袁辉辉的Android博客
- Android图形系统概述 - Gityuan博客 | 袁辉辉的Android博客
- SurfaceFlinger启动篇 - Gityuan博客 | 袁辉辉的Android博客
- SurfaceFlinger绘图篇 - Gityuan博客 | 袁辉辉的Android博客
- Choreographer原理 - Gityuan博客 | 袁辉辉的Android博客
4.6 系统服务篇
再则就是在整个架构中有大量的服务,都是基于Binder来交互的,Android系统服务的注册过程也是在此之上的构建的。计划针对部分核心服务来重点分析:
- ActivityManagerService启动过程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-启动篇 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-InputReader线程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-InputDispatcher线程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-UI线程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-事件处理全过程 - Gityuan博客 | 袁辉辉的Android博客
- Input系统-ANR原理分析 - Gityuan博客 | 袁辉辉的Android博客
- http://gityuan.com/2016/11/06/packagemanagerservice)
- Installd守护进程 - Gityuan博客 | 袁辉辉的Android博客)
- 理解AlarmManager机制 - Gityuan博客 | 袁辉辉的Android博客
- 理解JobScheduler机制 - Gityuan博客 | 袁辉辉的Android博客
- Android耗电统计算法 - Gityuan博客 | 袁辉辉的Android博客
- DropBoxManager启动篇 - Gityuan博客 | 袁辉辉的Android博客
- 多用户管理UserManager - Gityuan博客 | 袁辉辉的Android博客
- 更多系统服务,敬请期待
4.7 内存&&存储篇
- 内存篇
- Android LowMemoryKiller原理分析
- Linux内存管理
- Android内存分析命令
- 存储篇
- Android存储系统之源码篇
- Android存储系统之架构篇
- Linux驱动篇
- 敬请期待
- dalvik/art
- 解读Java进程的Trace文件
4.8 工具篇
再来说说Android相关的一些常用命令和工具以及调试手段.
- 理解Android编译命令 - Gityuan博客 | 袁辉辉的Android博客
- 理解Android.bp - Gityuan博客 | 袁辉辉的Android博客
- 性能工具Systrace - Gityuan博客 | 袁辉辉的Android博客
- Android内存分析命令 - Gityuan博客 | 袁辉辉的Android博客
- ps进程命令 - Gityuan博客 | 袁辉辉的Android博客
- Am命令用法 - Gityuan博客 | 袁辉辉的Android博客
- Pm命令用法 - Gityuan博客 | 袁辉辉的Android博客
- 调试系列1:bugreport源码篇 - Gityuan博客 | 袁辉辉的Android博客
- 调试系列2:bugreport实战篇 - Gityuan博客 | 袁辉辉的Android博客
- dumpsys命令用法 - Gityuan博客 | 袁辉辉的Android博客
- Android logd日志原理
- 介绍gdb调试工具 - Gityuan博客 | 袁辉辉的Android博客
- 介绍addr2line调试命令 - Gityuan博客 | 袁辉辉的Android博客
4.9 实战篇
下面列举处理过的部分较为典型的案例,供大家参考
- Binder Driver缺陷导致定屏的案例
- 深度解读ArrayMap优势与缺陷 - Gityuan博客 | 袁辉辉的Android博客
- 数组越界导致系统重启的案例 - Gityuan博客 | 袁辉辉的Android博客
- 一行Log引发多线程并发问题的案例 - Gityuan博客 | 袁辉辉的Android博客
- 跑monkey压力测试过程的冻屏案例 - Gityuan博客 | 袁辉辉的Android博客
- 深度剖析APP保活案例 - Gityuan博客 | 袁辉辉的Android博客
五、结束语
Android系统之博大精深,包括Linux内核、Native、虚拟机、Framework,通过系统调用连通内核与用户空间,通过JNI打通用户空间的Java层和Native层,通过Binder、Socket、Handler等打通跨进程、跨线程的信息交换。只有真正阅读并理解系统核心架构的设计,解决问题和设计方案才能做到心中无剑胜有剑,才能做到知其然知其所以然。当修炼到此,恭喜你对系统有了更高一个层次的理解,正如太极剑法,忘记了所有招式,也就练成了太极剑法。
再回过头去看看那些API,看到的将不再是一行行代码、一个个接口的调用,而是各种信息的传递与交互工作,而是背后成千上万个小蝌蚪的动态执行流。记得《侠客行》里面的龙木二岛主终其一生也无法参透太玄经,石破天却短短数日练成绝世神功,究其根源是龙木二岛主以静态视角去解读太玄经,而石破天把墙壁的图案想象成无数游动的蝌蚪,最终成就绝世神功。一言以蔽之,程序代码是死的,系统运转是活的,要以动态视角去理解系统架构。
相关推荐
- 盲盒小程序背后的技术揭秘:如何打造个性化购物体验
-
在2025年的今天,盲盒小程序作为一种新兴的购物方式,正以其独特的魅力和个性化体验吸引着越来越多的消费者。这种将线上购物与盲盒概念相结合的应用,不仅为消费者带来了未知的惊喜,还通过一系列技术手段实现了...
- 小程序·云开发已支持单日亿级调用量,接口可用率高达99.99%
-
2019-10-1914:1210月19日,由腾讯云与微信小程序团队联合举办的“小程序·云开发”技术峰会在北京召开。会上,微信小程序团队相关负责人表示“小程序·云开发”系统架构已经支持每天亿级别的...
- 程序员副业开启模式:8个GitHub上可以赚钱的小程序
-
前言开源项目作者:JackonYang今天推荐的这个项目是「list-of-wechat-mini-program-list」,开源微信小程序列表的列表、有赚钱能力的小程序开源代码。这个项目分为两部分...
- 深度科普:盲盒小程序开发的底层逻辑
-
在当下的数字化浪潮中,盲盒小程序以其独特的趣味性和互动性,吸引着众多消费者的目光。无论是热衷于收集玩偶的年轻人,还是享受拆盒惊喜的上班族,都对盲盒小程序情有独钟。那么,这种备受欢迎的盲盒小程序,其开发...
- 微信小程序的制作步骤
-
SaaS小程序制作平台,作为数字化转型时代下的创新产物,不仅将易用性置于设计的核心位置,让非技术背景的用户也能轻松上手,快速制作出功能丰富、界面精美的小程序,更在性能和稳定性方面投入了大量精力,以确保...
- 携程开源--小程序构建工具,三分钟搞定
-
前言今天推荐的这个项目是「wean」,一个小程序构建打包工具。在wean之前,大量小程序工具使用webpack进行打包,各种loader、plugin导致整个开发链路变长。wean旨在解...
- 校园小程序的搭建以及营收模式校园外卖程序校园跑腿校园圈子系统
-
校园小程序的架构设计主要包括云端架构和本地架构两部分。云端架构方面,采用Serverless架构可以降低技术门槛,通过阿里云、腾讯云等平台提供的云服务,可以实现弹性扩容和快速部署。例如,使用云数据库、...
- 盲盒小程序开发揭秘:技术架构与实现原理全解析
-
在2025年的今天,盲盒小程序作为一种结合了线上购物与趣味性的创新应用,正受到越来越多用户的喜爱。其背后的技术架构与实现原理,对于想要了解或涉足这一领域的人来说,无疑充满了神秘与吸引力。本文将为大家科...
- 月活百万的小程序架构设计:流量暴增秘籍
-
从小程序到"大"程序的蜕变之路当你的小程序用户量从几千跃升至百万级别时,原有的架构就像一件不合身的衣服,处处紧绷。这个阶段最常遇到的噩梦就是服务器崩溃、接口超时、数据丢失。想象一下,在...
- 认知智能如何与产业结合?专家学者共探理论框架与落地实践
-
当前,以大模型为代表的生成式人工智能等前沿技术加速迭代,如何将认知智能与产业结合,成为摆在各行各业面前的一个问题。论坛现场。主办方供图7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议在...
- 现代中医理论框架
-
...
- 认知行为(CBT)中的ABC情绪理论
-
情绪ABC理论是由美国心理学家阿尔伯特·艾利斯(AlbertEllis1913-2007)创建的理论,A表示诱发性事件(Activatingevent),B表示个体针对此诱发性事件产生的一些信...
- 说说卡伦霍妮的理论框架,对你调整性格和人际关系,价值很大
-
01自在今天我主要想说下霍妮的理论框架。主要说三本书,第一本是《我们时代的神经症人格》,第二本是《我们内心的冲突》,第三本是《神经症与人的成长》。根据我的经验,三本书价值巨大,但并不是每个人都能读进去...
- 供应链管理-理论框架
-
一个最佳价值的供应链,应该是一个具有敏捷性、适应性和联盟功能(3A)的供应链,其基本要素包括战略资源、物流管理、关系管理以及信息系统,目标是实现速度、质量、成本、柔性的竞争优势。篇幅有...
- 微信WeUI设计规范文件下载及使用方法
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信Web开发量身设计,可以令用户的使用感知...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)