树莓派编译 android,RPI3: 在树莓派3上运行ANDROID 8.1系统
Android 官方并没有提供可运行在树莓派3上的Android系统,而只提供了AndroidThings系统,并且还只是preview的版本。想在树莓派上运行Android 8.1系统,就需要自己动手修改。
幸好官方提供了AndroidThings preview 6的系统,这使得让树莓派3运行Android 8.1系统难度大大降低。
准备工作
1. 官方提供的AndroidThing preview 6的镜像
2. Ubuntu 14.04系统,用于编译Android系统
3. Android 8.1源代码,这里使用的版本为android-8.1.0_r2, 源代码可以从(https://lug.ustc.edu.cn/wiki/mirrors/help/aosp)下载
提取文件
这里我需要从AndroidThings preview 6中提取整个分区及system分区中的部份文件
用如下命令将镜像文件进行拆分:
#! /bin/bash
mkdir -v SPLIT
sgdisk -p iot_rpi3.img | tail -n +10 | while read line
do
ARRAY=(${line})
start=${ARRAY[1]}
end=${ARRAY[2]}
name=${ARRAY[6]}
echo "=> START: ${start}, END: ${end}, NAME: ${name}"
dd if=iot_rpi3.img of=SPLIT/${name}.img skip=${start} bs=512 count=$((${end} - ${start} + 1))
done
我们只需要保留如下分区文件:
boot_a.img oem_a.img rpiboot.img system_a.img vendor_a.img
从system_a.img中提取如下文件:
.
+-- fstab.rpi3
+-- init.rpi3.rc
+-- system
| +-- bin
| | `-- surfaceflinger
| `-- lib
| +-- android.frameworks.displayservice@1.0.so
| +-- android.frameworks.vr.composer@1.0.so
| +-- android.hardware.boot@1.0.so
| +-- android.hardware.configstore@1.0.so
| +-- android.hardware.configstore-utils.so
| +-- android.hardware.graphics.allocator@2.0.so
| +-- android.hardware.graphics.bufferqueue@1.0.so
| +-- android.hardware.graphics.common@1.0.so
| +-- android.hardware.graphics.composer@2.1.so
| +-- android.hardware.graphics.mapper@2.0.so
| +-- android.hardware.media@1.0.so
| +-- android.hardware.power@1.0.so
| +-- android.hardware.usb@1.0.so
| +-- android.hardware.wifi@1.0.so
| +-- android.hardware.wifi@1.1.so
| +-- android.hardware.wifi.supplicant@1.0.so
| +-- android.hidl.token@1.0.so
| +-- android.hidl.token@1.0-utils.so
| +-- hw
| | +-- android.hidl.memory@1.0-impl.so
| | +-- audio.a2dp.default.so
| | +-- audio.primary.rpi3.so
| | +-- bluetooth.default.so
| | +-- bootctrl.bcb.so
| | +-- bootctrl.default.so -> bootctrl.bcb.so
| | +-- camera.v4l2.so
| | +-- gps.iot.so
| | +-- gralloc.rpi3.so
| | +-- keystore.default.so
| | +-- lights.rpi3.so
| | +-- memtrack.dummy.so
| | +-- peripheral_io.rpi3.so
| | `-- sensors.iot.so
| `-- libsurfaceflinger.so
`-- ueventd.rpi3.rc
从源代码开始编译Android系统
android-8.1.0_r2的代码从这里下载:https://lug.ustc.edu.cn/wiki/mirrors/help/aosp
文件结构如下:
O-8.1.0_r2-rpi3b/
`-- device
`-- brobwind
`-- rpi3
+-- AndroidProducts.mk
+-- BoardConfig.mk
+-- init.mini-emulator.rc
+-- mini_emulator_common.mk
+-- overlay
| `-- frameworks
| `-- base
| `-- core
| `-- res
| `-- res
| `-- values
| `-- config.xml
+-- root
| +-- fstab.rpi3
| +-- init.rpi3.rc
| +-- system
| | +-- bin
| | | `-- surfaceflinger
| | `-- lib
| | +-- android.frameworks.displayservice@1.0.so
| | +-- android.frameworks.vr.composer@1.0.so
| | +-- android.hardware.boot@1.0.so
| | +-- android.hardware.configstore@1.0.so
| | +-- android.hardware.configstore-utils.so
| | +-- android.hardware.graphics.allocator@2.0.so
| | +-- android.hardware.graphics.bufferqueue@1.0.so
| | +-- android.hardware.graphics.common@1.0.so
| | +-- android.hardware.graphics.composer@2.1.so
| | +-- android.hardware.graphics.mapper@2.0.so
| | +-- android.hardware.media@1.0.so
| | +-- android.hardware.power@1.0.so
| | +-- android.hardware.usb@1.0.so
| | +-- android.hardware.wifi@1.0.so
| | +-- android.hardware.wifi@1.1.so
| | +-- android.hardware.wifi.supplicant@1.0.so
| | +-- android.hidl.token@1.0.so
| | +-- android.hidl.token@1.0-utils.so
| | +-- hw
| | | +-- android.hidl.memory@1.0-impl.so
| | | +-- audio.a2dp.default.so
| | | +-- audio.primary.rpi3.so
| | | +-- bluetooth.default.so
| | | +-- bootctrl.bcb.so
| | | +-- bootctrl.default.so -> bootctrl.bcb.so
| | | +-- camera.v4l2.so
| | | +-- gps.iot.so
| | | +-- gralloc.rpi3.so
| | | +-- keystore.default.so
| | | +-- lights.rpi3.so
| | | +-- memtrack.dummy.so
| | | +-- peripheral_io.rpi3.so
| | | `-- sensors.iot.so
| | `-- libsurfaceflinger.so
| `-- ueventd.rpi3.rc
+-- rpi3.mk
+-- system.prop
+-- vendor.img
`-- vendorsetup.sh
编译完成之后,我们只需要最终生成的system img.
创建开机磁盘镜像
将上一步骤生成的system image替换掉SPLIT目录下的system_a.img, 然后执行如下脚本生成我们所需的磁盘镜像:
#! /bin/bash
#Disk iot_rpi3.img: 8912896 sectors, 4.2 GiB
#Logical sector size: 512 bytes
#Disk identifier (GUID): B4E0B8F7-2781-4463-B8F6-C5E9739823BC
#Partition table holds up to 128 entries
#First usable sector is 34, last usable sector is 8912862
#Partitions will be aligned on 8-sector boundaries
#Total free space is 13 sectors (6.5 KiB)
#
#Number Start (sector) End (sector) Size Code Name
# 1 40 131111 64.0 MiB FFFF rpiboot
# 2 131112 133159 1024.0 KiB FFFF uboot_a
# 3 133160 135207 1024.0 KiB FFFF uboot_b
# 4 135208 200743 32.0 MiB FFFF boot_a
# 5 200744 266279 32.0 MiB FFFF boot_b
# 6 266280 1314855 512.0 MiB FFFF system_a
# 7 1314856 2363431 512.0 MiB FFFF system_b
# 8 2363432 2363559 64.0 KiB FFFF vbmeta_a
# 9 2363560 2363687 64.0 KiB FFFF vbmeta_b
# 10 2363688 2365735 1024.0 KiB FFFF misc
# 11 2365736 2496807 64.0 MiB FFFF vendor_a
# 12 2496808 2627879 64.0 MiB FFFF vendor_b
# 13 2627880 4086055 712.0 MiB FFFF oem_a
# 14 4086056 5544231 712.0 MiB FFFF oem_b
# 15 5544232 5552423 4.0 MiB FFFF oem_bootloader_a
# 16 5552424 5560615 4.0 MiB FFFF oem_bootloader_b
# 17 5560616 5626151 32.0 MiB FFFF factory
# 18 5626152 5658919 16.0 MiB FFFF factory_bootloader
# 19 5658920 8912847 1.6 GiB FFFF userdata
# 20 8912848 8912855 4.0 KiB FFFF gapps
#SGDISK=/data/O-8.1.0_r2-rpi3b/out/host/linux-x86/bin/sgdisk
SGDISK=sgdisk
GDISK=gdisk
DD=dd
source=iot_rpi3.img
target=iot.img
DINFO="`${SGDISK} --print ${source}`"
sectors=`echo "${DINFO}" | head -n 1 | sed 's/.*:[[:space:]]*\([[:digit:]]\+\).*/\1/g'`
sector_size=`echo "${DINFO}" | head -n 2 | tail -n 1 | sed 's/.*:[[:space:]]*\([[:digit:]]\+\).*/\1/g'`
if [ ! -f ${target} ] ; then
dd if=/dev/zero of=${target} bs=${sector_size} count=${sectors}
fi
echo " => Clear partition table ..."
${SGDISK} --clear ${target}
echo " => Install GPT partition table ..."
${SGDISK} --set-alignment=1 $(echo "${DINFO}" | tail -n +10 | while read line
do
ARRAY=(${line})
num=${ARRAY[0]}
start=${ARRAY[1]}
end=${ARRAY[2]}
label=${ARRAY[6]}
uuid=`${SGDISK} --info ${num} ${source} | head -n 1 | sed 's/.*: \([0-9A-Z-]\+\).*/\1/g'`
echo "--new=${num}:${start}:${end} --typecode=${num}:${uuid} --change-name=${num}:${label}"
done) ${target}
echo " => Install hybrid MBR partitoin table ..."
${GDISK} << EOF ${target}
r
h
1
N
06
N
N
w
Y
EOF
echo " => Install images ...."
echo "${DINFO}" | tail -n +10 | while read line
do
ARRAY=(${line})
start=${ARRAY[1]}
end=${ARRAY[2]}
label=${ARRAY[6]}
if [ -f SPLIT/${label}.img ] ; then
echo " => Install: ${label} images ..."
${DD} if=SPLIT/${label}.img of=${target} conv=notrunc bs=${sector_size} count=$((${end} - ${start} + 1)) seek=${start}
fi
done
最终会在当前目录下生成iot.img文件。
写入磁盘镜像文件
将iot.img文件写入到TF卡中,可通过dd命令
树莓派编译 android,RPI3: 在树莓派3上运行ANDROID 8.1系统相关推荐
- 安卓 qemu 运行linux,在Qemu的beagleboard上运行Android
如之前的文章提到的,现在我们已经可以在Ubuntun上通过qemu模拟beagleboard了,进一步可以测试的是在这个qemu的beagleboard上运行Android. 相关阅读: 主要工作是制 ...
- 微软程序在Android上跑,想在Win 10上运行Android应用?这类手机用户已经可以尝鲜...
在Win 10上运行Android应用?这听起来有些异想天开,可实实在在的需求却在这里,毕竟微软Windows体系内的无缝切换,离开了手机平台始终有些怪怪的,自然,微软也不会甘心放弃,最好的办法,莫过 ...
- Android 借助Stetho在Chrome上调试Android网络、数据库、Sharedpreferences
Android 借助Stetho在Chrome上调试Android网络.数据库.Sharedpreferences 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/a ...
- bliss android x86,Bliss OS现在可让您基于Android-x86和AOSP在PC上运行Android 10
Bliss OS是一个基于Android-x86项目的开源操作系统,有望让您在任何Linux,Windows或Chromebook PC或平板电脑设备上运行最新的Android 10移动操作系统. B ...
- android x86 oreo,Android-x86 8.1 RC1发布:PC上运行Android Oreo
IT之家6月19日消息 在PC上运行Android系统的方式很多,但最可靠的还是Android-x86项目,现在其最新版已经发布,基于Android 8.1 Oreo. Android-x86是在PC ...
- android phone win10下载,微软Your Phone新功能: 可在Win 10 PC 上运行 Android 应用程序...
今年 8 月,微软发布了一项 Your Phone 重大功能,可以在 Windows 10 PC 上运行 Android 应用程序.该功能主要通过 Your Phone 应用将 Android 应用投 ...
- 手把手教程 | 使用 NICE DCV 在 G4 实例上运行 Android 应用程序
随着Android应用程序和游戏变得越来越丰富,其中有些甚至比PC上的软件更易于使用和娱乐,因此许多人希望能够在云上运行Android游戏或应用程序,而在EC2实例上运行Android的解决方案可以让 ...
- anbox 使用情况_Anbox让您在Linux桌面上运行Android应用程序
Anbox让您在Linux桌面上运行Android应用程序 imcn 2017年4月13日 1条评论 阅读 18,083 次 认识一下Anbox,一种新颖的在Linux桌面上运行Android应用的新 ...
- 如何在PC上运行Android系统?
如果你希望在x86机或者x64电脑上安装Android的开源解决方案,那么不妨了解下Android-x86项目发布的最新版本,目前已经基于Android Oreo 8.1.固然在PC上运行Androi ...
最新文章
- 公众号python训练营真的假的_python中的这些坑,早看早避免。
- 各个平台的mysql重启命令
- C#中跨线程访问控件问题解决方案
- 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love exam(背包)
- centos7如何安装cloud-init
- 战斗系统的伪原创工具
- 微软的报表工具 SQL Server 2000 Reporting Services 评估版
- js基本函数和基本方法
- HtmlUnit初探
- 9. PHP 字符串
- android快速充电实现_Android 8.0 慢充和快充提示语的实现原理
- Python爬虫实现isbn查询豆瓣书籍详细信息
- 泛函分析 01.03 距离空间-开集和连续映射
- linux 查看 man 路径配置文件 man.config,linux man 1,2,3....
- 基于matlab 宗晓萍,宗晓萍 - 河北大学 - 电子信息工程学院
- 计算机二级ms高级应用选择题,2016计算机二级考试MsOffice高级应用练习题
- 三个字母的单词颠倒也是单词_世界上最强大的两个字母的单词
- 七大视频剪辑软件,达人必备,你用过几个?
- [水晶报表]水晶报表数据库登陆问题
- 加入windows7 正版大家庭