You will need something from your Stock ROM first. Get them all and Try to modify it using the procedure.
- Get Your Stock Recovery
- Extract The Recovery Into Ramdisk & Kernel
- Create A GitHub Repository
- Make Notes from build.prop
- Add Some Stock Files
- Create "Android.mk"
- Create "AndroidProducts.mk"
- Create "BoardConfig.mk"
- Create "omni_$$DEVICE$$.mk"
- Publish the GitHub Repository
- Create An Account in Travis CI
- Create
.travis.yml
in GitHub Repo - Fire-Up The Build
- Flash The TWRP
- Troubleshooting
- You have to get your device's Stock
"recovery.img"
from the Official Firmware which you can (or maybe can't) get from the device manufacturer's website. - You have to get the
build.prop
file (from ROM's /system/build.prop) because there are a few key things that we need.- Use ADB to Pull the file by the command
adb pull /system/build.prop
- Use ADB to Pull the file by the command
- Use
Carliv Image Kitchen
to extract the image from Windows or Linux. - Need a Guide to Use it? Read This.
- Go to https://github.com/ and SignUp there.
- You have to Create an online GitHub Repository with the name of the device.
- For Example: something like
android_device_Walton_PrimoRX5
ortwrp_device_Walton_PrimoRX5
or whatever you want to call it.
- For Example: something like
- Go to https://github.com/settings/tokens/new/
- It will take you to a page to create a New personal access token.
- Name your Token as anything you like, for example: "GitHubToken" and save the Token Value in Notepad. We will need it later.
- Write down the keys and their values in Notepad or something of the followings:
- For ease, I am showing from my device.
As in "Keys" = "Values"
ro.build.product=gionee6735_65u_m0 # Company Given Codename for the Device. ro.product.board=Primo_RX5 # The Board Name for Build. ro.product.brand=WALTON # The Brand and The Manufacturer ro.product.manufacturer=WALTON # can be of the Same Name. ro.product.name=Primo_RX5 # The Device Name and/or The Codename ro.product.device=Primo_RX5 # we will be using. ro.product.model=Primo RX5 # A Nickname, we will ignore it. ro.mediatek.platform=MT6735 # The Chipset Platform of the Project. ro.mediatek.project.path=device/gionee/gionee6735_65u_m0 # The Original Build Location from Company. ro.product.cpu.abi=arm64-v8a # Shows if the device is 6-bit or 32-bit.
- Create a Folder named
prebuilt
and put the unpackedrecovery.img-kernel
inside it. Rename that file tozImage
- Create another Folder named
recovery
. Go in there and create a folder namedroot
- In the
root
folder, Put yourfactory_init.*.rc
files,meta_init.*.rc
files,ueventd.mt****.rc
,init.recovery.mt****.rc
files - Make a new folder named
etc
insideroot
. Make a file namedrecovery.fstab
- Use THIS FILE as a reference point and edit it.
- You Have to edit the Mount Addresses (Like /dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system), Alternate Short Mount Addresses (Like /dev/block/mmcblk0p20).
You can get Some of the Mount Addresses by ADB Commands from PC, using
adb shell cat /proc/self/mountstats
oradb shell cat /proc/self/mounts
oradb shell cat /proc/self/mountinfo
. Also check whether the Basic FSType (emmc or ext4) of the partitions match with your devices. If you fail to know the Alternate Short Mount Addresses, Just erase them.
- Make a new folder named
sbin
insideroot
. Make a file namedpermissive.sh
with File Permission set to "644" by usingchmod a+x permissive.sh
shell command- The file must contain the below content:
#!/sbin/sh setenforce 0 # Get your device's block path where "system", "recovery", etc. lives. # That can be "/dev/block/bootdevice/by-name" or something like that. mkdir -p /dev/block/platform/mtk-msdc.0/by-name/ busybox mount -o bind /dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/ /dev/block/platform/mtk-msdc.0/by-name/
- The file must contain the below content:
- Make a new File, name it
Android.mk
, with the below content# Replace $$DEVICE$$ with your Device Name's Value. Mine is Primo_RX5. # Replace $$BRAND$$ with your Brand's / Manufacturer's Value, Mine is WALTON ifneq ($(filter $$DEVICE$$,$(TARGET_DEVICE)),) LOCAL_PATH := device/$$BRAND$$/$$DEVICE$$ include $(call all-makefiles-under,$(LOCAL_PATH)) endif
- Make a new File, name it
AndroidProducts.mk
, with the below content# Replace $$DEVICE$$ with your Device Name's Value. # Replace $$BRAND$$ with your Brand's / Manufacturer's Value. # The part of last line in mine looks like "omni_Primo_RX5.mk" LOCAL_PATH := device/$$BRAND$$/$$DEVICE$$ PRODUCT_MAKEFILES := $(LOCAL_PATH)/omni_$$DEVICE$$.mk
- Make a new File, name it
BoardConfig.mk
, with the below contentLOCAL_PATH := device/$$BRAND$$/$$DEVICE$$ TARGET_BOARD_PLATFORM := mt6735 # From ro.mediatek.platform, but lowercase value TARGET_NO_BOOTLOADER := true TARGET_BOOTLOADER_BOARD_NAME := Primo_RX5 # From ro.product.board # These two are for MTK Chipsets only BOARD_USES_MTK_HARDWARE := true BOARD_HAS_MTK_HARDWARE := true # Recovery TARGET_USERIMAGES_USE_EXT4 := true TARGET_USERIMAGES_USE_F2FS := true # To add info about F2FS Filesystem Data Block # Put The Size of your Recovery Partition below, get it from your "MT****_Android_scatter.txt" BOARD_RECOVERYIMAGE_PARTITION_SIZE := 16777216 # BOARD_USES_FULL_RECOVERY_IMAGE := true # Uncomment this line if you want to remove size restriction BOARD_FLASH_BLOCK_SIZE := 0 # Might be different for your chip BOARD_HAS_NO_REAL_SDCARD := true # Depricated # BOARD_HAS_NO_SELECT_BUTTON := true # Depricated BOARD_SUPPRESS_SECURE_ERASE := true BOARD_HAS_NO_MISC_PARTITION := true # Delete if your partition table has /misc BOARD_RECOVERY_SWIPE := true BOARD_USES_MMCUTILS := true BOARD_SUPPRESS_EMMC_WIPE := true BOARD_CHARGER_SHOW_PERCENTAGE := true RECOVERY_SDCARD_ON_DATA := true # Optional: If /sdcard partition is emulated on /data partition # TWRP stuff TW_EXCLUDE_SUPERSU := true # true/false: Add SuperSU or not TW_INCLUDE_CRYPTO := true # true/false: Add Data Encryption Support or not TW_INPUT_BLACKLIST := "hbtp_vm" # Optional: Disables virtual mouse TW_SCREEN_BLANK_ON_BOOT := true TW_THEME := portrait_hdpi # Set the exact theme you wanna use. If resulation doesn't match, define the height/width DEVICE_RESOLUTION := 720x1280 # The Resolution of your Device TARGET_SCREEN_HEIGHT := 1280 # The height TARGET_SCREEN_WIDTH := 720 # The width TARGET_RECOVERY_PIXEL_FORMAT := "RGBA_8888" # Set the Brightness Control File Path below (as per your chip/device) TW_BRIGHTNESS_PATH := /sys/class/leds/lcd-backlight/brightness TW_SECONDARY_BRIGHTNESS_PATH := /sys/devices/platform/leds-mt65xx/leds/lcd-backlight/brightness # Set the Path of Logical Units (LUNs) for Storage below (as per your chip/device) TARGET_USE_CUSTOM_LUN_FILE_PATH := /sys/devices/platform/mt_usb/musb-hdrc.0.auto/gadget/lun%d/file TARGET_USE_CUSTOM_LUN_FILE_PATH := /sys/class/android_usb/android0/f_mass_storage/lun/file TW_MAX_BRIGHTNESS := 255 TW_DEFAULT_BRIGHTNESS := 80 # Set custom brightness, low is better TW_INCLUDE_NTFS_3G := true # Include NTFS Filesystem Support TW_INCLUDE_FUSE_EXFAT := true # Include Fuse-ExFAT Filesystem Support TWRP_INCLUDE_LOGCAT := true # Include LogCat Binary TW_INCLUDE_FB2PNG := true # Include Screenshot Support TW_DEFAULT_LANGUAGE := en # Set Default Language TW_EXTRA_LANGUAGES := false # Kernel TARGET_IS_64_BIT := true # true/false: Determine if the device is 64-bit or not TARGET_PREBUILT_KERNEL := $(LOCAL_PATH)/prebuilt/zImage TARGET_PREBUILT_RECOVERY_KERNEL := $(LOCAL_PATH)/prebuilt/zImage # Get the CMDLine, Base, Pagesize and offsets from Unpacked recovery image and put below BOARD_KERNEL_CMDLINE := bootopt=64S3,32N2,64N2 androidboot.selinux=permissive BOARD_KERNEL_BASE := 0x40078000 BOARD_KERNEL_PAGESIZE := 2048 BOARD_MKBOOTIMG_ARGS := --ramdisk_offset 0x03f88000 --tags_offset 0x0df88000 # Set FSTAB TARGET_RECOVERY_FSTAB := $(LOCAL_PATH)/recovery/root/etc/recovery.fstab TARGET_BOARD_SUFFIX := _64 # Remove if the device is 32-bit TARGET_USES_64_BIT_BINDER := true # Remove if the device is 32-bit # Architecture # According to the device's architecture (64-bit or 32-bit) ifeq ($(TARGET_IS_64_BIT),true) TARGET_ARCH := arm64 TARGET_ARCH_VARIANT := armv8-a TARGET_CPU_ABI := arm64-v8a TARGET_CPU_ABI2 := TARGET_CPU_VARIANT := cortex-a53 TARGET_2ND_ARCH := arm TARGET_2ND_ARCH_VARIANT := armv7-a-neon TARGET_2ND_CPU_ABI := armeabi-v7a TARGET_2ND_CPU_ABI2 := armeabi TARGET_2ND_CPU_VARIANT := cortex-a53 TARGET_CPU_ABI_LIST_64_BIT := $(TARGET_CPU_ABI) TARGET_CPU_ABI_LIST_32_BIT := $(TARGET_2ND_CPU_ABI),$(TARGET_2ND_CPU_ABI2) TARGET_CPU_ABI_LIST := $(TARGET_CPU_ABI_LIST_64_BIT),$(TARGET_CPU_ABI_LIST_32_BIT) else TARGET_ARCH := arm TARGET_ARCH_VARIANT := armv7-a-neon TARGET_CPU_ABI := armeabi-v7a TARGET_CPU_ABI2 := armeabi TARGET_CPU_VARIANT := cortex-a7 TARGET_CPU_ABI_LIST := $(TARGET_CPU_ABI),$(TARGET_CPU_ABI2) endif
- Make a new File, name it
omni_$$DEVICE$$.mk
, with the below content$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk) # Add this line if your device is 64-bit $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) # Otherwise, If you have 32-bit device, add the below line instead of above line $(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk # Another common config inclusion $(call inherit-product, $(SRC_TARGET_DIR)/product/embedded.mk) # If you are building from OmniROM's minimal source, Inherit some common Omni stuff. $(call inherit-product, vendor/omni/config/common.mk) # Replace $$DEVICE$$ with your Device Name's Value. # Replace $$BRAND$$ with your Brand's / Manufacturer's Value. PRODUCT_COPY_FILES += device/$$BRAND$$/$$DEVICE$$/prebuilt/zImage:kernel # Fles under $(LOCAL_PATH)/recovery/root/ gets automatically copied into recovery # PRODUCT_COPY_FILES += $(LOCAL_PATH)/recovery/root/*:root/* PRODUCT_DEVICE := $$DEVICE$$ PRODUCT_NAME := omni_$$DEVICE$$ PRODUCT_BRAND := $$BRAND$$ PRODUCT_MODEL := $$DEVICE$$ PRODUCT_MANUFACTURER := $$BRAND$$ # Forcefully add mtp support (adb is already there) PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ persist.sys.usb.config=mtp # Add fingerprint from Stock ROM build.prop PRODUCT_BUILD_PROP_OVERRIDES += \ # These lines are from my device. You MUST Replace yours. BUILD_FINGERPRINT="WALTON/Primo_RX5/Primo_RX5:6.0/MRA58K/1465782828:user/release-keys" \ PRIVATE_BUILD_DESC="full_gionee6735_65u_m0-user 6.0 MRA58K 1465782828 release-keys"
- If you have done the above process entirely online inside github.com, then it is okay.
- But, if you have done the above things Locally on your PC, Just upload the entire Folder or
git push
to server.No detail or tutorial will be provided here. This is A-B-C of Git, Man!
- Go to https://travis-ci.org/ and SignUp there using GitHub.
- Go to https://travis-ci.org/profile/ and Add the Repository there by tapping on the Radio Button switch at the right side of the Repository name.
- Now, On its further right corner, you will find an individual repository
Settings
button. Click it. You will be on the Repository's Settings Page Now.- Go below where "Environment Variables" is written.
- Add "GitOAUTHToken" as New Environment Variables' Name and put your GitHub Token's value as it's Value here.
- To Start the Build Process, go to your created TWRP Device Tree in GitHub.
- Make a file named
.travis.yml
with below contentos: linux dist: bionic language: generic sudo: required git: depth: 1 addons: apt: update: - true services: - docker before_install: - docker pull fr3akyphantom/droid-builder:latest before_script: - cd $HOME && mkdir twrp # download the TWRP Compressed Source Files from PhantomZone54's Release # Uncomment & Use below line If Building for Lollipop-based Devices # - TWRP_SOURCE="https://github.com/PhantomZone54/twrp_sources_norepo/releases/download/v3.3.1-20200222/MinimalOmniRecovery-twrp-5.1-norepo-20200222.tar.xz" # Use below line If Building for Marshmallow-based Devices - TWRP_SOURCE="https://github.com/PhantomZone54/twrp_sources_norepo/releases/download/v3.3.1-20200222/MinimalOmniRecovery-twrp-6.0-norepo-20200222.tar.xz" # Uncomment & Use below line If Building for Nougat-based Devices # - TWRP_SOURCE="https://github.com/PhantomZone54/twrp_sources_norepo/releases/download/v3.3.1-20200222/MinimalOmniRecovery-twrp-7.1-norepo-20200222.tar.xz" - wget -q ${TWRP_SOURCE} -O $HOME/twrp.tar.xz - tar -xJf twrp.tar.xz --directory $HOME/twrp/ && rm twrp.tar.xz script: # Replace your $$USERNAME$$, $$REPO_URL$$, $$BRAND$$, $$DEVICE$$ - cd $HOME/twrp/ && git clone https://github.com/$$USERNAME$$/$$REPO_URL$$.git device/$$BRAND$$/$$DEVICE$$ - rm -rf bootable/recovery && git clone https://github.com/omnirom/android_bootable_recovery -b android-9.0 --depth 1 bootable/recovery - | docker run --rm -i -e USER_ID=$(id -u) -e GROUP_ID=$(id -g) -v "$(pwd):/home/builder/twrp/:rw,z" -v "${HOME}/.ccache:/srv/ccache:rw,z" fr3akyphantom/droid-builder bash << EOF cd /home/builder/twrp/ source build/envsetup.sh # Choose build flavor as "eng" or "userdebug" BUILD_FLAVOR="eng" lunch omni_$$DEVICE$$-${BUILD_FLAVOR} make -j$(nproc --all) recoveryimage exit EOF after_success: - export version=$(cat bootable/recovery/variables.h | grep "define TW_MAIN_VERSION_STR" | cut -d '"' -f2) - cp $HOME/twrp/out/target/product/$$DEVICE$$/recovery.img $HOME/twrp/TWRP-$version-$$DEVICE$$-$(date +"%Y%m%d")-Unofficial.img - cd $HOME/twrp/ # Optional: You might need to switch from https://transfer.sh to https://file.io # - curl -s --upload-file TWRP-$version-$$DEVICE$$-$(date +"%Y%m%d")-Unofficial.img https://transfer.sh/ && echo "" deploy: skip_cleanup: true provider: releases # The secret api_key will be loaded from the environment variables api_key: $GitOAUTHToken file_glob: true file: $HOME/twrp/*.img on: tags: false repo: $$USERNAME$$/$$REPO_URL$$ # Optional: If you want to deploy on different repository branch: master # Optional: Needs to be exact as the config branch branches: only: - master # Set travis builder branch(es) names except: - /^(?i:untagged)-.*$/ - /^v\d+\.\d+(\.\d+)?(-\S*)?$/
- When you save the .travis.yml file for the first time, the build will automatically start.
- You can see the progress of the build on https://travis-ci.org/$$USERNAME$$/$$REPO_URL$$/
- After the first build, you can see the result on the GitHub Repository's Releases Page at https://github.com/$$USERNAME$$/$$REPO_URL$$/releases/
- You can also download the file from viewing the Travis CI log, where the script uploaded it into https://transfer.sh/
- Flash the newly-build Recovery. It is better Not to Use with Stock ROM.
- If The Recovery does not Boot,
- Unpack the Stock Recovery Image again, and double-check properties used in TWRP Tree
- Double-check files that are included in the Tree
- If the Recovery starts Upside-Down,
- Edit BoardConfig.mk and insert the below line before the
include
part (last line)BOARD_HAS_FLIPPED_SCREEN := true
- Edit BoardConfig.mk and insert the below line before the
Also, as a little side note to help understand, my device is a/b partition scheme and in the stock Rom dump there is no recovery.img at all. Using fastboot boot TWRP.img does not work, nor does fastboot flash recovery. So board bootimg partition and recovery partition is the same size because the recovery is built in the boot img, so they would be the same size.