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系统相关推荐

  1. 安卓 qemu 运行linux,在Qemu的beagleboard上运行Android

    如之前的文章提到的,现在我们已经可以在Ubuntun上通过qemu模拟beagleboard了,进一步可以测试的是在这个qemu的beagleboard上运行Android. 相关阅读: 主要工作是制 ...

  2. 微软程序在Android上跑,想在Win 10上运行Android应用?这类手机用户已经可以尝鲜...

    在Win 10上运行Android应用?这听起来有些异想天开,可实实在在的需求却在这里,毕竟微软Windows体系内的无缝切换,离开了手机平台始终有些怪怪的,自然,微软也不会甘心放弃,最好的办法,莫过 ...

  3. Android 借助Stetho在Chrome上调试Android网络、数据库、Sharedpreferences

    Android 借助Stetho在Chrome上调试Android网络.数据库.Sharedpreferences 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/a ...

  4. bliss android x86,Bliss OS现在可让您基于Android-x86和AOSP在PC上运行Android 10

    Bliss OS是一个基于Android-x86项目的开源操作系统,有望让您在任何Linux,Windows或Chromebook PC或平板电脑设备上运行最新的Android 10移动操作系统. B ...

  5. 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 ...

  6. android phone win10下载,微软Your Phone新功能: 可在Win 10 PC 上运行 Android 应用程序...

    今年 8 月,微软发布了一项 Your Phone 重大功能,可以在 Windows 10 PC 上运行 Android 应用程序.该功能主要通过 Your Phone 应用将 Android 应用投 ...

  7. 手把手教程 | 使用 NICE DCV 在 G4 实例上运行 Android 应用程序

    随着Android应用程序和游戏变得越来越丰富,其中有些甚至比PC上的软件更易于使用和娱乐,因此许多人希望能够在云上运行Android游戏或应用程序,而在EC2实例上运行Android的解决方案可以让 ...

  8. anbox 使用情况_Anbox让您在Linux桌面上运行Android应用程序

    Anbox让您在Linux桌面上运行Android应用程序 imcn 2017年4月13日 1条评论 阅读 18,083 次 认识一下Anbox,一种新颖的在Linux桌面上运行Android应用的新 ...

  9. 如何在PC上运行Android系统?

    如果你希望在x86机或者x64电脑上安装Android的开源解决方案,那么不妨了解下Android-x86项目发布的最新版本,目前已经基于Android Oreo 8.1.固然在PC上运行Androi ...

最新文章

  1. 公众号python训练营真的假的_python中的这些坑,早看早避免。
  2. 各个平台的mysql重启命令
  3. C#中跨线程访问控件问题解决方案
  4. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love exam(背包)
  5. centos7如何安装cloud-init
  6. 战斗系统的伪原创工具
  7. 微软的报表工具 SQL Server 2000 Reporting Services 评估版
  8. js基本函数和基本方法
  9. HtmlUnit初探
  10. 9. PHP 字符串
  11. android快速充电实现_Android 8.0 慢充和快充提示语的实现原理
  12. Python爬虫实现isbn查询豆瓣书籍详细信息
  13. 泛函分析 01.03 距离空间-开集和连续映射
  14. linux 查看 man 路径配置文件 man.config,linux man 1,2,3....
  15. 基于matlab 宗晓萍,宗晓萍 - 河北大学 - 电子信息工程学院
  16. 计算机二级ms高级应用选择题,2016计算机二级考试MsOffice高级应用练习题
  17. 三个字母的单词颠倒也是单词_世界上最强大的两个字母的单词
  18. 七大视频剪辑软件,达人必备,你用过几个?
  19. [水晶报表]水晶报表数据库登陆问题
  20. 加入windows7 正版大家庭

热门文章

  1. 《地理信息系统基础实例操作100例》-实验15 设置字段属性域(无法创建要素问题)
  2. html 任务列表,任务列表.html
  3. elementui dialog关闭遮罩还在---已解决
  4. 「API 接口获取方法」
  5. 机器学习之常见学习工具介绍
  6. Bank相关7_PBOC电子钱包与电子现金及QPBOC
  7. DTE和DCE的区分
  8. HTTP Sec-Fetch-*请求头
  9. 软文推广最终目的是什么?
  10. 2020年中国建筑防水行业市场现状及竞争格局分析,龙头企业跨区布局加速,尾部出清加快「图」