ubuntu20.04上编译android 7.1

一、安装 OpenJDK 8:

sudo apt-get install openjdk-8-jdk
提示:安装 openjdk-8-jdk,会更改 JDK 的默认链接,这时可用:
sudo update-alternatives --config java
sudo update-alternatives --config javac
来切换 JDK 版本。SDK 在找不到操作系统默认 JDK 的时候会使用内部设定的 JDK 路径,
因此,为了让同一台机器可以编译 Android 5.1 及之前的版本,去掉链接更方便:
sudo /var/lib/dpkg/info/openjdk-8-jdk:amd64.prerm remove

二、安装其他依赖包

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g+±multilib -y
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g+±multilib
sudo apt-get install libc6-dev-i386 -y
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
sudo apt install make make-guile -y
sudo apt-get install tofrodos -y
sudo apt-get install python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt install python
ln -s /usr/bin/python2 /usr/bin/python
sudo apt install libncurses5:i386

1.1 无法定位软件包 libesd0-dev

vim /etc/apt/sources.list
替换全部为下面的源

deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial main universe
deb-src https://mirrors.ustc.edu.cn/ubuntu/ xenial main universe

再执行下面命令
sudo apt-get update && sudo apt-get install libesd0-dev

1.2 下列软件包有未满足的依赖关系:

lib32ncurses5-dev : 依赖: libncurses5-dev (= 6.0+20160213-1ubuntu1)
解决办法:
sudo apt-get install lib32ncurses5
sudo apt-get install libncurses5
备用解决办法:
sudo ln -s /usr/lib/x86_64-linux-gnu/crt*.o /usr/lib
sudo ln -sf /lib/i386-linux-gnu/libncurses.so.5 /usr/lib32/libncurses.so
sudo ln -sf /lib/x86_64-linux-gnu/libncurses.so.5 /usr/lib/libncurses.so
sudo ln -s /lib/x86_64-linux-gnu/libz.so.1 /usr/lib/libz.so

1.3.下列软件包有未满足的依赖关系:

make : 冲突: make-guile 但是 4.2.1-1.2 正要被安装
make-guile : 冲突: make
暂无解决,只安装了make-guile

1.4.报错如下

flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? ‘cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ ???
Aborted (core dumped)
[ 4% 4832/99272] target C++: libapplypatch <= bootable/recovery/applypatch/bspatch.cpp
解决办法:
在~/.bashrc最后添加export LC_ALL=C
然后 source ~/.bashrc
解答: 添加export LC_ALL=C是去除本地C化,使得Android的编译工具与本地工具不冲突。

1.5. APK是通过Android Studio使用高版本的SDK Version(API Level 28)编译生成的,然后被放到了Android源码(API Level 25)中当作第三方APK来编译,编译出错

[ 35% 105/294] build out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/package.odex
FAILED: /bin/bash -c “(rm -f out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/package.odex ) && (mkdir -p out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/ ) && (ANDROID_LOG_TAGS=”*:e" out/host/linux-x86/bin/dex2oatd --runtime-arg -Xms64m --runtime-arg -Xmx512m --runtime-arg -classpath --runtime-arg “&” --boot-image=out/target/product/rk3399_mid/dex_bootjars/system/framework/boot.art --dex-file=device/rockchip/rk3399/benebot/BenebotHumanInterAction1.0.AudioService.apk --dex-location=/system/etc/benebot/BenebotHumanInterAction1.0.AudioService/BenebotHumanInterAction1.0.AudioService.apk --oat-file=out/target/product/rk3399_mid/obj/APPS/BenebotHumanInterAction1.0.AudioService_intermediates/oat/arm64/package.odex --android-root=out/target/product/rk3399_mid/system --instruction-set=arm64 --instruction-set-variant=cortex-a53 --instruction-set-features=default --include-patch-information --runtime-arg -Xnorelocate --no-generate-debug-info --abort-on-hard-verifier-error --no-inline-from=core-oj.jar --compile-pic )"
dex2oatd F 19250 19376 art/runtime/class_linker.cc:6620] Check failed: vtable_entry != other_entry && !name_comparator.HasSameNameAndSignature( other_entry->GetInterfaceMethodIfProxy(pointer_size)) vtable entries 1049 and 1054 are identical for java.lang.Class<android.support.v7.widget.MenuPopupWindow M e n u D r o p D o w n L i s t V i e w > i n m e t h o d i n t a n d r o i d . s u p p o r t . v 7. w i d g e t . D r o p D o w n L i s t V i e w . l o o k F o r S e l e c t a b l e P o s i t i o n ( i n t , b o o l e a n ) a n d i n t a n d r o i d . s u p p o r t . v 7. w i d g e t . M e n u P o p u p W i n d o w MenuDropDownListView> in method int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) and int android.support.v7.widget.MenuPopupWindow MenuDropDownListView>inmethodintandroid.support.v7.widget.DropDownListView.lookForSelectablePosition(int,boolean)andintandroid.support.v7.widget.MenuPopupWindowMenuDropDownListView.lookForSelectablePosition(int, boolean)
dex2oatd F 19250 19376 art/runtime/runtime.cc:422]Runtime abortin
原因:
源码编译会对apk进行一个解析,形成odex文件加速apk的运行,但是基于高版本的SDK开发的APK里的一些资源是无法被低版本正确的解析
解决方法:
要编译APK的Android.mk文件中添加如下一行:
LOCAL_DEX_PREOPT := false
本次编译是vendor\firefly\apps\FireflyDemo编译出错,所以找vendor\firefly\apps\FireflyDemo\Android.mk进行修改

99.编译一次某类型的,然后换编译另一种类型,出现报错前一次未完成:没有规则可制作目标“arch/arm64/boot/dts/rockchip/rk3399-firefly-aiojd4.dtb”。
make mrproper

二、编译

AIO-3399JD4产品编译方法
HDMI显示编译
./FFTools/make.sh -d rk3399-firefly-aiojd4 -j8 -l rk3399_firefly_aiojd4-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_aiojd4-userdebug
HDMI+lvds编译
./FFTools/make.sh -d rk3399-firefly-aiojd4-lvds-HSX101H40C -j8 -l rk3399_firefly_aiojd4_lvds-userdebug
./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_aiojd4_lvds-userdebug
手动编译AIO-3399JD4
编译前执行如下命令配置环境变量:

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
export CLASSPATH=.: J A V A H O M E / l i b : JAVA_HOME/lib: JAVAHOME/lib:JAVA_HOME/lib/tools.jar
编译kernel:

cd ~/proj/firefly-rk3399/kernel/
make ARCH=arm64 firefly_defconfig
make -j8 ARCH=arm64 rk3399-firefly-aiojd4.img
编译uboot:

cd ~/proj/firefly-rk3399/u-boot/
make rk3399_defconfig
make ARCHV=aarch64 -j8
编译android:

cd ~/proj/firefly-rk3399/
source build/envsetup.sh
lunch rk3399_firefly_aiojd4-userdebug
make -j8
./mkimage.sh
打包成统一固件 update.img
编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:

./FFTools/mkupdate/mkupdate.sh update
打包完成后将在 rockdev/Image-rk3399_firefly_aiojd4/ 下生成统一固件:update.img

在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdev\Image 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdev\Image 目录里。

烧写分区映像
编译的时候执行 ./mkimage.sh 会重新打包 boot.img 和 system.img, 并将其它相关的映像文件拷贝到目录 rockdev/Image-rk3399_firefly_aiojd4/ 中。以下列出一般固件用到的映像文件:

boot.img :Android 的初始文件映像,负责初始化并加载 system 分区。

kernel.img :内核映像。

misc.img :misc 分区映像,负责启动模式切换和急救模式的参数传递。

parameter.txt :emmc的分区信息

recovery.img :急救模式映像。

resource.img :资源映像,内含开机图片和内核的设备树信息。

system.img :Android 的 system 分区映像,ext4 文件系统格式。

trust.img :休眠唤醒相关的文件

rk3399_loader_v1.08.106.bin :Loader文件

uboot.img :uboot文件

请参照 如何升级固件 一文来烧写分区映像文件。

如果使用的是 Windows 系统,将上述映像文件拷贝到 AndroidTool (Windows 下的固件升级工具)的 rockdev\Image 目录中,之后参照升级文档烧写分区映像即可,这样的好处是使用默认配置即可,不用修改文件的路径。

update.img 方便固件的发布,供终端用户升级系统使用。一般开发时使用分区映像比较方便。

注意:
使用升级工具进行industry版固件升级时,如果原有烧录的是tvbox版固件,需要先短路emmc或进行flash擦除。且注意使用相适配升级工具
请参照 烧写须知

定制 Android 固件
前言
定制 Android 固件,有两种方法:

改源码,然后编译生成固件。

在现有固件的基础上进行裁剪。

前一种方法,可以从各个层面去定制 Android,自由度大,但对编译环境和技术要求比较高,参见《编译 Android 固件》一文。现在介绍后一种方法,分为解包、定制和打包三个阶段。主机操作系统为 Linux,采用的工具为开源软件。

固件格式
统一固件 release_update.img,内含启动加载器 loader.img 和真正的固件数据 update.img

release_update.img
|- loader.img
`- update.img
update.img 是个复合文件,内含多个文件,由 package-file 描述。一个典型的 package-file 为:

# NAME Relative path package-file package-file bootloader Image/MiniLoaderAll.bin parameter       Image/parameter.txt trust           Image/trust.img uboot           Image/uboot.img misc Image/misc.img resource Image/resource.img kernel Image/kernel.img boot            Image/boot.img recovery Image/recovery.img system Image/system.img backup RESERVED #update-script update-script #recover-script recover-script

package-file

update.img 的打包说明文件,update.img 里也含有一份 package-file。

Image/MiniLoaderAll.bin

启动加载器,即 bootloader。

Image/parameter.txt

参数文件,可以设定内核启动参数,里面有重要的分区信息。

Image/trust.img,trust.img 是U-Boot作为二级loader 的打包。

Image/misc.img

misc 分区的映像,用来控制 Android 是正常启动,还是进入急救模式(Recovery Mode)。

Image/kernel.img

Android 内核。

Image/resource.img

资源映像,内有内核开机图片和内核设备树信息(Device Tree Blob)。

Image/boot.img

Android 内核的内存启动盘(initrd),是内核启动后最先加载的根文件系统,包含重要的初始化动作,一般不需要改动。

Image/recovery.img

Android 急救模式的映像,内含内核和急救模式的根文件系统。

Image/system.img

对应于 Android 的 /system 分区,是以下的定制对象。

解包,就是提取 release_update.img 里的 update.img, 然后解压出内含 package-file 所声明的多个文件。打包,则是个逆过程,将 package-file 将所列的多个文件合成 update.img,加进 loader.img,最终生成 release_update.img 。

工具准备
git clone https://github.com/TeeFirefly/rk2918_tools.git
cd rk2918_tools
make
sudo cp afptool img_unpack img_maker mkkrnlimg /usr/local/bin
解包
解压 release_update.img

$ cd /path/to/your/firmware/dir
$ img_unpack Firefly-RK3399_20161027.img img
rom version: 6.0.1
build time: 2016-10-27 14:58:18
chip: 33333043
checking md5sum…OK
解压 update.img

$ cd img
$ afptool -unpack update.img update
Check file…OK
------- UNPACK -------
package-file 0x00000800 0x00000280
Image/MiniLoaderAll.bin 0x00001000 0x0003E94E
Image/parameter.txt 0x00040000 0x00000350
Image/trust.img 0x00040800 0x00400000
Image/uboot.img 0x00440800 0x00400000
Image/misc.img 0x00840800 0x0000C000
Image/resource.img 0x0084C800 0x0003FE00
Image/kernel.img 0x0088C800 0x00F5D00C
Image/boot.img 0x017EA000 0x0014AD24
Image/recovery.img 0x01935000 0x013C0000
Image/system.img 0x02CF5000 0x2622A000
RESERVED 0x00000000 0x00000000
UnPack OK!
查看 update 目录下的文件树

$ cd update/
$ tree
.
├── Image
│ ├── boot.img
│ ├── kernel.img
│ ├── MiniLoaderAll.bin
│ ├── misc.img
│ ├── parameter.txt
│ ├── recovery.img
│ ├── resource.img
│ ├── system.img
│ ├── trust.img
│ └── uboot.img
├── package-file
└── RESERVED

1 directory, 12 files
这样,固件就解包成功了,下面就开始定制吧。

定制
定制 system.img
system.img 是个 ext4 文件系统格式的映像文件,可以直接挂载到系统进行修改:

sudo mkdir -p /mnt/system
sudo mount -o loop Image/system.img /mnt/system
cd /mnt/system

修改里面的东西,注意剩余空间,不能添加太多的 APK

修改完毕,要卸载

cd /
sudo umount /mnt/system
注意,该 system.img 的剩余空间基本为 0, 如果不是删除文件,就需要对 system.img 进行扩容,并根据最后的文件大小,相应地调整 parameter 文件里的分区设置。以下是如何扩展空间的示例,在扩展前,先运行 mount 来查看系统挂载情况,确保 system.img 已经卸载:

增加 128M 的空间

dd if=/dev/zero bs=1M count=128 >> Image/system.img

扩展文件系统信息

e2fsck -f Image/system.img
resize2fs Image/system.img
打包
首先要检查一下 system.img 的大小,对照 parameter 文件的分区情况(可参考文档Parameter 文件格式,作必要的大小调整。例如,parameter.txt 文件里的 system 分区大小,可以找到 CMDLINE 一行,然后找到 system 字符串:

0x00200000@0x000B0000(system)
@ 前面就是分区的大小,单位是 512 字节,这样该 system 分区的大小就是:

$ echo $(( 0x00200000 * 512 / 1024 / 1024))M
1024M
只要 system.img 的大小不超过 1024M,parameter 文件就不用更改。如果分区不用更改,可以直接用烧写工具将新的 system.img 烧写到开发板的 system 分区上做试验。否则,需要制作新固件并烧写后再行测试。以下是打包成统一固件 update.img 所需要的步骤:

合成 update.img :

当前的目录仍然为 update/ ,内有 package-file, package-file 所列的文件均存在

将参数文件拷贝一份到 paramter, 因为 afptool 默认要用到

$ cp Image/parameter.txt parameter
$ afptool -pack . …/update_new.img
------ PACKAGE ------
Add file: ./package-file
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/parameter.txt
Add file: ./Image/trust.img
Add file: ./Image/uboot.img
Add file: ./Image/misc.img
Add file: ./Image/resource.img
Add file: ./Image/kernel.img
Add file: ./Image/boot.img
Add file: ./Image/recovery.img
Add file: ./Image/system.img
Add file: ./RESERVED
Add CRC…
------ OK ------
Pack OK!
合成 release_update.img :

$ img_maker -rk33 loader.img update_new.img release_update_new.img
generate image…
append md5sum…
success!
release_update_new.img 即为最终生成的可烧写的统一固件文件。

常见问题
固件的版本在哪设置
在 parameter 文件中找到下行并修改即可,注意版本号为数字,中间两个点号不能省略。

参考firfly:http://wiki.t-firefly.com/zh_CN/Core-3399-JD4/Android_development.html#bian-yi-android7-1-industry-gu-jian-font-color-ff0000-size-3-zhu-yao-wei-hu-font

参考:https://blog.csdn.net/qq_42889470/article/details/81463559

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值