Custom Android Build - What I wish I would have known

I recently acquired a VIM4 and some supporting accessories to replace a tablet I installed in my car several years back. I wanted to switch to a more modern device that might afford me better capabilities than a tablet that was impossible to keep charged (I did not drive the vehicle enough)

Getting the VIM to work well in an automotive setting meant I would need to change the Android image to enable a secondary logic board to help manage its power. While I have plenty of experience with Linux and as an Android user, I’ve never tried building a custom Android ROM. It was a little more complicated than the old “configure, make, make image.”

This post contains the notes I took during this journey. I’m leaving them here in the hope that they may help another person get started with a custom rom on the VIM4. Note, I am running all of this from a Debian 12 (Bookworm).

Preparing for the Build

  • Make sure you have a ton of disk space in your build root. I have a filesystem dedicated to this, and it’s sitting at 95% of 480GB after a successful build.
  • Khadas Docs: VIM4 Build Android [Khadas Docs]
    • Build out the prerequisites in the AOSP documentation. Don’t bother downloading the source tree from the AOSP project; you will be pulling the Android source from Khadas instead (see next document).
    • You will download Android as part of the VIM4 Build Android [Khadas Docs] document. However, there are a couple of gotcha’s I ran into.
      • This may have been my fault, but I did need to pull large files from git (git lfs pull) in two different locations:
        • ${PROJECT_ROOT}/device/khadas
        • ${PROJECT_ROOT}/common
    • I had to install these supporting packages as part of the process. Note that there may be more; read the docs!
      • android-tools-adb git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig repo openjdk-17-jdk automake make git gperf zip dos2unix bison perl gcc g++ tig pkg-config cpp-aarch64-linux-gnu libssl-dev gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu libncurses5 libncurses5-dev minicom

The Build

  1. I highly recommend using the “demo.sh” script from the VIM4 Build Android [Khadas Docs] document.
  2. As I am cross-compiling, I had to set compiler flags for the Android build. Oddly enough, I did not need it for the u-boot or kernel builds (the flags caused build failures for u-boot or the kernel, but I don’t recall which). Next build, I’ll move these into the demo.sh to make my life easier
    1. export CROSS_COMPILE=aarch64-linux-gnu-
    2. export ARCH=arm64

Burning the ROM

This part was the trickiest for me to figure out. I had hoped that Oowow would allow me to burn the image, but after a couple of hours of playing around, I threw in the towel and hit the documentation again. Alas, while I found documentation, I still needed to figure out how I was to proceed.

The “VIM4 Boot into Upgrade Mode” document noted a method for burning the ROM in serial mode. So I gave it a try, but it ultimately failed (or I missed a step). Then I came across a post in the forums (Flashing Methods). This post showed that the best way to flash the image was to use the “burn-tool” after placing the board in “upgrade mode.”

One note on the burn-tool, Khadas only supports Ubuntu. I had to modify the install script to make it function on Debian, but once installed it seems to be working ok.

I hope someone might find this helpful. Cheers!

2 Likes

hi rpkish,
(1) To build the VIMs SDK source code, you need to install the extra toolchains for cross-compiling.
https://docs.khadas.com/products/sbc/vim4/development/android/install-toolchains
(2) try the follow cmd to pull large files.
repo forall -c ‘git lfs pull’
(3) you can install OS into eMMC via USB Flash Tool
https://docs.khadas.com/products/sbc/vim4/install-os/install-os-into-emmc-via-usb-tool
(4)Recommend using the Ubuntu operating system for compilation.

Would you mind sharing your commits/changes? I’m in the same boat.

VIM4 just arrived a few weeks ago, and I haven’t started playing with it yet.

But would definitely need to build a custom Android as I need Bluetooth sink feature for handsfree calling, which is IMHO disabled by default.

Besides of this my idea to control power is “stolen” from my old design:

MCU -> UART -> Android app

I.e. my MCU would send a short control sequence over UART to Android, and my Android control app parses it, and acts accordingly (i.e. turn off the screen, or shuts down completely itself).

VIM4 also wired out the Power button which is absolutely needed for the car, so my MCU can “push” the power button which will either wake Android up, or starts booting it from scratch.