编译Android14 AOSP原生代码并运行X86模拟器镜像过程记录

最近在研究Android Entreprise部分的特性,需要在Android手机上分析WorkProfile相关的源码,因为新买的Pixel样机还未到货,看了几天Android源码,迫切需要上真机对比分析。

又听说最近几年Android模拟器已经有些进步,至少性能比以前好多了,于是打算把Android Studio中废弃多年的AVD跑起来。一试,果真性能有进步,不算流畅,但点击操作没以前那种老马拉大车的感觉,所以打算切换到模拟器环境下,凑合用几天等真机。

当前,因为涉及framework中代码逻辑的变化,迫切要解决模拟器镜像不能修改的问题,摸索加查资料几天,过程记录如下

1.编译准备

编译环境是Ubuntu20.04,Hyper-V上安装的虚拟机,20G内存,NVME1T硬盘。安装编译依赖:

$ sudo apt update
$ sudo apt install flex bison build-essential 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 fontconfig -y
$ sudo apt install make git-core gnupg zip unzip curl python3 openjdk-11-jdk -y

安装repo:

$ echo `export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'` >> ~/.bashrc 
$ source ~/.bashrc 

下载代码:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r2
repo sync -c -j8

android版本tag可以从如下页面中查询

https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

2.编译过程

因为是模拟器,选择x86

$ cd ~/aosp
$ source build/envsetup.sh
$ lunch aosp_x86_64-eng
$ make -j8

正常就可以编译成功,内存建议16G以上,否则开头会报警,实际编译也会报奇怪问题

如果是报内存问题,建议如下解决:

export MAVEN_OPTS="-Xms5120m -Xmx5120m"
export _JAVA_OPTIONS="-Xmx5120m"
# 也可以添加 .bashrc 最后,修改.bashrc记得source .bashrc#记得清除out目录,重编译
rm -rf out  

实际编译,还出现了怪异问题,后来通过重新创建并扩大swap区解决

解决过程:

1. 查看交换区大小
free -m 
2. 关闭原来的swap文件
sudo swapoff /swapfile
3. 删除原来的swpa文件
sudo rm /swapfile
4. 重新创建spap文件
sudo dd if=/dev/zero of=/swapfile bs=1G count=16
5. 赋予权限
sudo chmod 0600 /swapfile
6.创建文件系统
sudo mkswap -f /swapfile
7. 开启swapfile
sudo swapon /swapfile

3.替换模拟器

通过Android Studio下载模拟器文件路径一般在如下目录,其中xxxx是全局变量[ANDROID_SDK_HOME]所在位置,默认在C:\Users\xxxx\.android

xxxxxx/.android\avd\Pixel_7_API_34.avd

在上述目录下查看,是没有一般常识中的system.img,vendor.img的,这些文件实际位置在Android SDK中

例如:D:\Tools_dev\AndroidSDK\system-images\android-34\default\x86_64

D:\Tools_dev\AndroidSDK就是Android SDK所在目录

然后就好办了,首先确认我编译的是Android 14,对于api level是34,那么替换android-34\default\x86_64目录下的文件;我的电脑中实际还有个android-34\google_apis_playstore\x86_64目录,盲猜是带gms版本的,我用不上,没管。

第一步:

拷贝文件:把out\target\product\generic_x86_64下编译好的镜像文件重命名

system-qemu.img=>system.img

ramdisk.img--保持现状

vender-qemu.img=>vender.img

prebuilt/sdk/linux-kernel/kernel-ranchu-64-保持现状

system/build.prop-保持现状

把这几个文件改名替换到模拟器所在目录[android-34\default\x86_64]中,替换同名文件

第二步:
到AVD Manager中wipe data,然后重启模拟器
 

4. 模拟器运行

这个就不多说了

5.小技巧

如果仅是替换framework中的个别文件,例如service.jar,因为编译的镜像是有root的,所以可以直接替换,但实际需要改如下文件,把odex版本改成dex版本,方能替换成功。

1)build\make\core\board_config.mkWITH_DEXPREOPT := true  改为 WITH_DEXPREOPT := false2)build\make\core\dex_preopt_config.mk注释掉 :##$(call pretty-error, DEXPREOPT must be enabled for user and userdebug builds)然后重新编译出system.img,这个img里面的jar包,apk都是可以替换的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263828.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下分卷解压文件

我的文件是这样的: 存放路径为:C:\Users\Luli_study\MICCAI_MMAC\fudanuniversity\DDR dataset 首先要进入分卷文件的目录cd: 第一步:cd /path/o/分卷问文件目录 第二步: 执行之后的结果(红色框出来的): …

MySQL进阶学习--day01

存储引擎介绍 1. MySQL体系结构2. 存储引擎介绍2.1 存储引擎操作2.2 示例演示 1. MySQL体系结构 连接层(Connection Layer):连接层主要负责与客户端建立连接,并进行用户身份验证和权限验证。在这一层,MySQL 接收来自客…

Cache替换算法

目录 一. 随机算法(RAND)二. 先进先出算法(FIFO)三. 近期最少使用算法(LRU)四. 最不经常使用算法(LFU) 要解决的问题: Cache很小,主存很大。如果cache满了怎么办? \quad 也要关注各种算法的英文缩写 \quad 一. 随机算法(RAND) \quad 随机算法―一实现简…

Verilog基础:$random系统函数的使用

相关阅读 Verilog基础​编辑https://blog.csdn.net/weixin_45791458/category_12263729.html $random系统函数语法的BNF范式如下所示,有关BNF范式相关内容,可以浏览以往文章Verilog基础:巴科斯范式(BNF)。 $random系统函数在每次调用时返回一…

HarmonyOS应用开发者基础认证考试(稳过)

判断题 ​​​​​​​ 1. Web组件对于所有的网页都可以使用zoom(factor: number)方法进行缩放。错误(False) 2. 每一个自定义组件都有自己的生命周期正确(True) 3. 每调用一次router.pushUrl()方法,默认情况下,页面栈数量会加1,页面栈支持的…

史上最全MySQL各种锁详解

锁详解 锁是计算机协调多个进程或线程并发访问某一资源的机制。 MySQL锁可以按模式分类为:乐观锁与悲观锁。按粒度分可以分为全局锁、表级锁、页级锁、行级锁。按属性可以分为:共享锁、排它锁。按状态分为:意向共享锁、意向排它锁。按算法分…

Leetcode—337.打家劫舍III【中等】

2023每日刷题(五十二) Leetcode—337.打家劫舍III 算法思想 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…

表格的介绍与实战(详细且有案例)

目录​​​​​​​​​​​​​​ 表格的主要作用: 表格的基本语法: 表格相关的标签 合并单元格: 实战: 表格的主要作用: 表格主要是用来展示数据的,使用表格来展示数据,数据可读性更好…

【MySQL表的约束】

目录: 前言表的约束1、空属性2、默认值空属性与默认值 3、列描述4、zerofill5、主键约束6、自增长7、唯一键约束8、外键约束 前言 剑指offer:一年又5天 表的约束 我们上一篇文章所讲的数据类型也是一种约束–不同类型有对应的数据范围;约束…

phpstudy小皮(PHP集成环境)下载及使用

下载 https://www.xp.cn/download.html直接官网下载即可,下载完解压是个.exe程序,直接点击安装就可以,它会自动在D盘目录为D:\phpstudy_pro 使用 phpMyAdmin是集成的数据库可视化,这里需要下载一下,在软件管理-》网站程…

基于ssm鲸落文化线上体验馆论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本鲸落文化线上体验馆就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信…

Linux权限详解

Linux权限 文章目录 Linux权限一、root账号与普通账号二、Linux权限管理三、权限权值表示方法四、文件访问权限的设置方法五、粘滞位六、权限总结 前言: 我们在学习Linux的时候,我们知道在Linux下一切皆文件,而不同的文件对于不同的用户有不同…