【Android】系统源码下载及编译和android studio导入

源码及编译

https://blog.csdn.net/yang553566463/article/details/129029734

步骤 1:创建一个空目录来存放源码:

复制代码
mkdir aosp
cd aosp

步骤 2:获取最新版本的 repo 并签出 android-8.1.0_r1 分支:

复制代码
repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1

其中,android-8.1.0_r1 代表源码标记,代表我们将要获取 Android 8.1 的源码,如需查看其他版本的源码标记,可参阅 源代码标记和 build。

步骤 3:将 Android 源码从默认清单中指定的代码库下载到本地工作目录:

复制代码
repo sync

步骤 4:创建本地分支并关联 repo 上的所有仓库:

复制代码
repo start ycx-dev --all

步骤 5:使用 envsetup.sh 脚本初始化编译环境

复制代码
source ./build/envsetup.sh

步骤 6:选择编译目标:

复制代码
lunch aosp_arm64-eng

编译目标的格式说明:编译目标的格式是 BUILD-BUILDTYPE ,如 aosp_arm64-eng 这个目标,它的 BUILD 是 aosp_arm64,BUILDTYPE 是 eng 。

BUILD 指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境,例如 aosp_arm64-eng 中的 aosp(Android Open Source Project) 代表 Android 开源项目,arm 表示系统是运行在 arm 架构的处理器上的,arm64 则是指 64 位 arm 架构处理器

想查看 Android 设备的 cpu 架构,可以执行命令:adb shell getprop ro.product.cpu.abi

BUILDTYPE 指的是编译类型,通常有三种:

user:表示编译出的系统镜像版本可以用来正式发布到市场,这个版本是不能 root 的

userdebug:在 user 版本的基础上开放了 root 权限和 debug 权限

eng:表示开发工程师版本,拥有 root 权限,此外还附带了许多 debug 工具

如果我们在终端输入 lunch 命令,将会列出所有的编译目标:

步骤 7:开始编译(设置8个线程同时编译):

复制代码
m -j8

参与编译的线程并不是越多越好,通常是根据你机器 cup 的核心来确定,公式为:core * 2,即当前 cpu 的核心的 2 倍。

我们可以执行 cat /proc/cpuinfo| grep "cpu cores"| uniq 命令查看电脑 cpu 的核心数。

如果编译过程一切顺利,我们会在终端看到如下画面,表示编译成功!

步骤 8:如果我们 lunch 选中的编译目标是 1-6, 那么我们可以直接执行如下命令运行虚拟机看效果了:

复制代码
emulator

稍等片刻,我们就可以在虚拟机上操作我们刚刚编译成功系统固件了。

如果我们 lunch 选中的编译目标是非 1-6, 那么我们可以编译的固件运行在真机上,具体步骤如下。

步骤 9:进入 fastboot 模式

复制代码
adb reboot bootloader

步骤 10:解锁引导加载程序

复制代码
fastboot flashing unlock

步骤 11:刷写设备

复制代码
fastboot flashall -w

-w 选项会擦除设备上的 /data 分区;该选项在第一次刷写特定设备时可以加上,其他情况下不加也行。

刷写顺利的话,终端打印如下画面,则说明刷机成功了,此时机器会自动重启,稍等机器自动重启即可。

如果不想刷写所有分区,可以单独刷写某个指定分区,具体的命令为:

复制代码
fastboot flash <分区名> <镜像文件名.img>

其中,<分区名> 指的是要刷写到哪个分区,比如 system、userdata 等;<镜像文件名.img> 指的是要刷写的 img 文件名称。

例如,如果想单独刷写 system.img,则可以输入以下命令:

复制代码
fastboot flash system system.img

刷写完成后,不能直接简单的重启设备。需要执行以下命令来重新启动设备:

复制代码
fastboot reboot

该命令会使设备从 fastboot 模式退出,并自动重启到正常的 Android 系统中。

2. 生成IDE导入的工程文件

复制代码
$ source build/envsetup.sh
$ make idegen
### 或者 mmm development/tools/idegen/
$ development/tools/idegen/idegen.sh

执行完成后,在AOSP根目录下生成文件

复制代码
android.iml # 导入前需先编辑这个文件
android.ipr # 在Android studio中打开这个文件,导入源码工程

3. 导入前,编辑工程文件

(这步很重要,影响代码的加载速度和跳转)

编辑android.iml文件,需要修改2部分内容:

1)增加excludeFolder列表,排除不需要的源码路径,这样可以加快导入和创建文件索引的速度。在.iml文件中有少了的excludeFolder项,在后面根据自己需要补充即可。例如:

复制代码
<excludeFolder url="file://$MODULE_DIR$/abi"/>
<excludeFolder url="file://$MODULE_DIR$/art"/>
<excludeFolder url="file://$MODULE_DIR$/bionic"/>
<excludeFolder url="file://$MODULE_DIR$/bootable"/>
<excludeFolder url="file://$MODULE_DIR$/build"/>
<excludeFolder url="file://$MODULE_DIR$/cts"/>
<excludeFolder url="file://$MODULE_DIR$/dalvik"/>
<excludeFolder url="file://$MODULE_DIR$/developers"/>
<excludeFolder url="file://$MODULE_DIR$/development"/>
<!-- <excludeFolder url="file://$MODULE_DIR$/device"/> -->
<excludeFolder url="file://$MODULE_DIR$/docs"/>
<excludeFolder url="file://$MODULE_DIR$/external"/>
<!-- <excludeFolder url="file://$MODULE_DIR$/hardware"/> -->
<excludeFolder url="file://$MODULE_DIR$/kernel"/>
<!-- <excludeFolder url="file://$MODULE_DIR$/libcore"/> -->
<excludeFolder url="file://$MODULE_DIR$/libnativehelper"/>
<excludeFolder url="file://$MODULE_DIR$/ndk"/>
<excludeFolder url="file://$MODULE_DIR$/out"/>
<excludeFolder url="file://$MODULE_DIR$/pdk"/>
<excludeFolder url="file://$MODULE_DIR$/platform_testing"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilts"/>
<excludeFolder url="file://$MODULE_DIR$/sdk"/>
<!-- <excludeFolder url="file://$MODULE_DIR$/system"/> -->
<excludeFolder url="file://$MODULE_DIR$/tools"/>
<!-- <excludeFolder url="file://$MODULE_DIR$/vendor"/> -->
<excludeFolder url="file://$MODULE_DIR$/toolchain"/>
<excludeFolder url="file://$MODULE_DIR$/compatibility"/>
<excludeFolder url="file://$MODULE_DIR$/compatibility"/>
<excludeFolder url="file://$MODULE_DIR$/test"/>

说明:也可以通过修改development/tools/idegen/excluded-paths文件,增加排除的路径。

2)删除所有...项。这些项是引用的源码中编译出来的jar包,如果保留,在浏览过程中查看类型跳转到这些jar中的class文件,而不是源码java文件。删除后,则可以直接跳转到源码文件。

说明:这些设置也可以在Android studio:project structure - project settings - modules - dependencies中修改,速度比较慢,不如直接编辑.iml文件方便。

例如:

复制代码
<orderEntry type="module-library">
  <library>
    <CLASSES>
      <root url="jar://$MODULE_DIR$/./AMSS/lagvm/LINUX/android/out/target/product/prodname/system/framework/locksettings.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>
</orderEntry>
<orderEntry type="module-library">
  <library>
    <CLASSES>
      <root url="jar://$MODULE_DIR$/./AMSS/lagvm/LINUX/android/out/target/product/prodname/system/framework/framework.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>

4. 在Android Studio中导入工程

在Android Studio中open打开上面生成的android.ipr文件。如果完成了上面的编辑,并且仅保留所需的源码目录,加载时间会比较短。

加载完成后,可以完整的浏览、编辑代码了。

当关闭AS时,会把当前的配置和索引保存到文件android.iws中。以后再次打开工程就会很快。

修改Android Studio配置参数:

复制代码
1)Help - Edit custom Properties:  
	(对应配置文件:~/.config/Google/AndroidStudio$version/idea.properties)
	idea.max.intellisense.filesize=100000
2)Help - Edit custom VM options:
	(对应配置文件:~/.config/Google/AndroidStudio$version/studio64.vmoptions)
	-Xms1g
	-Xmx5g

如果修改参数错误,导致studio不能正常启动,可以手动编辑对应的配置文件,删除或者调整相关参数。

相关推荐
三少爷的鞋7 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
Dovis(誓平步青云)11 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码13 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程13 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程16 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程17 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓18 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程18 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer