Compile Android Firmware Preparation Compiling Android requires higher configuration requirements for the machine: 64 bits CPU. 16GB physical memory + swap memory. 30GB the free disk space is used for the build, and the source tree takes up an additional approximately 25GB. The official recommendation of Ubuntu 16.04 operating system. Initialization of the compilation environment is referred to http://source.android.com/source/initializing.html . Install OpenJDK 8: sudo apt-get install openjdk-8-jdk Tip: Install openjdk-8-jdk would changed the default link to the JDK. We can do as follow to switch JDK versions: $ sudo update-alternatives --config java $ sudo update-alternatives --config javac SDK will use the JDK path set internally when the default JDK of the operating system cannot be found. Therefore, to enable the same machine to compile Android 5.1 and previous versions, it is more convenient to remove the link: $ sudo /var/lib/dpkg/info/openjdk-8-jdk:amd64.prerm remove Ubuntu 12.04 package installation: sudo apt-get install git gnupg flex bison gperf build-essential \ zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ g++-multilib mingw32 tofrodos gcc-multilib ia32-libs \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386 \ lzop libssl1.0.0 libssl-dev Ubuntu 14.04 package installation: sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev \ libesd0-dev libwxgtk2.8-dev squashfs-tools build-essential zip curl \ libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \ xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \ lib32readline-gplv2-dev gcc-multilib libswitch-perl \ libssl1.0.0 libssl-dev Download Android SDK Android SDK source package is relatively large, you can obtain the Android 7.1 source package through the following ways: Download link Verify MD5 code after downloading: $ md5sum /path/to/rk3399_firefly_industry_android7.1_20190628.7z.001 92084d35f40bebea6466d39d52bf9704 rk3399_firefly_industry_android7.1_20190628.7z.001 $ md5sum /path/to/rk3399_firefly_industry_android7.1_20190628.7z.002 f25da955fdb9700fcf53569b27debdfe rk3399_firefly_industry_android7.1_20190628.7z.002 After confirmation, you can decompress: mkdir -p ~/proj/firefly-rk3399 cd ~/proj/firefly-rk3399 7z x /path/to/rk3399_firefly_industry_android7.1_20190628.7z.001 -r -o./ git reset --hard Note: be sure to update the remote warehouse after unpacking. The following method is updated from gitlab: # Enter SDK root directory cd ~/proj/firefly-rk3399 # Clone bundle from gitlab git clone https://gitlab.com/TeeFirefly/rk3399-industry-nougat-bundle.git .bundle # After that, run command below to update SDK .bundle/update (or run command: ./rk3399-industry-nougat-bundle/update) # Download the code for your own branch git rebase FETCH_HEAD Face-RK3399 Compiling method Overall Compilation Face-RK3399 default display interface is MIPI DSI, at the time of compilation by adding "-o face" option to specify whether to compile the boot of Face recognition APK (FaceApp). Without FaceApp cd ~/proj/firefly-rk3399/ ./FFTools/make.sh -d rk3399-firefly-face-mipi8 -j8 -l rk3399_firefly_face-userdebug ./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_face-userdebug With FaceApp cd ~/proj/firefly-rk3399/ ./FFTools/make.sh -i face -d rk3399-firefly-face-mipi8 -j8 -l rk3399_firefly_face-userdebug ./FFTools/mkupdate/mkupdate.sh -l rk3399_firefly_face-userdebug Compile step by step Before compilation, execute the following command to configure the environment variables: export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar Compile the kernel: cd ~/proj/firefly-rk3399/kernel/ make ARCH=arm64 firefly_defconfig make -j8 ARCH=arm64 rk3399-firefly-face-mipi8.img Compile the uboot: cd ~/proj/firefly-rk3399/u-boot/ make rk3399_box_defconfig make ARCHV=aarch64 -j8 Compile the Android (Without FaceApp): cd ~/proj/firefly-rk3399/ source build/envsetup.sh export FIREFLY_FACE_APP=false lunch rk3399_firefly_face-userdebug make installclean make -j8 ./mkimage.sh Compile the Android (With FaceApp): cd ~/proj/firefly-rk3399/ source build/envsetup.sh export FIREFLY_FACE_APP=true lunch rk3399_firefly_face-userdebug make installclean make -j8 ./mkimage.sh Package into unified firmware - update.img After compiling, you can package the unified firmware with the official script of Firefly, and execute the following command: ./FFTools/mkupdate/mkupdate.sh When the packaging is complete, the unified firmware "Face- RK3399_Android1.1.2_DEFAULT_xxxxxx.img" will be generated under "rockdev/Image-rk3399_firefly_face/". Is also easy to package "update.img" under Windows. Copy the compiled files to "rockdev\Image" directory of AndroidTool, and then run "./mkupdate.bat" under rockdev directory to create "update.img" and store it in "rockdev\Image" directory. Upgrade partition images "boot.img" and "system.img" will be repackaged when you execute "./mkimage.sh" during compilation. And the other related image files will be copy into "rockdev/Image-rk3399_firefly_face". The following is a list of image files commonly used: boot.img: Android's initial file image, which initializes and loads the system partition. kernel.img: The kernel image misc.img: misc partition image, responsible for initiating mode switching and parameter passing of first-aid mode. parameter.txt: Partition information for emmc. recovery.img: Image of first aid mode. resource.img: resource image, which contains boot image and kernel device tree information. system.img: Android system partition image, ext4 file system format. trust.img: sleep to wake up relevant files. rk3399_loader_v1.08.106.bin: Loader file. uboot.img: uboot file. Refer to How to upgrade firmware to burn the partition image file. If you are using Windows system, copy the above image files to "rockdev\Image" directory of AndroidTool (The firmware upgrade tool under Windows), and then upgrade the partition image according to the upgrade document. The advantage is that you can use the default configuration without changing the path of the file. "update.img" is convenient for firmware release, for end users to upgrade the system. It is generally convenient to use partition images during development.