ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Android开发全栈路线图:从环境搭建到系统底层BSP实战

Android开发全栈路线图:从环境搭建到系统底层BSP实战 作为一个在Android开发这条路上摸爬滚打了十几年的老开发经常被新人问到同一个问题我想学Android到底该从哪开始说实话这个问题很难用一句话回答因为现在的Android生态和十年前完全不是一个量级的东西。手机系统版本碎片化、厂商定制ROM差异、各种新架构组件层出不穷、底层内核与BSP开发也成为很多人的方向——Android开发这四个字底下藏着一整片森林。这篇前篇目录就是干这个用的。我不打算讲某个具体功能怎么写而是先把Android开发这摊事儿的全貌给你铺开把后续要深入的方向标出来同时把环境搭建、常见坑、学习路径这些前置条件一次性讲透。本文适合零基础想入行的新手、卡在环境配置半天搞不定的初学者以及想转型做系统定制或底层优化的中级开发。读完你会对整个Android领域有个清晰的坐标感知道自己在哪、要去哪、路上有哪些绕不开的坎。1. 整个系列的文章地图Android开发到底有哪些方向做Android这么多年一个很深的感受是这行早就不是会写个Activity就能找到工作的年代了。现在的Android开发至少可以拆成几个差异巨大的方向每个方向的知识栈、工具链、思维方式完全不同。如果你打开招聘软件搜Android会看到大致这么几类岗位应用层开发做App的又细分为普通业务开发和基础架构开发、系统开发改ROM、做定制系统、做系统级App、底层驱动与BSP开发跟内核、芯片打交道、跨平台开发用Flutter、RN、uni-app或Tauri这类方案但底层还是得懂Android原生。这篇前篇目录所在的系列规划上就按这条线展开第一篇到第五篇应用层开发的基础涵盖Android Studio环境搭建、项目结构、四大组件、UI体系、数据存储、网络请求第六篇到第八篇进阶架构包括协程与Flow、Jetpack全家桶、性能优化与稳定性治理第九篇到第十篇系统定制方向讲AOSP编译环境、系统App开发、开机流程、root与Magisk原理第十一篇到第十二篇底层与BSP方向涉及内核编译、设备树、HAL层、以及Android 10之后的分区与AVB验证机制。热词里能看到很多人搜android framework、mtk_unisoc 平台 arm64 android 内核与 bsp 开发、android 10.0 根文件系统和编译系统——这些都属于系统底层方向。而搜android studio怎么设置中文、android studio每次新建项目都要下载gradle的大概率是刚装上IDE还没跑通第一个App的纯新手。这两类人看这篇文章的收获点完全不同。我自己在带团队的时候常被问这些方向到底该怎么选说句实在话应用层天花板见顶的速度比很多人想象得快但系统层和底层的人才缺口一直很大。只不过底层方向的门槛确实高需要补内核、编译原理、计算机组成原理这些硬知识。如果你只是想快速做点东西出来先扎根应用层没有问题但这篇文章建议你至少对整张地图有概念别走着走着把自己困在一条窄巷子里面。2. 环境搭建为什么装个Android Studio这件事能劝退很多人打开android studio下载、android studio安装教程这些热词的搜索结果你会发现一个很有意思的现象几乎80%的Android新手问题都发生在还没写第一行代码之前——也就是环境搭建阶段。这事看着简单实际上坑多得离谱而且很多坑跟你的开发水平无关纯粹是网络环境、版本匹配、历史遗留这些破事堆出来的。2.1 JDK选型与Android Studio版本匹配先说JDK。Android Studio从Arctic Fox版本开始内置了JBRJetBrains Runtime也就是它自己带了JDK不需要你单独装Oracle JDK。但实际开发中我还是建议你搞清楚自己项目用的JDK版本因为Gradle和Java版本强相关。Android Gradle PluginAGP和JDK版本的对应关系我用一张表说清楚Android Gradle Plugin版本最低Gradle版本兼容JDK版本默认编译目标AGP 7.xGradle 7.xJDK 11Android 12 (API 31)AGP 8.0Gradle 8.0JDK 17Android 13 (API 33)AGP 8.2Gradle 8.2JDK 17Android 14 (API 34)AGP 8.5Gradle 8.7JDK 17Android 15 (API 35)看到问题了吗如果你用的是AGP 8.2以上版本系统里没装JDK 17Gradle sync的时候一定会报错。而很多人下载的Android Studio版本比较新Hedgehog之后对JDK版本要求就是17起步。实操建议装好Android Studio之后在File - Project Structure - SDK Location里能看到它自动定位的JDK路径。如果你用的是Android Studio自带的JBR就别手动改省得给自己找麻烦。如果你是从命令行例如scholar环境、CI服务器编译项目务必在gradle.properties里配上org.gradle.java.home指向JDK 17同时在系统环境变量里也配一份。2.2 三个核心目录的作用与位置关系Android开发环境里有三样东西经常被混淆SDK、Android Studio配置目录、Gradle缓存目录。很多人报错unable to access android sdk add-on list、the following sdk component was not installed,其实都是对这几个目录的关系没搞清楚。SDK目录默认为%LOCALAPPDATA%\Android\SdkWindows或~/Library/Android/sdkmacOS。SDK里面按版本分了platforms各个API Level的android.jar、build-toolsaapt2、dx/d8、zipalign等构建工具、platform-toolsadb、fastboot和emulator。Gradle缓存目录通常在~/.gradle/caches下里面存的是依赖的jar/aar以及Gradle本身的分发版本。这就是android studio每次新建项目都要下载gradle这个问题的根源所在。Android Studio新建项目时会根据项目的Gradle Wrapper配置下载指定版本的Gradle发行包国内网络下载慢得让人血压飙升。我自己的解决方案是维护一个本地Gradle发行包的私服手动去腾讯云或阿里云的镜像站下载对应版本的gradle-x.x-all.zip放到~/.gradle/wrapper/dists/下面对应的目录结构中然后新建项目时直接选择本地已存在的Gradle版本或者将项目的gradle-wrapper.properties里distributionUrl指向本地文件路径。这招实测下来能把新项目创建时间从半小时压到两分钟。2.3 SDK组件缺失与build-tools版本问题热词里有一条The following sdk component was not installed: android sdk build-tools 37这类错误的本质就是项目要求的build-tools版本在本机SDK里没有。解决办法有两个一是用SDK Manager下载对应版本二是直接把项目的buildToolsVersion改成已有的版本但改项目版本前要确认compileSdkVersion和buildToolsVersion兼容否则编译出来的资源可能对不上。很多老项目还喜欢在project的build.gradle里写buildToolsVersion 30.0.3这种硬编码实际上Android Studio新版本AGP 8.x里buildToolsVersion默认值已经跟你用的compileSdkVersion自动匹配大多数情况下不需要手动指定。如果手动指定了就一定要确保SDK Manager里安装了这个版本。3. Android Studio高频设置与汉化背后的原理热词里android studio怎么设置中文、android studio汉化一直是搜索大户。每次看到这个我都想说工具的界面语言真的不是你学习Android路上的核心问题。但既然问的人多这里把原理和操作拆开来聊清楚。3.1 汉化到底改的是什么Android Studio的汉化方案主要有两种一是安装中文语言包插件Chinese Language Pack二是在启动参数里加-Duser.languagezh。前者是JetBrains官方出的在Settings - Plugins里搜Chinese就能找到装完重启生效。后者是改JVM参数本质上就是让IDE以中文locale启动。这两种方案的效果差别很大。语言包插件改的是IDE自身的UI文案完全不影响项目代码和Gradle输出信息。而改user.language这种参数有极小概率会影响某些插件对locale的判断导致格式化规则或时间日期显示异常。所以我的建议是就走插件方案别折腾启动参数。还有一个隐藏很深的知识点很多人在网上搜到一段修改idea.properties添加-Duser.languagezh的教程那段命令其实对Android Studio是不生效的因为Android Studio的IDE启动参数在studio.vmoptions或studio64.exe.vmoptions里改的是idea.properties根本没被读取。这种连文件都搞错的教程网上居然还大量流传可见这个领域信息噪声有多大。3.2 中文字体渲染与IDE性能装完语言包之后还有一个很实际的问题中文显示效果。JetBrains系IDE在Windows上默认用的是Microsoft YaHei但如果你用的是非HiDPI分辨率的老笔记本中文会显得发虚。性能渣的机器还会在翻代码的时候卡顿明显。我的优化方案在Settings - Appearance - Font里把字体设为Microsoft YaHei UI字号14起步在Editor - Font里把等宽字体设为JetBrains Mono关闭连字Ligatures低配机器把IDEA的堆内存调大编辑studio64.exe.vmoptions把-Xmx从默认的2048m提到4096m前提是你机器至少有16G物理内存。Android Studio其实是一个运行在JVM上的重量级IDE-Xmx太小会导致频繁GC打开大项目时肉眼可见地卡顿这时候很多人以为是电脑配置不行实际是JVM内存你没给够。3.3 AVD模拟器为什么启动那么慢android studio tv launcher这个热词我猜是指TV模拟器或者TV桌面开发相关的搜索。Android Studio自带的AVDAndroid Virtual Device模拟器在Windows上默认用WHXWindows Hypervisor Platform加速但如果你没启用Windows Hypervisor Platform模拟器就会退回纯软件模拟模式启动一次少说五分钟进去还卡成PPT。解决步骤控制面板 - 启用或关闭Windows功能 - 勾选Windows Hypervisor Platform和Virtual Machine Platform重启电脑Android Studio里检查AVD设置确认Emulator的Graphics选成Hardware - GLES 2.0而不是Software。实测按这个流程走模拟器启动能从五分钟压到二十秒左右。说句题外话如果是日常做普通App开发我建议你直接用真机调试别跟模拟器死磕。USB连接后打开开发者选项里的USB调试比模拟器不知道省多少心。4. 核心基础扫盲四大组件、协调布局与动态主题前面的内容讲完了环境现在聊聊开发本身。热词里有android中协调布局banner、android动态图标主题、android开发、java android这类高频基础搜索。这节就顺着这条线把应用层最核心的骨架和最容易被忽略的细节摊开讲。4.1 四大组件不是背熟就行的Activity、Service、BroadcastReceiver、ContentProvider号称Android四大组件新手普遍把这些当概念背背完就忘。我见过的绝大多数开发瓶颈其实是没搞清楚组件的启动模式与系统进程的关系。以Activity为例launchMode里的singleTask和singleInstance不是启动一次这么简单。singleTask模式下Activity所在的Task里会清掉它之上的所有Activity这个行为在Android 10之后有了变化onNewIntent的触发时机跟flags有关而singleInstance是为了让某个Activity独占一个Task——这通常用于来电界面这类场景。很多人在做通知栏点击跳转这种需求时因为没处理PendingIntent的FLAG_IMMUTABLEAndroid 12之后强制要求导致App在Android 12的真机上崩溃。这种问题网上有一大堆人问本质就是对新版系统行为变更不敏感。我的建议是学四大组件的时候不要只看单独一个组件怎么用要把一个完整场景串起来理解比如点击通知 - 拉起Activity - 在服务里做后台任务 - 通过广播更新UI - 用ContentProvider跨进程取数据。这样你学到的才是Android的应用模型而不是碎片化的API。4.2 协调布局与Banner滚动的正确打开方式热词里android中协调布局banner这个搜索词一看就是新手在做顶部Banner随列表滚动的联动效果。CoordinatorLayout配合AppBarLayout是一个非常成熟的方案app:layout_scrollFlagsscroll|exitUntilCollapsed可以对Toolbar做折叠但这有个前提你的页面主体必须是能产生NestedScroll事件的控件比如RecyclerView、NestedScrollView。常见问题是很多人在CoordinatorLayout里放了一个普通的ScrollView怎么拖动Toolbar都不折叠。原因很简单——ScrollView不实现NestedScrollingChild接口CoordinatorLayout的Behavior根本没机会收到滚动事件。解决方案有二一是把ScrollView换成NestedScrollView二是自定义Behavior监听dispatchTouchEvent。前者5分钟搞定后者适合作为进阶练习。做Banner轮播也是同理其父容器不能拦截掉RecyclerView的触摸事件否则滚动冲突能把人折磨疯。我自己通常不建议在这种场景里用ViewPager2做Banner而是用RecyclerView自带的LinearSnapHelperBanner间距原因是ViewPager2的嵌套滚动事件容易被CoordinatorLayout里的其它滚动逻辑吃掉调试成本太高。这个冷门经验可能跟主流方案不太一样但实际工程里扛得住。4.3 动态图标Android 13的THEMED_ICONS与自适应图标android动态图标主题这个搜索词指向的是Android的Dynamic Color主题也就是Material You那套。从Android 12开始系统可以从壁纸里提取色彩来动态生成主题色。第三方App要适配动态主题需要在资源里用?attr/colorPrimary这类主题属性而不是硬编码颜色值。实际操作中很多人遇到的问题是android:theme只配了MainActivity结果Dialog、Toast之类的界面还是旧色。原因在于App的各个组件要共用同一个ThemeDialog的主题必须继承App的主题否则拿不到动态色。更深层的“图标”一词可能还指自适应图标Adaptive IconAPI 26也就是那个带前景层和背景层的图标。做自适应图标的时候注意两点anydpi-v26目录下要放ic_launcher.xml和ic_launcher_round.xml前景层和背景层至少各留66dp的安全区给系统裁切动画不然很多厂商桌面会把你的图标裁得很难看。很多App在新机型上图标边缘出现黑边、变形十有八九就是icon做成了一张108x108的png硬塞进mipmap目录系统做了奇怪的缩放导致。5. 高频实战需求蓝牙、麦克风、拍照、手势识别热词里这几条非常有代表性android蓝牙、android麦克风声强计编写、android拍照识别边框、mediapipe android手势识别。这些都属于硬件交互与视觉识别类需求做起来不算难但每一类都有它特有的坑。5.1 蓝牙开发必须知道的权限演进Android蓝牙开发的权限从6.0到12经历了几轮变化。BLUETOOTH_SCAN和BLUETOOTH_CONNECT是Android 12API 31新增的运行时权限旧版本的ACCESS_FINE_LOCATION在Android 12上做扫码仍然需要因为蓝牙扫描会泄露位置信息但做连接和数据传输已经不需要定位权限了。实测中最让你血压上升的是应用targetSdkVersion升到31之后本来跑得好好的蓝牙连接突然就崩了日志报MissPermissionException。原因是没有重新在AndroidManifest.xml里声明新权限并运行时请求BLUETOOTH_CONNECT。建议大家在做低功耗蓝牙BLE开发时直接用BluetoothLeScanner配合ScanFilter过滤服务UUID比遍历周围的设备再匹配效率高很多。扫描是个耗电操作记得用完后stopScan不然手机会明显发烫。5.2 麦克风声强计用AudioRecord还是Visualizerandroid麦克风声强计编写这个需求核心是实时获取麦克风音量的分贝值。最直接的方式是用AudioRecord读取PCM数据算RMS均方根然后映射到分贝。也可以用Visualizer这个API它不需要申请RECORD_AUDIO权限但只能获取系统正在播放的音频数据对麦克风采集不管用。所以如果你要做的真是声强计测量环境声音AudioRecord是正解val bufferSize AudioRecord.getMinBufferSize( 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT ) val recorder AudioRecord( MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize ) recorder.startRecording() // 循环读取short数组计算RMS sqrt(sum(x[i]^2)/n) // 分贝值 20 * log10(RMS / REFERENCE)有两个细节值得注意麦克风采集到的振幅值受硬件增益影响极大iPhone和Android不同机型测同一个声源的读数能差10dB以上。这是设备特性不是你的算法写错了。记得在AndroidManifest.xml里配置RECORD_AUDIO运行时权限并且做拒绝处理不然在Android 6.0上直接崩溃。5.3 MediaPipe手势识别的工程化避坑MediaPipe在Android上的接入方式经历了从旧版Maven到新版解决方案的重大变化。热词里这个搜索可能是有人想用人手关键点检测实现手势控制。MediaPipe整体方案如手势识别器在你配好各项参数后表现不错但必须在后台线程运行不能在主线程直接调用检测器否则UI直接卡死。工程化方面还有几个容易踩的坑输入图像需要旋转成设备的自然方向否则手势检测结果会拿倒帧率控制建议在15FPS左右就够太高会吃掉CPU手机上发热严重HandLandmarker的numHands参数慎设成多手计算量翻倍绝大多数场景一只手足够了。5.4 拍照识别边框从CameraX到OpenCVandroid拍照识别边框这个需求初看像文档扫描、票据识别之类的功能。实现链路通常是CameraX预览 - 拍照/帧回调 - 传给OpenCV做边缘检测 - 提取文档轮廓 - 透视变换。这一步一步说太长了这里只提醒三个大坑相机输出是YUV格式API不同版本拿到的图像格式可能不一样统一转成RGBA再交给OpenCV处理别图省事直接拿YUV做边缘检测出来的结果偏色是小事关键是被测物体的轮廓会被YUV色度采样的失真影响OpenCV的Imgproc.Canny对噪声极其敏感用GaussianBlur先平滑一下效果会好很多轮廓逼近用Imgproc.approxPolyDPepsilon取周长乘0.02这是经验值太大会少检测到角点太小会引入多余的拐点。6. 系统级方向入门Framework、内核与BSP开发的价值与门槛接下来这部分是给那些不满足于只写App、想往系统底层走的读者准备的。热词里android framework、android 10.0 根文件系统和编译系统、mtk_unisoc 平台 arm64 android 内核与 bsp 开发、android apex、android no-ab制作差分包 imgdiff 崩溃这些搜索词串在一起基本勾勒出一条从Framework到内核的完整底层开发路线。6.1 Framework开发系统服务与应用框架的边界Framework开发本质上是在frameworks/base这个目录下改代码涉及ActivityManagerService、PackageManagerService、WindowManagerService这些核心系统服务。这类工作需要你具备两个能力一是Java/Kotlin应用开发功底二是对AIDL跨进程通信有深刻理解——因为系统服务和App的本质就是Binder通信的双方。做Framework开发的常用工具链包括AOSP源码、Android Studio配合JDK、以及systrace/perfetto做性能分析。我见过很多从应用层转Framework的人刚开始最大的障碍是不会读AOSP代码不知道launcher启动Activity的完整链路不知道SystemServer的启动顺序对系统服务间依赖的影响。一个典型的入门路径是先学会在AOSP里单独编译一个系统App比如Settings或SystemUI然后尝试往设置里加一个自己的条目最后再尝试修改PackageManagerService为某个系统App授予特殊权限。这个过程踏实走完你对Android的理解就远超普通应用层开发了。6.2 AOSP编译与根文件系统的关系Android 10之后的根文件系统变化非常大system分区的只读化、动态分区和逻辑卷的引入都是在这个版本落地的。很多人卡在编译出来的system.img怎么刷不进手机因为你是在传统分区格式下编的而目标设备是动态分区格式用fastboot刷的时候自然失败。针对这个建议先搞清楚你手里的设备支持哪套分区方案Android 10及以上动态分区super分区包含system/vendor/productAndroid 9及以下传统固定分区编译指令上动态分区需要额外传参例如source build/envsetup.sh lunch product-userdebug make systemimage -j8 # 如果需要整包make otapackage生成super.img之后用fastboot flash super super.img刷入。差分包又是另一个概念android no-ab制作差分包 imgdiff 崩溃这个热词说明有人卡在了生成OTA差分包的imgdiff工具上这通常跟源镜像和目标镜像的格式不匹配有关——比如源是稀疏镜像导致imgdiff的块对齐逻辑炸掉。解决思路是先把稀疏镜像转换成raw镜像再跑差分包。6.3 BSP与内核开发最硬核的路线mtk_unisoc平台、arm64、内核与BSP开发这三个词凑一起就是芯片厂商和终端厂商里的BSP工程师日常。BSP开发的本质是让硬件平台上的主控SoC能正确驱动外设包括LCD屏、TP触摸屏、传感器、Camera、WiFi/蓝牙模组、以及电源管理相关的外设。供应商比如MTK、展锐通常会提供一个基础的Linux内核BSP工程师要做的是按产品定义裁剪内核、适配设备树Device Tree、调试驱动、验证稳定性。内核和BSP开发的工具链跟应用层完全是两个世界避不开的应用是Yocto、Buildroot或AOSP的源码目录避不开的语言是C和汇编避不开的调试手段是dmesg、trace32、逻辑分析仪。如果你对这个方向感兴趣但还没有相关基础我建议的路径是先把嵌入式Linux驱动开发这本书吃透里面讲的GPIO、中断、定时器、并发控制都是BSP开发的基石再来看Android内核目录下的arch/arm64/boot/dts如何描述一个开发板的LED、按键和串口。等你能把一个基础内核跑在QEMU或树莓派上再进阶到Android的内核裁剪和HAL层开发。7. 版本管理与实际Android系统碎片化问题做这一行久了你会慢慢形成一种版本地图式的职业直觉什么功能在什么API level上能用、什么行为变更会影响老代码、哪个厂商ROM在哪个Android版本上有什么魔改……这些不是背出来的是踩坑踩出来的。Android版本从API 21Android 5.0 Lollipop到现在的API 35Android 15每一个大版本都引入了一批新特性也砍掉了一批旧模式API Level版本关键变化对开发的影响21Android 5.0Material Design、ART运行时老项目还在用Dalvik的直接告吹23Android 6.0运行时权限targetSdkVersion 23以上需要动态请求权限26Android 8.0自适应图标、通知渠道通知必须带渠道否则不显示29Android 10分区存储、深色模式直接访问外部存储受限31Android 12PendingIntent必须显式声明可变性老代码不升级的直接崩34Android 14前台服务类型必须声明定位、媒体服务等场景需要加类型声明35Android 1516KB Page Size支持NDK库需要适配16KB对齐对于普通应用开发来说最重要的一个准则是targetSdkVersion不要一直停在老版本但也不要在发布前一夜强行升级。我见过太多次因为踩了升级targetSdkVersion导致一堆兼容问题的坑。正确的做法是在迭代周期的早期就把targetSdkVersion升上去留出充裕时间跑兼容性测试把行为变更列表官方文档有Behavior Changes一览逐条对照自己的代码过一遍。而当你做的是系统开发或BSP开发时版本管理更苛刻。AOSP每个大版本都是一个独立的git分支芯片厂商会在自己release的kernel分支上维护多年的patch。这时候你要维护的不是我用了哪个SDK版本而是我的内核基线来自哪里、接下来要怎么合入上游的安全补丁。很多做BSP的团队都用repo这个多仓库管理工具配合manifest来固定整个代码集的版本快照一套代码库动辄上百G版本管理一旦混乱后续维护就是灾难。8. 入坑建议与后续学习路径前面把Android领域的版图画了出来现在聊点更实际的各个阶段的人该怎么往下走。如果你是零基础先别急着买书报课做一件事跟着官方文档的“Build your first app”教程用Android Studio把第一个Hello World跑起来。这个过程看着简单但能让你把SDK、模拟器/真机、Gradle构建流程、Logcat调试这些核心工具链全部过一遍。跑通之后再来问四大组件是什么你的理解会完全不同。如果你已经会写简单App但总觉得代码很乱那建议的重心是学Kotlin协程 官方推荐的Jetpack架构组件ViewModel LiveData/StateFlow Room Hilt。现在Google官方和绝大多数公司的Android项目都在这套架构之上早学早受益不要抱着Retrofit RxJava那套老技术栈不放。如果你对系统底层感兴趣但缺基础按这个顺序补Linux基础命令 - 编译原理入门 - 嵌入式Linux驱动开发 - AOSP源码阅读与编译 - 挑一个系统模块做定制。这个过程急不得但一旦入门职业护城河极深。最后关于学习资源和工具我多说几句个人体会官方文档developer.android.com的中文翻译质量越来越高很多概念直接看中文也能懂个大概但技术名词建议还是记英文原词因为社区交流、搜索资料时英文关键词的命中率高到离谱IDE里多按快捷键少用鼠标点菜单熟练使用ShiftShift查找文件、CtrlShiftF全局搜索、CtrlAltL格式化代码能让你的开发效率翻倍没事多看看系统自带的源码版本AS里Ctrl鼠标点击就能跳到SDK源码比买一堆二手讲解书有用得多。Android这条路很长但每一步都有迹可循。这篇前篇目录就是一个总纲接下来的系列里我会沿着应用层基础、进阶架构、系统定制、底层BSP这条主线一篇一篇写下去。路给你标好了装备工具链也帮你备齐了剩下的就是一步步走下去。
返回列表