自己编译安卓系统实践

article/2025/10/11 16:35:06

一、需要的环境和信息来源

版本号与驱动匹配表:https://developers.google.com/android/drivers#hammerheadmra58k

android细分版本号:https://source.android.com/setup/start/build-numbers?hl=zh_cn

编译环境需求:https://source.android.google.cn/setup/build/older-versions

镜像使用帮助:https://mirrors.ustc.edu.cn/help/aosp.html

此处我们编译 :android-10.0.0_r17

二、实践

1、安装 Ubuntu 20.04 
2、设置语言与更新源,推荐ustc.edu.cn    中科大镜像源
3、下载初始化包并解压(aosp源码)

(1)mkdir ~/bin(2) cd ~/bin(3) wget https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tarwget可以使用-c选项,来支持断点下载(4)md5sum aosp-latest.tar 计算MD5值是否与网站一致(5) tar xvf aosp-latest.tar

 注意:解压后一定要保存快照

2、配置git

sudo apt-get install git
git config --global user.email 80491636@qq.com
git config --global user.name "zhangkai"

此处可在根目录中找到.gxxxx的文件  cat 查看后就是设置的邮箱和名称

3、安装repo工具

#mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo

4、安装python
注意,ubuntu默认是安装的有python的,执行python3可以查看到版本.(无需操作,略过此步)
增加软连接python:

sudo ln -s /usr/bin/python3.8 /usr/bin/python3sudo ln -s /usr/bin/python2.7 /usr/bin/python

5、初始化仓库
(1)初始化特定android版本:

cd ~/bin/aosp
#repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.4.4_r1
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r17

显示:repo has been initialized in /home/zhangkai/bin/aosp 表示初始化完成

(2)输入:

repo sync

6、安装依赖和JDK8:

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 libncurses5sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk

7、安装驱动
根据 版本号与驱动匹配表 找到对应驱动下载到aosp目录下,解压后 ./命令运行。
会在vendor目录下生成文件
运行文件时需要根据提示输入:I ACCEPT

8、编译系统

make clobber
source build/envsetup.sh
lunch    
make -j8      (-j后面是分配的线程,根据电脑配置酌情设置)

lunch的选择

在官方安装包中:https://developers.google.com/android/images#hammerhead

找到自己手机对应的名字。例如:Nexus5

编译完成后会在 out 目录中生成相应的文件,具体的系统和对应生成的文件自己再查。

nexus5 4.4 生成在out/target/product/generic下 recovery.img,boot.img,system.img,cache.img,userdata.img

下载同版本官方安装包,将文件替换后 flash-all.bat 自动执行刷机

问题集锦:
fatal:不能重置索引文件至版本号 'xxxx'。
解决方法:
cd ~/bin/aosp/.repo/repo
git pull
cd ~/bin/aosp
再次repo init 和 repo sync

编译 android-4.4.4_r1        (看雪视频中用到的就是这个版本)

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.4.4_r1


/*******************    JDK6的安装:        **********************/

下载:https://www.oracle.com/java/technologies/javase-java-archive-javase6-downloads.html
这里下载的是:jdk-6u45-linux-x64.bin然后,可以把它放置在任何你喜欢的文件夹,建议把它放置到主文件夹(/home/*)下。
下面开始安装jdk:
在网上查的一些资料上都是把jdk安装在/usr/lib/jvm/jdk下面,也有安装在/opt下的,我在这里介绍的就是把它安装在了/opt下,
终端下进入你存放jdk-6u10-linux-i586.bin

sudo chmod 755 jdk-6u10-linux-i586.bin // 将文件赋于运行权限,一般我都改777sudo -s ./jdk-6u10-linux-i586.bin /opt

一路回车,直到询问是否安装,输入yes回车   (直接敲一个大写的A加车更好,)
[如果此命令执行完毕,安装目录并不是在/opt下,而是你自己的帐户目录下,请将整个文件夹移动到/opt 中,并给出适当的权限]

ok,安装完毕,下面配置环境变量

配置classpath,修改所有用户的环境变量

sudo vi /etc/profile

在文件最后添加

#set java environmentJAVA_HOME=/opt/jdk1.6.0_45export JRE_HOME=/opt/jdk1.6.0_45/jreexport CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

执行环境变量 source /etc/profile


/***************    make 降低版本    *************************/
解决步骤:

1、下载 3.81 或 3.82 版本的 make 压缩包

wget https://ftp.gnu.org/gnu/make/make-3.82.tar.gz

2、将 make 压缩包放到 Ubuntu 任意目录下解压

tar -zxvf make-3.82.tar.gz

3、进入 make-3.81 目录

$./configure        (请先安装依赖和 sudo apt-get install gcc -y)$make

注意这里一般会报错。解决方案是,打开glob/glob.c,注释掉211行和232行。//符号为注释
重新执行

make clean
make
sudo make install

注意:中间一般不会出现错误,第三个命令必须加 sudo 给一个 root 权限,否则低版本的 make 安装不了。

4、查看 make 的版本(可能需要重新启动)

** make -v**

android4.4编译环境需要增加:

sudo apt-get install git gnupg flex bison gperf build-essential   zip curl libc6-dev x11proto-core-dev   g++-multilib  tofrodos   python-markdown libxml2-utils xsltproc

/ ************************** 手动刷机步骤        ******************/

Google官方factory-image地址:https://developers.google.com/android/images#bullhead
我的Nexus 5对应下载的是image-hammerhead-m4b30z
将压缩包解压,并且将image-hammerhead-m4b30z里面的分区image也解压放到与flash-all脚本相同的目录。

adb devices        查看usb调试是否正常
fastboot devices    查看fastboot模式是否正常

这里不先加锁,再解锁,启动会无限重启或一直google界面。
fastboot oem lock        加锁
fastboot reboot-bootloader
fastboot oem unlock        解锁
fastboot reboot-bootloader

fastboot erase cache
fastboot erase userdata
fastboot erase boot
fastboot erase recovery
fastboot erase system

fastboot flash bootloader bootloader-hammerhead-hhz11k.img
fastboot reboot-bootloader

fastboot flash radio radio-hammerhead-m8974a-1.0.25.0.23.img
fastboot reboot-bootloader

fastboot flash recovery recovery.img
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash cache cache.img
fastboot flash userdata userdata.img

#fastboot format cache——清除手机缓存
#fastboot format userdata——清除用户数据
fastboot reboot —— 重启手机


http://chatgpt.dhexx.cn/article/vTAaCxJY.shtml

相关文章

Android 源码编译详解【合集篇】

Android 源码编译详解【一】:服务器硬件配置及机型推荐 做 Android系统开发多年,开发环境都是入职就搭建好了,入职时拿个账号密码就直接开始搞开发了,年初换了新公司,所有的项目都是刚起步,一切环境都要重新…

java枚举类型字段与mysql中数据类型映射关系

java枚举类型字段与mysql中数据类型映射关系 domain对象数据库字段swagger测试 domain对象 public class Business {/*** 商家类型*/private Integer type;/*** 状态*/private Integer status;}数据库字段 枚举值设置 swagger测试 type值设置为1,status值也设置…

java枚举类型的构造和get\set方法

可以看出枚举时和类平级的,是定义类级别的关键字 因为枚举都是直接用.xxx的形式,所以里面的值等都是静态的!!! 但是其也有get和set方法,构造方法等 常量 枚举(enum)类型是Java 5新…

Java枚举类型与泛型

一、枚举类型 1、使用枚举类型设置常量 以往设置常量,通常将常量放置在接口中,这样在程序中就可以直接使用,并且该常量不能被修改,因为在接口中定义常量时,该常量的修饰符为final与static。常规定义常量的代码如下所示…

【Java系列】深入解析枚举类型

序言 即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流 问题 思考一下这寄个问题&a…

Java枚举类型(enum)详解

文章目录 理解枚举类型枚举的定义枚举实现原理枚举的常见方法Enum抽象类常见方法编译器生成的Values方法与ValueOf方法 枚举与Class对象枚举的进阶用法向enum类添加方法与自定义构造函数关于覆盖enum类方法enum类中定义抽象方法enum类与接口 枚举与switch枚举与单例模式EnumMap…

java枚举数字_Java枚举类型的使用,数值的二进制表示

一.Java枚举类型的使用 首先请看这段代码: packagejava上课;public classEnumTest {public static voidmain(String[] args) {Size s=Size.SMALL; Size t=Size.LARGE;//s和t引用同一个对象? System.out.println(s==t);//是原始数据类型吗? System.out.println(s.getClass().…

java枚举类型赋值_java枚举类型(转载)

public class TestEnum { /*最普通的枚举*/ public enum ColorSelect { red, green, yellow, blue; } /* 枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样. */ public enum Season { // 枚举列表必须写在最前…

java 枚举类 int_【转】掌握java枚举类型(enum type)

原文网址:http://iaiai.iteye.com/blog/1843553 1 背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天。 Java代码 p…

java枚举类型转换_java枚举类型enum值与整数的转换

java编程中偶尔会用到枚举,为了直观,我们通常将枚举值设置为形象的单词,方便理解和使用。枚举类型相当于数据库 中字典表,但是枚举只有字典表的值,缺少其他用来表示和值一一对应的字段,当我们在数据库中保存…

Java中的枚举类型

文章目录 前言一、枚举类简介二、枚举底层原理总结 前言 这里复习一下Java中的枚举类型。实际上,枚举类型是特殊的类,和C语言C中的枚举不太一样,下面我们做详细说明。关于枚举类型有一个单独的设计模式:即单例设计模式。单例类是…

Java枚举类型

目录 一、前言: 二、枚举类型: 三、底层原理 四、应用 应用一:定义常量 底层原理详解 应用二:添加新方法 应用三:与switch结合使用 应用四:实现接口 应用五:使用接口组织枚举 一、前言…

深入理解Java枚举类型(enum)

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/71333103 出自【zejian的博客】 关联文章: 深入理解Java类型信息(Class对象)与反射…

Python中对基本文件操作

Python中对基本文件操作 一、前言二、创建和打开文件1.打开一个不存在的文件时先创建该文件2.以二进制形式打开文件3.打开文件时指定编码方式 三、关闭文件四、打开文件时使用with语句五、写入文件内容六、读取文件1.读取指定字符2.读取一行3.读取全部行 一、前言 在Python中&a…

C语言——文件操作

文章目录 1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭 4. 文件的顺序读写4.1 fgetc与fputc4.2 fgets与fputs4.3 fscant与fprintf4.3.1 fprintf4.3.2 fscanf 4.4 fread与fwrite4.4.1 fwrite4.4.2 f…

C语言之文件操作

目录 为什么使用文件 文件名 文件指针 流 文件的打开和关闭 前言 文件的打开方式 文件打开关闭函数 fopen函数 fclose函数 文件的顺序读写 fputc函数 fgetc函数 fputs函数 fgets函数 fprintf函数 fscanf函数 fwrite函数 fread函数 文件的随机读写 fseek函…

文件操作(图解)

文件操作 1、文件是什么?1.1 程序文件1.2 数据文件1.3 文件名 2、文件的打开和关闭2.1 文件指针2.2 文件的打开和关闭 3、文件的顺序读写4、文件的随机读写4.1 fseek4.2 ftell4.3 rewind 5、文本文件和二进制文件6、文件读取结束的判定6.1 被错误使用的feof 7、文件…

C++中的文件操作

目录 文件操作C中的文件操作时基于面向对象的C中文件类型分为两种:操作文件的三大类(这些类都属于标准模板库):1 文本文件1.1 写文件写文件步骤如下:文件打开方式: 1.2 读文件读取文件数据的四种方式按照喜好记前三个中…

什么是文件操作?为什么要有文件操作?

文章目录 前言一、什么是文件1.1 程序文件1.2 数据文件 二、文件的打开与关闭2.1 文件指针2.2 文件的打开与关闭2.3 文件读写详情表!(重点)2.4 文件的顺序读写!(重点)2.5 文件的随机读写2.5.1 fseek2.5.2 f…

常见文件操作函数

目录 一、文件的打开和关闭 1、文件指针 2、文件打开和关闭 二、文件的顺序读写 1、fgetc()和fputc()函数 2、fgets()和fputs()函数 3、fscanf()和fprintf()函数 4、fread()和fwrite()函数 三、文件的随机读写 1、fseek函数 2、ftell函数 3、rewind函数 四、文本文…