From 4d12d178ddca0934990014a5dbaf58309a780740 Mon Sep 17 00:00:00 2001 From: Ethan Yonker Date: Mon, 13 Jul 2015 10:51:10 -0500 Subject: [PATCH 1/2] Updates for Android 5.1.1 --- AndroidBoard.mk | 8 - BoardConfig.mk | 8 +- README.md | 6 +- device.mk | 4 - recovery.fstab | 4 +- recovery/hardwarekeyboard.cpp | 435 ------------------------ recovery/init.rc | 63 ---- recovery/root/brightness | 0 recovery/root/init.recovery.goldfish.rc | 5 + recovery/root/sbin/create_partitions.sh | 12 +- recovery/root/sbin/network_start.sh | 5 - 11 files changed, 18 insertions(+), 532 deletions(-) delete mode 100755 AndroidBoard.mk delete mode 100644 recovery/hardwarekeyboard.cpp delete mode 100755 recovery/init.rc create mode 100644 recovery/root/brightness create mode 100644 recovery/root/init.recovery.goldfish.rc diff --git a/AndroidBoard.mk b/AndroidBoard.mk deleted file mode 100755 index 3ffb57d..0000000 --- a/AndroidBoard.mk +++ /dev/null @@ -1,8 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) - -# include the non-open-source counterpart to this file --include vendor/emulator/twrp/AndroidBoardVendor.mk diff --git a/BoardConfig.mk b/BoardConfig.mk index e2a13ad..3bc6298 100755 --- a/BoardConfig.mk +++ b/BoardConfig.mk @@ -35,11 +35,13 @@ TARGET_PREBUILT_KERNEL := device/emulator/twrp/kernAl # Use this flag if the board has a ext4 partition larger than 2gb BOARD_HAS_LARGE_FILESYSTEM := true -TARGET_RECOVERY_INITRC := device/emulator/twrp/recovery/init.rc +#TARGET_RECOVERY_INITRC := device/emulator/twrp/recovery/init.rc TARGET_USERIMAGES_USE_EXT4 := true # TWRP specific build flags -DEVICE_RESOLUTION := 720x1280 +TW_THEME := portrait_mdpi RECOVERY_GRAPHICS_USE_LINELENGTH := true -TWRP_CUSTOM_KEYBOARD := ../../../device/emulator/twrp/recovery/hardwarekeyboard.cpp RECOVERY_SDCARD_ON_DATA := true +TW_EXCLUDE_MTP := true +# Dirty workaround to prevent errors related to the brightness file +TW_BRIGHTNESS_PATH := "/brightness" diff --git a/README.md b/README.md index 98a85d3..d0ccc76 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ This is a set of device configs that you can use to build and test TWRP in the Android emulator. Note that adb will take about 10 to 15 seconds after TWRP is booted to become available. Just wait and it will come online eventually. -This branch of the device configs is intended to be used with Android 4.4.2 system image. For some reason there is no cache partition. In order to create a cache partition as well fake boot and recovery partitions, you will have to boot the emulator with a custom kernel. We added simply added support for reading a partition map to the kernel configuration. The source for this kernel is located here: +This branch of the device configs is intended to be used with Android 5.1.1 system image. In order to create fake boot and recovery partitions, you will have to boot the emulator with a custom kernel. We simply added support for reading a partition table to the kernel configuration. The source for this kernel is located here: [Kernel Source](https://android.googlesource.com/kernel/goldfish/+/android-goldfish-3.4 "Kernel Source") -To boot this in the emulator, build your recoveryimage. With the Android emulator make a new device based on a Galaxy Nexus. Name it TWRP. Allow it to have a hardware keyboard and a sdcard sized to 1500MB. Give it a decent sized data partition like 500MB or more. TWRP will be using the data partition as an emulated storage setup as seen on most modern Android devices, so having some extra room may help. Then from your android-sdk/tools folder run the following command: +To boot this in the emulator, build your recoveryimage. With the Android emulator make a new device based on a Galaxy Nexus. Name it TWRP. Allow it to have a hardware keyboard and a sdcard sized to 2000MB. Give it a decent sized data partition like 2000MB or more. TWRP will be using the data partition as an emulated storage setup as seen on most modern Android devices, so having some extra room may help. Then from your android-sdk/tools folder run the following command: ``` ./emulator -avd TWRP -ramdisk ~/omni_folder/out/target/product/twrp/ramdisk-recovery.img -kernel ~/omni_folder/device/emulator/twrp/goldfish_3.4_kernel @@ -14,7 +14,7 @@ To boot this in the emulator, build your recoveryimage. With the Android emulato After the first boot, wait for ADB to start up, then: adb shell /sbin/create_partitions.sh -This script will partition the sdcard with a boot, recovery, cache, and removable sdcard partition. It's designed to work with a 1500MiB sdcard. If you want a different sdcard size then you will need to modify the script in the omni_folder/device/emulator/twrp/recovery/root/sbin/create_partitions.sh location to suit your needs. +This script will partition the sdcard with a boot, recovery, cache, and removable sdcard partition. It's designed to work with a 2000MiB sdcard. If you want a different sdcard size then you will need to modify the script in the omni_folder/device/emulator/twrp/recovery/root/sbin/create_partitions.sh location to suit your needs. You can find a compiling guide for TWRP [here](http://forum.xda-developers.com/showthread.php?t=1943625 "Guide"). diff --git a/device.mk b/device.mk index b447dfc..c1cb431 100755 --- a/device.mk +++ b/device.mk @@ -17,10 +17,6 @@ endif PRODUCT_COPY_FILES += \ $(LOCAL_KERNEL):kernel -PRODUCT_COPY_FILES += \ - device/emulator/twrp/recovery/root/sbin/network_start.sh:recovery/root/sbin/network_start.sh \ - device/emulator/twrp/recovery/root/sbin/create_partitions.sh:recovery/root/sbin/create_partitions.sh - $(call inherit-product, build/target/product/full.mk) PRODUCT_NAME := teamwin_twrp diff --git a/recovery.fstab b/recovery.fstab index f463d82..2f7b286 100755 --- a/recovery.fstab +++ b/recovery.fstab @@ -1,8 +1,8 @@ # mount point fstype device -/external_sd vfat /dev/block/mmcblk0p4 /dev/block/mmcblk0 +/external_sd vfat /dev/block/mmcblk0p3 /dev/block/mmcblk0 /system ext4 /dev/block/mtdblock0 /data ext4 /dev/block/mtdblock1 length=-16384 -/cache ext4 /dev/block/mmcblk0p3 +/cache ext4 /dev/block/mtdblock2 /boot emmc /dev/block/mmcblk0p1 /recovery emmc /dev/block/mmcblk0p2 diff --git a/recovery/hardwarekeyboard.cpp b/recovery/hardwarekeyboard.cpp deleted file mode 100644 index 1e3d7bc..0000000 --- a/recovery/hardwarekeyboard.cpp +++ /dev/null @@ -1,435 +0,0 @@ -// hardwarekeyboard.cpp - HardwareKeyboard object -// Custom hardware keyboard support for Asus Transformer devices - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -extern "C" { -#include "../common.h" -#include "../minuitwrp/minui.h" -#include "../recovery_ui.h" -} - -#include "rapidxml.hpp" -#include "objects.hpp" -#include "../data.hpp" -#include - -HardwareKeyboard::HardwareKeyboard(void) { - // Do Nothing - DataManager::SetValue("Lshift_down", 0); - DataManager::SetValue("Rshift_down", 0); - DataManager::SetValue("last_key", 0); -} - -HardwareKeyboard::~HardwareKeyboard() { - // Do Nothing -} - -int HardwareKeyboard::KeyDown(int key_code) { - - int keyboard = -1; - int shiftkey, Lshift_down, Rshift_down; - - DataManager::GetValue("Lshift_down", Lshift_down); - DataManager::GetValue("Rshift_down", Rshift_down); - if (Lshift_down || Rshift_down) - shiftkey = 1; - else - shiftkey = 0; - -#ifdef _EVENT_LOGGING - LOGE("HardwareKeyboard::KeyDown %i\n", key_code); -#endif - switch (key_code) { - case KEY_LEFTSHIFT: // Left Shift - DataManager::SetValue("Lshift_down", 1); - return 0; - break; - case KEY_RIGHTSHIFT: // Right Shift - DataManager::SetValue("Rshift_down", 1); - return 0; - break; - case KEY_A: - if (shiftkey) - keyboard = 'A'; - else - keyboard = 'a'; - break; - case KEY_B: - if (shiftkey) - keyboard = 'B'; - else - keyboard = 'b'; - break; - case KEY_C: - if (shiftkey) - keyboard = 'C'; - else - keyboard = 'c'; - break; - case KEY_D: - if (shiftkey) - keyboard = 'D'; - else - keyboard = 'd'; - break; - case KEY_E: - if (shiftkey) - keyboard = 'E'; - else - keyboard = 'e'; - break; - case KEY_F: - if (shiftkey) - keyboard = 'F'; - else - keyboard = 'f'; - break; - case KEY_G: - if (shiftkey) - keyboard = 'G'; - else - keyboard = 'g'; - break; - case KEY_H: - if (shiftkey) - keyboard = 'H'; - else - keyboard = 'h'; - break; - case KEY_I: - if (shiftkey) - keyboard = 'I'; - else - keyboard = 'i'; - break; - case KEY_J: - if (shiftkey) - keyboard = 'J'; - else - keyboard = 'j'; - break; - case KEY_K: - if (shiftkey) - keyboard = 'K'; - else - keyboard = 'k'; - break; - case KEY_L: - if (shiftkey) - keyboard = 'L'; - else - keyboard = 'l'; - break; - case KEY_M: - if (shiftkey) - keyboard = 'M'; - else - keyboard = 'm'; - break; - case KEY_N: - if (shiftkey) - keyboard = 'N'; - else - keyboard = 'n'; - break; - case KEY_O: - if (shiftkey) - keyboard = 'O'; - else - keyboard = 'o'; - break; - case KEY_P: - if (shiftkey) - keyboard = 'P'; - else - keyboard = 'p'; - break; - case KEY_Q: - if (shiftkey) - keyboard = 'Q'; - else - keyboard = 'q'; - break; - case KEY_R: - if (shiftkey) - keyboard = 'R'; - else - keyboard = 'r'; - break; - case KEY_S: - if (shiftkey) - keyboard = 'S'; - else - keyboard = 's'; - break; - case KEY_T: - if (shiftkey) - keyboard = 'T'; - else - keyboard = 't'; - break; - case KEY_U: - if (shiftkey) - keyboard = 'U'; - else - keyboard = 'u'; - break; - case KEY_V: - if (shiftkey) - keyboard = 'V'; - else - keyboard = 'v'; - break; - case KEY_W: - if (shiftkey) - keyboard = 'W'; - else - keyboard = 'w'; - break; - case KEY_X: - if (shiftkey) - keyboard = 'X'; - else - keyboard = 'x'; - break; - case KEY_Y: - if (shiftkey) - keyboard = 'Y'; - else - keyboard = 'y'; - break; - case KEY_Z: - if (shiftkey) - keyboard = 'Z'; - else - keyboard = 'z'; - break; - case KEY_0: - if (shiftkey) - keyboard = ')'; - else - keyboard = '0'; - break; - case KEY_1: - if (shiftkey) - keyboard = '!'; - else - keyboard = '1'; - break; - case KEY_2: - if (shiftkey) - keyboard = '@'; - else - keyboard = '2'; - break; - case KEY_3: - if (shiftkey) - keyboard = '#'; - else - keyboard = '3'; - break; - case KEY_4: - if (shiftkey) - keyboard = '$'; - else - keyboard = '4'; - break; - case KEY_5: - if (shiftkey) - keyboard = '%'; - else - keyboard = '5'; - break; - case KEY_6: - if (shiftkey) - keyboard = '^'; - else - keyboard = '6'; - break; - case KEY_7: - if (shiftkey) - keyboard = '&'; - else - keyboard = '7'; - break; - case KEY_8: - if (shiftkey) - keyboard = '*'; - else - keyboard = '8'; - break; - case KEY_9: - if (shiftkey) - keyboard = '('; - else - keyboard = '9'; - break; - case KEY_SPACE: - keyboard = ' '; - break; - case KEY_BACKSPACE: - keyboard = KEYBOARD_BACKSPACE; - break; - case KEY_ENTER: - keyboard = KEYBOARD_ACTION; - break; - case KEY_SLASH: - if (shiftkey) - keyboard = '?'; - else - keyboard = '/'; - break; - case KEY_DOT: - if (shiftkey) - keyboard = '>'; - else - keyboard = '.'; - break; - case KEY_COMMA: - if (shiftkey) - keyboard = '<'; - else - keyboard = ','; - break; - case KEY_MINUS: - if (shiftkey) - keyboard = '_'; - else - keyboard = '-'; - break; - case KEY_GRAVE: - if (shiftkey) - keyboard = '~'; - else - keyboard = '`'; - break; - case KEY_EQUAL: - if (shiftkey) - keyboard = '+'; - else - keyboard = '='; - break; - case KEY_LEFTBRACE: - if (shiftkey) - keyboard = '{'; - else - keyboard = '['; - break; - case KEY_RIGHTBRACE: - if (shiftkey) - keyboard = '}'; - else - keyboard = ']'; - break; - case KEY_BACKSLASH: - if (shiftkey) - keyboard = '|'; - else - keyboard = '\\'; - break; - case KEY_SEMICOLON: - if (shiftkey) - keyboard = ':'; - else - keyboard = ';'; - break; - case KEY_APOSTROPHE: - if (shiftkey) - keyboard = '\"'; - else - keyboard = '\''; - break; - case KEY_UP: // Up arrow - keyboard = KEYBOARD_ARROW_UP; - break; - case KEY_DOWN: // Down arrow - keyboard = KEYBOARD_ARROW_DOWN; - break; - case KEY_LEFT: // Left arrow - keyboard = KEYBOARD_ARROW_LEFT; - break; - case KEY_RIGHT: // Right arrow - keyboard = KEYBOARD_ARROW_RIGHT; - break; - case KEY_BACK: // back button on screen - mPressedKeys.insert(KEY_BACK); - PageManager::NotifyKey(KEY_BACK, true); - return 0; - break; - case KEY_HOMEPAGE: // keyboard home button - case KEY_HOME: // home button on screen - mPressedKeys.insert(KEY_HOME); - PageManager::NotifyKey(KEY_HOME, true); - return 0; - break; - case KEY_SLEEP: // keyboard lock button - case KEY_POWER: // tablet power button - mPressedKeys.insert(KEY_POWER); - PageManager::NotifyKey(KEY_POWER, true); - return 0; - break; -#ifdef _EVENT_LOGGING - default: - LOGE("Unmapped keycode: %i\n", key_code); - break; -#endif - } - if (keyboard != -1) { - DataManager::SetValue("last_key", keyboard); - mPressedKeys.insert(keyboard); - if (!PageManager::NotifyKeyboard(keyboard)) - return 1; // Return 1 to enable key repeat - } else { - DataManager::SetValue("last_key", 0); - } - return 0; -} - -int HardwareKeyboard::KeyUp(int key_code) { - std::set::iterator itr = mPressedKeys.find(key_code); - if (itr != mPressedKeys.end()) { - mPressedKeys.erase(itr); - PageManager::NotifyKey(key_code, false); - } -#ifdef _EVENT_LOGGING - LOGE("HardwareKeyboard::KeyUp %i\n", key_code); -#endif - if (key_code == KEY_LEFTSHIFT) { // Left Shift - DataManager::SetValue("Lshift_down", 0); - } else if (key_code == 31) { // Right Shift - DataManager::SetValue("Rshift_down", 0); - } - return 0; -} - -int HardwareKeyboard::KeyRepeat(void) { - int last_key; - - DataManager::GetValue("last_key", last_key); -#ifdef _EVENT_LOGGING - LOGE("HardwareKeyboard::KeyRepeat: %i\n", last_key); -#endif - if (last_key) - PageManager::NotifyKeyboard(last_key); - return 0; -} - -void HardwareKeyboard::ConsumeKeyRelease(int key) { - mPressedKeys.erase(key); -} diff --git a/recovery/init.rc b/recovery/init.rc deleted file mode 100755 index 9a2b183..0000000 --- a/recovery/init.rc +++ /dev/null @@ -1,63 +0,0 @@ -on early-init - start ueventd - -on init - export PATH /sbin - export LD_LIBRARY_PATH .:/sbin - export ANDROID_ROOT /system - export ANDROID_DATA /data - export EXTERNAL_STORAGE /sdcard - - symlink /system/etc /etc - - mkdir /boot - mkdir /sdcard - mkdir /sd-ext - mkdir /datadata - mkdir /emmc - mkdir /system - mkdir /data - mkdir /cache - mount /tmp /tmp tmpfs - -on init - ifup lo - ifup eth0 - hostname localhost - domainname localdomain - - class_start default - -service ueventd /sbin/ueventd - critical - -#this starts the network needed to get adb working in the emulator -service network_start /sbin/network_start.sh - user root - oneshot - -on boot -service recovery /sbin/recovery - -service adbd /sbin/adbd recovery - disabled - -# Always start adbd on userdebug and eng builds -# In recovery, always run adbd as root. -on property:ro.debuggable=1 - write /sys/class/android_usb/android0/enable 0 - write /sys/class/android_usb/android0/idVendor 04e8 - write /sys/class/android_usb/android0/idProduct 6860 - write /sys/class/android_usb/android0/functions adb - #write /sys/class/android_usb/android0/enable 1 - write /sys/class/android_usb/android0/iManufacturer TeamWin - write /sys/class/android_usb/android0/iProduct TWRP - write /sys/class/android_usb/android0/iSerial $ro.serialno - #start adbd - setprop service.adb.root 1 - -# Restart adbd so it can run as root -on property:service.adb.root=1 - write /sys/class/android_usb/android0/enable 0 - restart adbd - write /sys/class/android_usb/android0/enable 1 diff --git a/recovery/root/brightness b/recovery/root/brightness new file mode 100644 index 0000000..e69de29 diff --git a/recovery/root/init.recovery.goldfish.rc b/recovery/root/init.recovery.goldfish.rc new file mode 100644 index 0000000..da6bdcb --- /dev/null +++ b/recovery/root/init.recovery.goldfish.rc @@ -0,0 +1,5 @@ +#this starts the network needed to get adb working in the emulator +service network_start /sbin/network_start.sh + user root + oneshot + default diff --git a/recovery/root/sbin/create_partitions.sh b/recovery/root/sbin/create_partitions.sh index cc97943..24fff12 100755 --- a/recovery/root/sbin/create_partitions.sh +++ b/recovery/root/sbin/create_partitions.sh @@ -13,19 +13,13 @@ parted -s /dev/block/mmcblk0 mklabel gpt parted -s /dev/block/mmcblk0 mkpart boot ext2 0 8MB # 8MB recovery partition parted -s /dev/block/mmcblk0 mkpart recovery ext2 8MB 16MB -# 34 MB cache partition -parted -s /dev/block/mmcblk0 mkpart cache ext2 16MB 50MB # sdcard partition -parted -s /dev/block/mmcblk0 mkpart sdcard ext4 50MB 1536MB - -echo "Formatting cache..." -# Format external_sd as vfat -make_ext4fs -S /file_contexts -a /cache /dev/block/mmcblk0p3 +parted -s /dev/block/mmcblk0 mkpart sdcard ext4 16MB 2048MB echo "Formatting external_sd..." # Format external_sd as vfat -mkdosfs /dev/block/mmcblk0p4 +mkdosfs /dev/block/mmcblk0p3 echo "Mounting new sdcard..." -mount -t vfat /dev/block/mmcblk0p4 /external_sd +mount -t vfat /dev/block/mmcblk0p3 /external_sd echo "Done!" diff --git a/recovery/root/sbin/network_start.sh b/recovery/root/sbin/network_start.sh index c00558c..170a6bf 100755 --- a/recovery/root/sbin/network_start.sh +++ b/recovery/root/sbin/network_start.sh @@ -1,8 +1,4 @@ #!/sbin/sh -# this was kanged from /system/etc/init.goldfish.sh -# we run it in the init.rc and it is required to get -# the network running in order for adb to work in -# emulator # Setup networking when boot starts ifconfig eth0 10.0.2.15 netmask 255.255.255.0 up @@ -70,4 +66,3 @@ case "$my_ip" in *) ifconfig eth1 "$my_ip" netmask 255.255.255.0 up ;; esac - From a30472ad2591c0ccaf5fa808a2f6851edcc822b2 Mon Sep 17 00:00:00 2001 From: Ethan Yonker Date: Thu, 22 Oct 2015 09:37:58 -0500 Subject: [PATCH 2/2] Fix booting with 6.0 TWRP branch --- recovery/root/sbin/network_start.sh | 63 ---------------------------- recovery/root/sepolicy | Bin 0 -> 75012 bytes 2 files changed, 63 deletions(-) create mode 100644 recovery/root/sepolicy diff --git a/recovery/root/sbin/network_start.sh b/recovery/root/sbin/network_start.sh index 170a6bf..2a1e5a9 100755 --- a/recovery/root/sbin/network_start.sh +++ b/recovery/root/sbin/network_start.sh @@ -3,66 +3,3 @@ # Setup networking when boot starts ifconfig eth0 10.0.2.15 netmask 255.255.255.0 up route add default gw 10.0.2.2 dev eth0 - -# ro.kernel.android.qemud is normally set when we -# want the RIL (radio interface layer) to talk to -# the emulated modem through qemud. -# -# However, this will be undefined in two cases: -# -# - When we want the RIL to talk directly to a guest -# serial device that is connected to a host serial -# device by the emulator. -# -# - We don't want to use the RIL but the VM-based -# modem emulation that runs inside the guest system -# instead. -# -# The following detects the latter case and sets up the -# system for it. -# -qemud=`getprop ro.kernel.android.qemud` -case "$qemud" in - "") - radio_ril=`getprop ro.kernel.android.ril` - case "$radio_ril" in - "") - # no need for the radio interface daemon - # telephony is entirely emulated in Java - setprop ro.radio.noril yes - stop ril-daemon - ;; - esac - ;; -esac - -# Setup additionnal DNS servers if needed -num_dns=`getprop ro.kernel.ndns` -case "$num_dns" in - 2) setprop net.eth0.dns2 10.0.2.4 - ;; - 3) setprop net.eth0.dns2 10.0.2.4 - setprop net.eth0.dns3 10.0.2.5 - ;; - 4) setprop net.eth0.dns2 10.0.2.4 - setprop net.eth0.dns3 10.0.2.5 - setprop net.eth0.dns4 10.0.2.6 - ;; -esac - -# disable boot animation for a faster boot sequence when needed -boot_anim=`getprop ro.kernel.android.bootanim` -case "$boot_anim" in - 0) setprop debug.sf.nobootanimation 1 - ;; -esac - -# set up the second interface (for inter-emulator connections) -# if required -my_ip=`getprop net.shared_net_ip` -case "$my_ip" in - "") - ;; - *) ifconfig eth1 "$my_ip" netmask 255.255.255.0 up - ;; -esac diff --git a/recovery/root/sepolicy b/recovery/root/sepolicy new file mode 100644 index 0000000000000000000000000000000000000000..1cf18612d9eabfa4af46b902c873ba26773ed0b2 GIT binary patch literal 75012 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 literal 0 HcmV?d00001