Ever since the announcement of Project Treble a week before Google I/O, users have been clamoring to check which devices would be Treble certified. After my report about the benefits that Project Treble support brings to AOSP-based custom ROM development, there was renewed interest in pushing device makers to have their devices be Treble certified with an upgrade to Android Oreo. We have received some requests from users to feature the popular petition going around which requests that OnePlus support Project Treble on their devices, however, we declined to do so because we felt it was an unreasonable request. Here’s why current OnePlus (and Nokia) smartphones won’t be Project Treble certified.
As I explained in my previous article, the gist of how Project Treble works is that all of the vendor-specific code is separated from the Android OS framework into its own separate partition. What that means is that the Hardware Abstraction Layers (HALs) that interface with the device’s hardware are no longer found alongside the OS framework code. Instead, they are moved to a separate vendor partition without having to be recompiled, and new standardized vendor interfaces (defined with HAL Interface Definition Language) allow for the OS framework to communicate with the HALs.
This allows for the Android OS framework to be upgraded without having to recompile the HALs, cutting down on the time it takes for device makers to start porting their code to the new Android version. So how can Huawei phones upgrading to Oreo meet Project Treble requirements while OnePlus and Nokia can’t?
Project Treble and the Vendor Partition
The problem has to do with partitions, or rather, the lack of one—the vendor partition. On devices such as the OnePlus 3/3T and OnePlus 5/5T, the vendor code is located in /system/vendor which is a part of the system partition. On the other hand, Huawei, Essential, and Google phones have already been using a vendor partition to store vendor code on their devices.
Project Treble compatibility requires that a device ship with a separate vendor partition in order to store the vendor HALs. The screenshot above shows a dump of the /vendor partition from the Honor V10, a device which ships with Android 8.0 Oreo and is required to meet Treble’s requirements. Since existing OnePlus and Nokia phones lack a vendor partition, it means there is no reason for them to work to meet Treble’s requirements when upgrading their devices to Android Oreo.
OnePlus 5 Partitions (A only)
drwxr-xr-x 2 root root 1440 1970-05-03 14:23 . drwxr-xr-x 4 root root 1600 1970-05-03 14:23 .. lrwxrwxrwx 1 root root 16 1970-05-03 14:23 LOGO -> /dev/block/sde18 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 abl -> /dev/block/sde16 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 ablbak -> /dev/block/sde17 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 apdp -> /dev/block/sde31 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 bluetooth -> /dev/block/sde24 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 boot -> /dev/block/sde19 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 boot_aging -> /dev/block/sde20 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 cache -> /dev/block/sda3 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 cdt -> /dev/block/sdd2 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 cmnlib -> /dev/block/sde27 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 cmnlib64 -> /dev/block/sde29 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 cmnlib64bak -> /dev/block/sde30 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 cmnlibbak -> /dev/block/sde28 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 config -> /dev/block/sda12 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 ddr -> /dev/block/sdd3 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 devcfg -> /dev/block/sde39 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 devinfo -> /dev/block/sde23 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 dip -> /dev/block/sde14 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 dpo -> /dev/block/sde33 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 dsp -> /dev/block/sde11 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 frp -> /dev/block/sda6 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 fsc -> /dev/block/sdf4 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 fsg -> /dev/block/sdf3 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 fw_4g9n4 -> /dev/block/sde45 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 fw_4j1ed -> /dev/block/sde43 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 fw_4t0n8 -> /dev/block/sde46 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 fw_8v1ee -> /dev/block/sde44 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 hyp -> /dev/block/sde5 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 hypbak -> /dev/block/sde6 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 keymaster -> /dev/block/sde25 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 keymasterbak -> /dev/block/sde26 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 keystore -> /dev/block/sda5 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 limits -> /dev/block/sde35 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 logdump -> /dev/block/sde40 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 logfs -> /dev/block/sde37 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 md5 -> /dev/block/sdf5 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 mdtp -> /dev/block/sde15 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 mdtpsecapp -> /dev/block/sde12 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 mdtpsecappbak -> /dev/block/sde13 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 minidump -> /dev/block/sde47 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 misc -> /dev/block/sda4 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 modem -> /dev/block/sde10 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 modemst1 -> /dev/block/sdf1 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 modemst2 -> /dev/block/sdf2 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 msadp -> /dev/block/sde32 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 oem_dycnvbk -> /dev/block/sda7 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 oem_stanvbk -> /dev/block/sda8 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 param -> /dev/block/sda9 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 persist -> /dev/block/sda2 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 pmic -> /dev/block/sde8 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 pmicbak -> /dev/block/sde9 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 recovery -> /dev/block/sde22 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 reserve -> /dev/block/sdd1 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 reserve1 -> /dev/block/sda10 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 reserve2 -> /dev/block/sda11 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 rpm -> /dev/block/sde1 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 rpmbak -> /dev/block/sde2 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 sec -> /dev/block/sde7 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 splash -> /dev/block/sde34 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 ssd -> /dev/block/sda1 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 sti -> /dev/block/sde38 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 storsec -> /dev/block/sde41 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 storsecbak -> /dev/block/sde42 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 system -> /dev/block/sde21 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 toolsfv -> /dev/block/sde36 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 tz -> /dev/block/sde3 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 tzbak -> /dev/block/sde4 lrwxrwxrwx 1 root root 16 1970-05-03 14:23 userdata -> /dev/block/sda13 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 xbl -> /dev/block/sdb1 lrwxrwxrwx 1 root root 15 1970-05-03 14:23 xblbak -> /dev/block/sdc1
Google Pixel 2 XL Partitions (A/B)
drwxr-xr-x 2 root root 1280 1970-02-07 01:52:01.986666715 -0600 . drwxr-xr-x 4 root root 1460 1970-02-07 01:52:01.990000048 -0600 .. lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.976666714 -0600 abl_a -> /dev/block/sde6 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.980000047 -0600 abl_b -> /dev/block/sde20 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.970000046 -0600 aes_a -> /dev/block/sda10 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.970000046 -0600 aes_b -> /dev/block/sda11 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.970000046 -0600 align_parti -> /dev/block/sda12 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 apdp -> /dev/block/sde29 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.970000046 -0600 boot_a -> /dev/block/sde8 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.980000047 -0600 boot_b -> /dev/block/sde22 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.966666713 -0600 cdt -> /dev/block/sdd1 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.970000046 -0600 cmnlib64_a -> /dev/block/sde10 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 cmnlib64_b -> /dev/block/sde24 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.970000046 -0600 cmnlib_a -> /dev/block/sde9 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 cmnlib_b -> /dev/block/sde23 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.973333380 -0600 ddr -> /dev/block/sdd2 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.976666714 -0600 devcfg_a -> /dev/block/sde11 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.973333380 -0600 devcfg_b -> /dev/block/sde25 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 devinfo -> /dev/block/sde34 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.976666714 -0600 dip -> /dev/block/sde35 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.980000047 -0600 dpo -> /dev/block/sde36 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.980000047 -0600 dtbo_a -> /dev/block/sde13 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.976666714 -0600 dtbo_b -> /dev/block/sde27 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.986666715 -0600 frp -> /dev/block/sdg1 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.983333381 -0600 fsc -> /dev/block/sdf3 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 fsg -> /dev/block/sde32 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.966666713 -0600 ftm -> /dev/block/sda6 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.973333380 -0600 hyp_a -> /dev/block/sde3 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.970000046 -0600 hyp_b -> /dev/block/sde17 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.973333380 -0600 keymaster_a -> /dev/block/sde7 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.980000047 -0600 keymaster_b -> /dev/block/sde21 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.976666714 -0600 laf_a -> /dev/block/sda1 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.970000046 -0600 laf_b -> /dev/block/sda2 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 limits -> /dev/block/sde37 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 logfs -> /dev/block/sde39 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 metadata -> /dev/block/sde41 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.963333379 -0600 misc -> /dev/block/sda5 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.976666714 -0600 modem_a -> /dev/block/sde5 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.976666714 -0600 modem_b -> /dev/block/sde19 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.983333381 -0600 modemst1 -> /dev/block/sdf1 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.980000047 -0600 modemst2 -> /dev/block/sdf2 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.980000047 -0600 msadp -> /dev/block/sde30 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.626666679 -0600 persist -> /dev/block/sda4 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.980000047 -0600 pmic_a -> /dev/block/sde4 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.973333380 -0600 pmic_b -> /dev/block/sde18 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.976666714 -0600 pstore -> /dev/block/sda9 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.970000046 -0600 rpm_a -> /dev/block/sde1 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 rpm_b -> /dev/block/sde15 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.973333380 -0600 sec -> /dev/block/sde33 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.970000046 -0600 ssd -> /dev/block/sda3 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.973333380 -0600 sti -> /dev/block/sde40 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.986666715 -0600 storsec -> /dev/block/sde31 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.966666713 -0600 system_a -> /dev/block/sda7 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.970000046 -0600 system_b -> /dev/block/sda8 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.986666715 -0600 toolsfv -> /dev/block/sde38 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.966666713 -0600 tz_a -> /dev/block/sde2 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.976666714 -0600 tz_b -> /dev/block/sde16 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.970000046 -0600 userdata -> /dev/block/sda13 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.980000047 -0600 vbmeta_a -> /dev/block/sde12 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.983333381 -0600 vbmeta_b -> /dev/block/sde26 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.976666714 -0600 vendor_a -> /dev/block/sde14 lrwxrwxrwx 1 root root 16 1970-02-07 01:52:01.633333346 -0600 vendor_b -> /dev/block/sde28 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.973333380 -0600 xbl_a -> /dev/block/sdb1 lrwxrwxrwx 1 root root 15 1970-02-07 01:52:01.976666714 -0600 xbl_b -> /dev/block/sdc1
That doesn’t mean it is impossible for them to add a vendor partition, but it can be risky. Since these devices already ship without a separate vendor partition, it means that they would have to re-partition existing devices to include space for the vendor partition. This is possible to do, but there is always a remote chance of unrecoverable data loss in the chance something goes wrong. For the average person, the chance is small that a device may be bricked during re-partitioning. However, multiply that chance by hundreds of thousands or millions of users re-partitioning their devices, and that’s a risk that device makers like OnePlus or Nokia can’t afford to make.
Lack of Project Treble Support, is it Really a Deal Breaker?
I realize that this news is disappointing to many of you, especially with how promising Project Treble is for custom ROM development. After all, we were able to boot a nearly fully functional AOSP ROM on the Huawei Mate 9. XDA Recognized Developer OldDroid has just released a Treble-compatible ROM for the Honor 8 Pro. And last night, XDA Senior Member phhusson was able to boot Android 8.1 Oreo on the Essential Phone—less than a day after source code was dropped.
But keep in mind that Project Treble support isn’t a requirement for a device to have great software support. After all, the Nokia 8 received Android Oreo very recently and so did the OnePlus 3/3T and the OnePlus 5. Project Treble absolutely makes updating their phones easier for the device maker, but that doesn’t mean without supporting it these companies will be slow at updating their phones.
As for why device makers like OnePlus or Nokia never implemented a separate vendor partition, it’s because it just wasn’t a requirement for them to do so until Android Oreo. Some would argue why the recently released OnePlus 5T didn’t launch with Oreo or have a separate vendor partition, and while I can’t say for sure why, my best guess is they built the software as close to the OnePlus 5 as possible so they could release unified builds like they do for the OnePlus 3/3T.
Are there other ways to implement Project Treble support? phhusson believes it may be possible for the system partition to itself be gpt-partitioned so it can contain both the system and vendor partitions. Doing this may meet Google’s expectations of needing system/vendor/odm/factory/oem partitions. Although this would remove space from the existing system partition, phhusson suggests that the new vendor partition use SquashFS to optimize space. Now, this is merely a proof-of-concept workaround, but it’s one possibility that phhusson believes may work in bringing Treble support to devices that lack a vendor partition.
To keep up to date with Project Treble related news, check out our new Project Treble development forum. We will also be covering any new Treble-related developments that crop up given the excitement it has generated for our readers. We recommend you use the XDA Labs app to browse the forums and keep up to date with the XDA Portal for the latest news on Treble.
from xda-developers http://ift.tt/2ACHIN2
via IFTTT
Aucun commentaire:
Enregistrer un commentaire