Can i get some help i keep running into this problem:The 32-bit apps are back!
![]()
Synopsis
The Pixel 7 line is Google's first "64-bit only" phones, along with being the highest profile release of a 64-bit only device so far. The device uses the Tensor G2 (GS201), which is a close descendant of the Tensor (GS101) from the Pixel 6 line. So close, that the only major change was swapping out the ARM Cortex-A76 cores for ARM Cortex-A78 cores. The SoC still has full 32-bit support.
This was seemingly done at the last minute to get the ball rolling on switching Android to becoming 64-bit only at some point in the future. That future might be soon for other currently supported Pixel phones as the Android 13 QPR1 Beta includes optional firmware images that are 64-bit only. Given that it is currently optional on QPR1, there is a chance that at the earliest Android 14 will be 64-bit only across all supported Pixels, with a slimmer chance that it will be 64-bit only for AOSP also.
The three items that are of importance are AArch32, what Zygote services are set to start, and whether the build supports multilib.
AArch32Is a mode starting with ARMv8 that provides support for the 32-bit ARM ABIs: armeabi and armeabi-v7a. An ABI is what defines how software is to be built and ran for specific instruction sets.AArch32 is not required to be supported with ARMv9-A architectures, which would be processors starting with ARM Cortex-X2/X3/A715. These processors support AArch64 only.The ARM Cortex-A510 is currently the only ARMv9-A processor that supports AArch32. This combination of processors (X2/X3/A715 with A510) results in asymmetric 32-bit support. This is the likely reason for Google expediting these changes. It is speculated that the Cortex-A520 will not support AArch32, which would put a stop to native 32-bit support completely for future devices.Tensor G2 cores are still on ARMv8-A and thus still support AArch32.
ZygoteIs a service that handles creating VMs for starting applications, and is responsible for allowing resources to be shared to reduce memory bloat from duplication. There are two Zygote services, Zygote64 and Zygote (colloquially referred to as Zygote32). Each handle a "warm" VM that is preloaded with libraries, which gets cloned for starting an application. This is done via copy-on-write, which means a copy is only made and occupies memory when attempting to modify a resource. The untouched copies all point back to the original, saving memory.Without Zygote32, 32-bit applications can't be started. Without Zygote64, 64-bit applications can't be started.Having multiple Zygote processes is referred to as "Zygote64_32"
MultilibIs a scheme that allows for 32-bit and 64-bit libraries to reside on the same device. This is required to support running 32-bit applications on 64-bit devices. Android has it's own implementation that differs from most Linux distributions, which may also differ between each other.Obviously, without 32-bit libraries (or inversely without 64-bit libraries), a build does not support multilib.Somewhat important to note is that the 64-bit only QPR1 Beta images for the Pixel 4a to 6 are true 64-bit only, they do not support multilib. However, as noted here by Google, the Pixel 7 is 64-bit only but does support multilib.
The support matrix is as follows:
Phone + SoC, Build SoC AArch32 Support Zygote Property Multilib 32-bit Support? Pixel 6 with Tensor Yes Zygote64_32 Yes Native Pixel 6 with Tensor, 64-bit Only Build Yes Zygote64 No Not Possible* Pixel 7 with Tensor G2 Yes Zygote64 Yes With Modification Pixel 7 with Tensor G2, 64-bit Only Build** Yes Zygote64 No Not Possible* Phone with AArch64-only ARMv9-A No Zygote64 No Not Possible**** If no multilib build is also available. It may be possible with extensive work to use Treble to bring 32-bit libraries forward, assuming Android 14+ doesn't remove AArch32 and Zygote32. Emulation could be a possibility but has not been done yet.** Build does not exist yet. It may be realized with Android 13 QPR2/3 or it may be done with Android 14 instead.*** Emulation could be a possibility but has not been done yet. Currently just the Pixel 6 and 7 have KVM built-in, but the Pixel 7 is the only one with it on by default. There is no graphics layer yet.
This means that with the right changes 32-bit support can be enabled and used if 32-bit libraries are on the device and the SoC supports AArch32.
Modifications
The changes required are as follows:
ro.zygote=zygote64_32
ro.vendor.product.cpu.abilist=arm64-v8a,armeabi-v7a,armeabi
ro.vendor.product.cpu.abilist32=armeabi-v7a,armeabi
Genuinely that simple, property changes. Because the libraries are already in the firmware images it is just the need to instruct Android to use them.
Zygote64_32 refers to starting Zygote64 as the primary process, then starting Zygote32 as the secondary process. With this in place 32-bit applications can be installed and ran as 32-bit libraries are now able to be loaded.
The changes that need to be done are to either be applied to/vendor/build.prop
, or done withinit.rc
modifications, or applied in some way beforeinit.rc
is read.
The last point is the critical issue that has halted this: there has not been any easy way to set properties very early in the boot process outside of simply just modifying the file on the partition.
This can't be done easily due to dynamic partitions requiring a custom super partition, and with the larger issue being AVB.
However two solutions have been brought forward:
The first solution is thanks to ThomasKing2014, he has created Pixel 7 32-bit helper which is a modified Magisk that changes
The patch he has created has been the start for this. The patch gets applied to Magisk and modifiesmagiskinit
to modify/vendor/build.prop
early in bootmagiskinit
so that during boot Magisk will modify/vendor/build.prop
with the values for the properties needed.magiskinit
continues with initialization, hands off to the stockinit
which then readsro.zygote
to determine what Zygote rc file to load.
Then Zygote64 and Zygote32 are started.
The second solution is thanks to @huskydg for Magisk Delta which is a Magisk fork that implements many additional features
Currently I have repositories set up with rebased patches and modified versions of Magisk and Magisk Delta using the patch.
Forewarning
Currently, a wipe is required to get the modification to work fully.
I do not know exactly why, but when a device is first booted with only Zygote64 it can't be switched over to use Zygote64_32. For some reason the 32-bit libraries inside APEXs are not discovered and loaded by Zygote32.
It's a strange thing. If first boot is with Zygote64, then immediately rebooting to use Zygote64_32 will appear to work, but things are subtly broken in the background as only a few libraries don't have their 32-bit counterparts loaded. This gets exacerbated with preexisting systems, where lots of libraries have been used and their 32-bit counterparts are never discovered when switching to Zygote64_32. Ends up resulting in things like boot hangs or even the boot process aborting very early.
Magisk Delta uses
Thepersist
on the Pixel 7 and allows modules to write to itpersist
partition is used by Magisk Delta to hold the early-mount.d directory for it's early-mount feature.
Modifyingpersist
has an inherent dangerous aspect due to the fact it is unique to each device. Corruption or modification of the calibration data in the partition can result in causing functions of your device to fail.
Magisk Delta is not doing this inherently on all devices, this is actually because the Pixel 7'spersist
is the only partition that is not encrypted, is not checked by AVB, and is available early in the boot process. This is actually an extension of the functionality from stock Magisk, as stock Magisk is trying to do the same thing to store SELinux policy rules.
Thus I recommend using my Magisk 32-bit fork instead. However if you need Magisk Delta for it's features then it is best practice before installing Magisk Delta to make a backup of yourpersist
. There will be steps on how to do that before installing Magisk Delta.
Support for custom ROMs is not guaranteed
It may or may not work. As a matter of fact, doing this modification isn't necessary as custom ROMs could implement this change themselves.
It is known that the modification does work on LineageOS.
I have not tested all 32-bit applications
I don't actually use any 32-bit apps. I have done testing with a few 32-bit apps I've gotten from APKMirror. So no, I don't know if your Instagram mod is working. I don't see any reason why it wouldn't.
This modification is not 'install and forget'
Like with using custom kernels requiring you to keep on making sure verity and verification are off, this modification requires that you keep a finger on the pulse for any news or updates. You're essentially on the bleeding edge now. The hammer could drop next month and the update is true 64-bit without multilib. Performing an update and forgetting to flash the patched Magisk could require you to wipe your device.
Download Links
All files are hosted at my download repository
Magisk 32-bit:
Recommended:If you are having troubles and need to produce logs:Magisk Delta 32-bit:
For Advanced Users:
If you are having troubles and need to produce logs:
Installation Instructions
General Prerequisites:
A working platform-tools environment
platform-tools 33.0.3 is required with the Pixel 7The version you are running can be checked withadb --version
andfastboot --version
If you need assistance then read this thread by @roirraW "edor" ehT.Tools like PixelFlasher can be used, just read into how to use it.The factory image for the firmware version you are running or plan to run
Part of the steps are going to be doing a flashing wipe on your device, to guarantee that you start with a reproducible blank slate.Copyinit_boot.img
out from image-xxx.zip
Backup your data
At the moment a wipe is required, so perform two backups: with Google Backup or your favorite backup app and a manual backup of any files.With my Magisk 32-bit fork (Recommended)
Magisk 32-bit with the rebased patch by me.
Direct download link for my Magisk 32-bit APK
Steps:
Note: If you are unrooted and stock then skip to step 4Attempt to install and run a 32-bit application. If you are unable to, then verify that you used my Magisk 32-bit app to patch your
- On your phone uninstall the stock Magisk app. Do not use the uninstall Magisk button from within the app, simply just uninstall the app itself.
- Reboot your phone into the bootloader.
- Flash the stock
init_boot.img
for your version and then boot into Android.- Install the Magisk 32-bit app from my repository.
- Copy over the stock
init_boot.img
to your phone and patch it in the Magisk app.- Copy the patched Magisk init_boot.img over to your computer
- Reboot your phone into the bootloader.
- Flash and wipe via
fastboot --skip-reboot -w update image-xxx.zip
- Wait for it to finish, then reboot back into the bootloader either on the device or with
fastboot reboot bootloader
- Flash the patched Magisk
init_boot.img
and boot into Android.- Complete the setup wizard as normal
- Do not open the Magisk stub (the default Android icon), install the Magisk 32-bit app from my repository.
- Open the Magisk app and finish setup for Magisk.
init_boot.img
and that you flashed it to your phone. You will have to perform the steps including the wipe over again.
With my Magisk Delta 32-bit fork (Not Recommended For General Use, Advanced Users Only)
Magisk Delta 32-bit with the rebased patch by me.
Direct download link for my Magisk Delta 32-bit APK
Warning:
Magisk Delta will mount thepersist
partition for it's early-mount feature, meaning that modules using early-mount could inadvertently fill up the partition, leading to possible corruption.The steps will take you through creating a backup of the partition to restore if you ever need to.
Prerequisites:
You need to already have root with Magisk so you can backup thepersist
partition
Steps:
Note: If you already have backed up your persist partition then you can skip steps 4 to 7.Attempt to install and run a 32-bit application. If you are unable to, then verify that you used my Magisk Delta 32-bit app to patch your
- Install my Magisk Delta 32-bit app, it may be installed alongside stock Magisk without issue as it has a different package name.
- Copy over the stock
init_boot.img
to your phone and patch it in the Magisk Delta 32-bit app.- Copy it back over to your computer
- Enter a root shell via either method
- adb
adb shell
su
- You will need to approve the attempt on your phone
- Terminal emulator
su
- Run the following command:
dd if=/dev/block/by-name/persist of=/sdcard/persist.img
- Copy
persist.img
over to your computer, keep it safe, keep it in multiple places.
- This is not the Google Pixel 7 persist image, this is uniquely your phone's persist image.
- Reboot phone to bootloader
- Flash and wipe via
fastboot --skip-reboot -w update image-xxx.zip
- Wait for it to finish, then reboot back into the bootloader either on the device or with
fastboot reboot bootloader
- Flash the patched Magisk
init_boot.img
and boot into Android.- Complete the setup wizard as normal
- Install my Magisk Delta 32-bit app.
- Open the Magisk app and finish setup for Magisk.
init_boot.img
and that you flashed it to your phone. You will have to perform the steps including the wipe over again.
System Upgrade Instructions
Either of my Magisk 32-bit forks
- Extract the
init_boot
from image-xxx.zip of the firmware you want to upgrade to- Patch it in the Magisk app that you are using
- Copy the patched Magisk image back over to your computer
- Reboot your phone into fastboot
- Update the bootloader and radio if necessary
fastboot --skip-reboot update image-xxx.zip
- No
-w
! That flag will wipe your userdata partition.- Wait until it is finished
- Don't boot the phone into Android!
- Flash the patched Magisk
init_boot.img
- This can be done from inside [icode[fastbootd[/icode]
Magisk Upgrade Instructions
Either of my Magisk 32-bit forks
- Unhide the Magisk app if you are currently hiding it
- Download and install the latest APK for the 'flavor' you are using from my repository
- It may be required that you uninstall the app if Android won't let you upgrade it
- Perform a direct install from the install menu
- Reboot
Changing Between My Magisk Forks
- Download and install the app you want to switch to from my repository
- Uninstalling the previous Magisk app is not necessary
- Copy the stock
init_boot.img
for your system version over to your phone- Patch it in the Magisk app you want to switch to
- Copy the patched Magisk image back over to your computer
- Reboot your phone into fastboot
- Flash the patched Magisk
init_boot.img
- If moving from Magisk Delta 32-bit to Magisk 32-bit then at the same time you can flash your backed up persist
fastboot flash persist persist.img
- Remove the other Magisk app
- Finish setup in the remaining Magisk app.
Uninstallation Instructions
My Magisk 32-bit fork
Flash the stockinit_boot.img
My Magisk Delta 32-bit fork
- Flash the stock
init_boot.img
fastboot flash persist persist.img
Manual method on phone if without original persist image
- Uninstall all Magisk modules, they will clean up any files they put into
early-mount.d
- Enter a root shell via either method
- adb (heavily preferred)
adb shell
su
- You will need to approve the attempt on your phone
- Terminal Emulator
- Navigate to the persist mount
cd $(magisk --path)/.magisk/mirror/persist/
- Remove the directory
early-mount.d
rm -ir early-mount.d
- You will be prompted for each removal and descending into directories, respond with
y
to approve the action- Can now reboot and flash stock
init_boot
Troubleshooting
Stuck at boot animation or bootlooping
Restore stockinit_boot
.Grab a logcat with adb to determine what the problem may be.You might not have wiped your device.
Booted after installing new Android update but forgot to flash Magisk
Usually there is a "carrier specific" firmware that can be downloaded each month. These are not truly "carrier specific", they can be ran just fine, download whatever is available for the monthly update you are running.Follow the system update instructions using the new firmware you downloaded.After performing the steps and booting you can then repeat the steps but this time use the firmware you originally wanted to run.
Unable to install 32-bit apps
Rungetprop ro.zygote; getprop ro.vendor.product.cpu.abilist; getprop ro.vendor.product.cpu.abilist32
If the values do not match these then the modification was not applied.zygote64_32
arm64-v8a,armeabi-v7a,armeabi
armeabi-v7a,armeabi
32-bit apps force close
This only happened in my testing when I did a first boot with Zygote64 and then installed the modification to use Zygote64_32. Wipe your device.It is possible the app may just have issues, or will not work because of missing libraries.Clobbered the persist partition
Follow the uninstall steps for Magisk Delta, easiest to use the fastboot steps.If you didn't backup your persist partition, then RIP.
Questions
Will I have to wipe on every system update?
I'm glad to say no.I've tested with my Magisk Delta 32-bit, going from October -> November, while keeping Zygisk/MagiskHide enabled along with the Magisk app being hidden.I also tested December -> January with my Magisk 32-bit and even swapping to my Magisk Delta 32-bit in the process without issue.Can I take OTAs instead of flashing factory images?
I would heavily recommend against doing so.
I booted with the patch, but then accidentally flashed over
init_boot
, what do I do?Simply just flash the patched Magisk image back over. I've tested it, 32-bit applications are still kept, and I haven't encountered any issues once I flashed the patched Magisk image back onto it.If this was because of an update then try the troubleshooting method above.that uses a different build of the update.
Will my persist partition be destroyed?
You shouldn't have to worry about that, a backup persist image will be able to completely restore it.
Thanks To
Thomas King for Pixel 7 32-bit Helper5ec1cff for maru@nickelnine for bringing attention to Pixel 7 32-bit Helper
C:\Users\Gogop\Desktop\platform-tools>fastboot --skip-reboot -w update image.zip
--------------------------------------------
Bootloader Version...: cloudripper-1.0-9288096
Baseband Version.....: g5300g-220923-221028-B-9229469
Serial Number......
--------------------------------------------
extracting android-info.txt (0 MB) to RAM...
Checking 'product' OKAY [ 0.000s]
Checking 'version-bootloader' OKAY [ 0.000s]
Checking 'version-baseband' OKAY [ 0.000s]
Setting current slot to 'b' OKAY [ 0.117s]
extracting boot.img (64 MB) to disk... took 0.145s
archive does not contain 'boot.sig'
Sending 'boot_b' (65536 KB) OKAY [ 2.088s]
Writing 'boot_b' OKAY [ 0.161s]
extracting init_boot.img (8 MB) to disk... took 0.016s
archive does not contain 'init_boot.sig'
Sending 'init_boot_b' (8192 KB) OKAY [ 0.257s]
Writing 'init_boot_b' OKAY [ 0.016s]
extracting dtbo.img (16 MB) to disk... took 0.036s
archive does not contain 'dtbo.sig'
Sending 'dtbo_b' (16384 KB) OKAY [ 0.515s]
Writing 'dtbo_b' OKAY [ 0.039s]
archive does not contain 'dt.img'
extracting pvmfw.img (1 MB) to disk... took 0.002s
archive does not contain 'pvmfw.sig'
Sending 'pvmfw_b' (1024 KB) OKAY [ 0.032s]
Writing 'pvmfw_b' OKAY [ 0.005s]
archive does not contain 'recovery.img'
extracting vbmeta.img (0 MB) to disk... took 0.000s
archive does not contain 'vbmeta.sig'
Sending 'vbmeta_b' (12 KB) OKAY [ 0.000s]
Writing 'vbmeta_b' OKAY [ 0.003s]
extracting vbmeta_system.img (0 MB) to disk... took 0.000s
archive does not contain 'vbmeta_system.sig'
Sending 'vbmeta_system_b' (4 KB) OKAY [ 0.001s]
Writing 'vbmeta_system_b' OKAY [ 0.003s]
extracting vbmeta_vendor.img (0 MB) to disk... took 0.000s
archive does not contain 'vbmeta_vendor.sig'
Sending 'vbmeta_vendor_b' (4 KB) OKAY [ 0.000s]
Writing 'vbmeta_vendor_b' OKAY [ 0.004s]
extracting vendor_boot.img (64 MB) to disk... took 0.143s
archive does not contain 'vendor_boot.sig'
Sending 'vendor_boot_b' (65536 KB) OKAY [ 2.069s]
Writing 'vendor_boot_b' OKAY [ 0.162s]
extracting vendor_kernel_boot.img (64 MB) to disk... took 0.110s
archive does not contain 'vendor_kernel_boot.sig'
Sending 'vendor_kernel_boot_b' (65536 KB) OKAY [ 2.066s]
Writing 'vendor_kernel_boot_b' OKAY [ 0.155s]
extracting super_empty.img (0 MB) to disk... took 0.000s
extracting product.img (2778 MB) to disk... took 7.526s
extracting system.img (841 MB) to disk... took 2.387s
extracting system_dlkm.img (0 MB) to disk... took 0.000s
extracting system_ext.img (356 MB) to disk... took 1.017s
extracting system_other.img (24 MB) to disk... took 0.079s
extracting vendor.img (636 MB) to disk... took 1.678s
extracting vendor_dlkm.img (40 MB) to disk... took 0.081s
archive does not contain 'vendor_other.img'
Sending sparse 'super' 1/1 (4194303 KB) FAILED (Sparse file is too large or invalid)
fastboot: error: Command failed