在几个 Android 的技术交流群里经常看见做 App 开发的同学想要学习 Android Framework 进而转行 Android 系统开发。同时对于现有的书籍和网络博客,很多同学表示说看不懂学不会。这些书籍和博客都写得很好,但是主要面向的对象是具有 linux 系统开发经验的同学,App 开发的同学学习起来就会有点吃力。

学得懂的 Android Framework 教程聚焦成为让 App 开发同学学得懂,学得快,用得上的 Android Framework 教程。

开始教程之前,先简单自我介绍一下:

我叫阿豪,目前定居成都。12 年开始在学校实验室从事 Android 应用、系统和安全相关的研发工作,15 年从国防科技大学指挥自动化专业毕业。毕业后,在部队干了两年多技术后,复原回到成都,在一家成都本土软件公司干了一年 Andorid 软件开发,基本一个星期就能干完一个月的活,感觉人快废了,19年初就辞职自己创业了,先干了软件外包,后来看挖掘机租赁能赚钱又开始做挖掘机租赁。到了 22 年,能力不够加上环境因素,软件外包和挖掘机生意都一塌糊涂。22年下半年开始,开始出售固定资产,缩小经营规模,在惨烈的 22 年算是活了下来。4 年的创业之路异常艰难,不过幸运的是我获得了不同的人生经历,把父母眼中的“大事”—— 买车、买房、结婚、生子都完成了。到了 23 年,创业的成果让我不再为基本的温饱问题发愁,我有了大把的自由时间,接下的时间我准备把之前积累的一些 Android Framework 相关的经验分享给大家,也算是给自己的技术之路画上一个小小的逗号。

今天分享的内容是怎么快速上手 AOSP,主要分为以下几个步骤:

  • 虚拟机安装
  • 开发环境搭建
  • 下载编译源码
  • 从一个简单的实际开发需求体验 Framework 开发

虚拟机安装

这里推荐在 Windows 下使用 VMware 虚拟机软件安装 Ubuntu20.04 进行开发(AOSP 官网推荐的的是 Ubuntu18.04,但 Ubuntu20.04 在 VMware下兼容性更好),安装系统的过程如下:

1. 在官网下载好 Ubuntu20.04 桌面版系统镜像

2. VMware 新建虚拟机

打开 VMware,菜单栏选择 文件 -> 新建虚拟机 后,出现以下界面:

选择 自定义高级,然后点击 下一步,出现以下界面:

这里不用改,点击 下一步,出现以下界面:

选择 稍候安装操作系统,点击 下一步,出现以下界面:

操作系统选择 Linux,版本选择 Ubuntu 64位,然后点击 下一步,出现以下界面:

虚拟机名称处取一个你喜欢的名字,位置选择剩余空间超过 500G 的路径,然后点击 下一步,出现以下界面:

处理器数量选择 1,每个处理器的内核数量选择你 CPU 的线程数,比如我的 CPU 是 amd ryzen 3800x,8核心16线程,那么选择 16,然后点击 下一步,出现以下界面:

虚拟机内存的设置建议不要超过实际物理机的内存,如果你的物理机内存较小(32G以下),这里设置为 16G。物理机内存较大(32G以上),这里设置为 32 G。然后点击 下一步,出现以下界面:

网络类型选择 使用桥接网络,然后点击 下一步,出现以下界面:

这里不改动,直接点击下一步,出现以下界面:

这里不改动,直接点击 下一步,出现以下界面:

这里不改动,直接点击 下一步,出现以下界面:

根据你磁盘的空间,最大磁盘大小尽可能设置大一点,我这里设置为 1024 G,然后点击 下一步,出现以下界面:

这里不改动,直接点击 下一步,出现以下界面:

选择 自定义硬件,出现以下界面:

选择 新 CD/DVD(SATA),出现以下界面:

右侧选择 使用 ISO 映像文件,点击浏览,选择我们刚才下载好的系统镜像,然后点击 关闭,出现以下界面:

然后点击完成,至此,虚拟机新建完毕。

3. 系统安装

打开 VMware 虚拟机软件:

点击左侧 Ubuntu 64位 即我们刚才新建的虚拟机,点击右侧 开启此虚拟机,然后就进入了 Ubuntu 的系统安装流程:

左侧选择 English,右侧点击 install Ubuntu

点击 continue

点击 continue

点击 install now

点击 continue

然后点一下中国地图,下面显示 Shanghai,点击 continue

依次输入:

  • 名字
  • 电脑名字
  • 用户名
  • 密码

然后点击 continue,然后等待安装完成,重启虚拟机即可。

开发环境搭建

安装好系统后需要安装必要的软件:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python

至此,开发环境就搭建好了。

下载编译源码

1. 下载 repo 工具

mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod +x ~/bin/repo

repo 的运行过程中会尝试访问官方的 git 源更新自己,如果想使用 tuna 的镜像源进行更新,可以将如下内容复制到你的 ~/.bashrc 或者 ~/.zshrc 里。

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
PATH=~/bin:$PATH

2. 初始化仓库并同步远程代码

git config --global user.email "you@example.com"
git config --global user.name "Your Name"
mkdir aosp
cd asop
#初始化仓库,-b 指示分支,这里使用 android10
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r41
#同步远程代码
repo sync

-b 后面的值参考源代码标记和 build。这里选用了 android-10.0.0_r41 版本用于学习。Android 每年都会更新一个大版本,学习的角度来说,选择一个不太老的版本即可,不必追新。

3. 编译源码

source build/envsetup.sh
lunch aosp_x86_64-eng
make -j16

4. 运行模拟器

emulator -verbose -cores 4 -show-kernel

从一个简单的实际开发需求体验 Framework 开发

需求:去掉原生 Launcher 中的 google 搜索栏。

很多产品,比如用于仓库,电商,物流的 pda 等,更多的是考虑功能性和稳定性,UI 的美观和易用性是其次的。这些产品一般是不会重新开发和定制 Launcher 的,但是会对 Launcher 做一些修改,比如一个常见的需求是:去掉原生 Launcher 中的 google 搜索栏

由于众所周知的原因 google 搜索栏在中国是没有办法使用的。在中国销售的产品,肯定是要把它去掉的。

第一步:修改文件 packages/apps/Launcher3/res/layout/search_container_workspace.xml,将以下内容注释掉:

    <!-- <fragmentandroid:name="com.android.launcher3.qsb.QsbContainerView$QsbFragment"android:layout_width="match_parent"android:tag="qsb_view"android:layout_height="match_parent"/> -->

第二步:修改文件:packages/apps/Launcher3/src/com/android/launcher3/Workspace.java 将以下内容注释掉

        // CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, firstPage.getCountX(), 1);// lp.canReorder = false;// if (!firstPage.addViewToCellLayout(qsb, 0, R.id.search_container_workspace, lp, true)) {//     Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");// }

第三步:重新编译源码,启动模拟器

make -j16
emulator

可以看到 Google 搜索框没有了。

很多同学可能有疑问,你怎么知道这么改就可以了?其实办法就一个——读源码。Launcher 也是一个 Android 应用,和我们平时开发的 App 没有本质的区别。就像我们接手别人开发的项目,去解决项目中的 bug,添加新的需求是一样的。

Android Framework 不同的是,代码量大,涉及知识广泛,App 开发同学如果没有人指导,阅读起来比较吃力。后续内容我们带着大家由浅入深,步步分解,为 App 开发的同学解开 Android Framework 的神秘面纱。

总结

本文主要介绍了以下几个方面的内容:

  • 虚拟机安装
  • 开发环境搭建
  • 下载编译源码
  • 从一个简单的实际开发需求体验 Framework 开发

基本是偏向实际操作的内容,感兴趣的同学可以按照上面介绍的步骤体验一番。

如果你对 Android Framework 感兴趣,可以持续关注:

  • 掘金平台个人技术博客

  • 我的个人公众号

  • 我的个人微信

学得懂的 Android Framework 教程之 AOSP 急速上手相关推荐

  1. Xamarin.Android使用教程之Android开发所需的模拟器

    2019独角兽企业重金招聘Python工程师标准>>> 如今,在一个模拟器中运行Android应用程序时有很多种选择,今天,我们将为大家介绍当使用Xamarin开发Android应用 ...

  2. sqlite数据库android使用教程,Android开发教程之 SQLite数据库的使用

    在开发Android应用程序时经常需要存储数据,Android系统提供了SQLite数据库,还提供了SQLiteOpenHelper类,使我们可以很方便的操作数据库.通过一个例子来说明在Android ...

  3. bootstrap php zend,Zend Framework教程之Bootstrap类用法概述

    本文实例讲述了Zend Framework中Bootstrap类用法.分享给大家供大家参考,具体如下: Zend_Application_Bootstrap_Bootstrapper Zend_App ...

  4. 根据用户查进程_【磨叽教程】Android进阶教程之在Android系统下各进程之间的优先级关系...

    导读:本文大约2000字,预计阅读时间3分钟.本文纯属技术文,无推广. 正文     首先应用进程的生命周期并不由应用本身直接控制,而是由系统综合多种因素来确定的.Android系统有自己的一套标准, ...

  5. android分开两个线程做事,android开发教程之handle实现多线程和异步处理

    这次浅谈一下Handler,为什么会出现Handler这个功能特性呢?首先,在之前的基本控件,基本都是在Activity的onCreate(Bundle savedInstanceState)方法中调 ...

  6. android vibrator,Android入门教程之Vibrator(振动器)

    前言: Vibrator简介: 下面我们就来写个简单的例子,来熟悉下这个Vibrator的用法! 1.获得Vibrator实例: Vibrator vb = (Vibrator)getSystemSe ...

  7. android gridview教程,Android系列教程之GridView组件的使用

    GridView是一个网络布局的视图,他能让你的元素显示在一个个的格子里.我们的桌面就是一个GridView.. 1.新建一个gridview工程,activity_main.xml的代码如下:< ...

  8. 学java教程之this关键字

    学编程吧学java教程之this关键字发布了,欢迎通过xuebiancheng8.com来访问 java中的this关键字是一个非常重要的关键词.java中的this关键词主要有两种用法,先看第一种 ...

  9. 学java教程之String类

    学编程吧学java教程之String类发布了,欢迎通过xuebiancheng8.com来访问 java类中的String类应该是用的最多的一个类,我们时时刻刻都离不开String类,时时刻刻都在用, ...

最新文章

  1. Go环境搭建、Sublime Text 3 安装Go语言相关插件gosublime
  2. 社交网络图挖掘3--重叠社区的发现及Simrank
  3. Cracer渗透视频课程学习笔记——基础知识(1)
  4. 中国水闸橡胶密封件市场需求状况与营销模式建议报告2022年
  5. 喜报!神策数据入选“中国科创企业百强榜”前 3 名
  6. 转:PHP 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
  7. 群英论道聚北京,共话PostgreSQL
  8. Java类加载原理解析(转)
  9. Android 仿PhotoShop调色板应用(一)概述
  10. logistics regression 线性不可分转换成线性可分
  11. vdbench(一)
  12. 软件库网站源码+多套模板 附手机版 附教程
  13. C# 编写小巧快速的 Windows 动态桌面软件
  14. intellij idea编辑器好看炫酷主题配色方案推荐
  15. 被远程之后,键盘失灵问题
  16. 关于目前CIM(BIM+GIS)行业的一些看法
  17. 计算机硬盘会计分录,电脑加装固态硬盘如何做分录
  18. 错误记录:FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecate
  19. A. Groundhog and 2-Power Representation (递归 高精度) 2020牛客暑期多校训练营(第九场)
  20. ZYNQ7000 学习(三十) 定时器终端的原理和实现

热门文章

  1. 体重与心率的关系MATLAB,心率与瘦身的关系 评判运动强度的关键
  2. 基于X210开发板平台下的刷机教程
  3. 如何查看苹果电脑内置比特币白皮书
  4. 计算机软考等级取消了吗,软考是计算机等级考试吗
  5. CVA 估值报告写作 01
  6. intel power gadget mac_苹果电脑真的那么耐用吗?我拿五年前的 Mac 试了试 - Apple Mac...
  7. shopee校招笔试考什么?如何准备笔试?
  8. Matchvs 使用记录
  9. 造成eBay账号关联的因素有哪些
  10. 5G与WiFi6相爱相杀的关系