ubuntu20.04上编译android 7.1

tech2022-09-11  107

一、安装 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)