I want to customize boot process of Android in emulator.
system.img runs normally in Android Studio Emulator. This file in
https://dl.google.com/android/repository/sys-img/google_apis/x86_64-26_r16.zip
I tried:
\> fdisk -lu 'system.img'
Start End Sectors Size Type
system.img1 2048 4095 2048 1M Linux filesystem
system.img2 4096 6311935 6307840 3G Linux filesystem
\> sudo mount -o loop,offset=$((4096\*512)) 'system.img'
Without luck.
Tried to get hexdump
\> sudo losetup /dev/loop21 --offset=$((4096\*512)) 'system.img' ;
\> sudo hexdump /dev/loop21 -n 12500 -C;
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001000 67 44 6c 61 34 00 00 00 4e 31 cf 64 27 54 42 f4 |gDla4...N1.d'TB.|
00001010 0e 25 c7 72 a1 8d 1f cc d8 b1 29 12 32 e5 93 f6 |.%.r......).2...|
00001020 5e 52 2f c7 ac 07 df 03 00 00 01 00 02 00 00 00 |^R/.............|
00001030 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002000 67 44 6c 61 34 00 00 00 4e 31 cf 64 27 54 42 f4 |gDla4...N1.d'TB.|
00002010 0e 25 c7 72 a1 8d 1f cc d8 b1 29 12 32 e5 93 f6 |.%.r......).2...|
00002020 5e 52 2f c7 ac 07 df 03 00 00 01 00 02 00 00 00 |^R/.............|
00002030 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00003000 30 50 4c 41 0a 00 00 00 80 00 00 00 20 43 72 43 |0PLA........ CrC|
00003010 60 37 de ab 1b ef 45 7c a2 c1 1e fb a6 64 16 ee |`7....E|.....d..|
00003020 85 bf 04 dc bc c8 cf 00 d1 91 e0 14 d0 01 00 00 |................|
00003030 33 3f d6 a7 ed 2d f2 64 6c ee 5c f3 1b d3 55 e5 |3?...-.dl.\...U.|
00003040 d3 27 c5 1e f0 7b c5 9f 4d 1f 82 a7 f2 5f 0e 6f |.'...{..M...._.o|
00003050 00 00 00 00 04 00 00 00 34 00 00 00 d0 00 00 00 |........4.......|
00003060 04 00 00 00 18 00 00 00 30 01 00 00 02 00 00 00 |........0.......|
00003070 30 00 00 00 90 01 00 00 01 00 00 00 40 00 00 00 |0...........@...|
00003080 73 79 73 74 65 6d 00 00 00 00 00 00 00 00 00 00 |system..........|
00003090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000030a0 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 |................|
000030b0 01 00 00 00 73 79 73 74 65 6d 5f 65 78 74 00 00 |....system_ext..|
000030c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000030d0 00 00 00 00 |....|
Tried mount with -offset=203000
Also tried:
\> simg2img system.img system.unsimg.img
Edit: i made mistake in link. Real link is https://dl.google.com/android/repository/sys-img/google_apis/x86_64-30_r16.zip .
The problem : Google starting from Android-29 or Android-Q begin use ext4 filesystem with parameter "shared_blocks" - it is some type of compression, wich combine similar filesystem blocks. Before all manipulations make copy of system.img. You can watch it with commands
\>cp system.img system2.img
\>sudo losetup /dev/loop22 --offset=$((6144\*512)) 'system2.img'
\>sudo tune2fs -l /dev/loop22 | egrep "(shared_blocks|Block count)"
We have got Block count
Somehow 2048*3 = 6144 - is block number that works.
To unshare blocks and make almost normal ext4 filesystem need run:
\>sudo e2fsck -f /dev/loop22
\>sudo resize2fs /dev/loop22 3G #expand FS to new size 3G
\>sudo e2fsck -E unshare_blocks /dev/loop22
\>sudo mount /dev/loop22 /mnt; #mount partition
I delete useless files size=200M
\>sudo resize2fs /dev/loop22 $((900000/4)) #shrink size to 900000 blocks with block size 4k
Manipulation with system.img
\>sudo losetup /dev/loop23 --offset=$((6144*512)) 'system.img'
Write shrinked image to system.img
sudo dd if=/dev/loop22 of=/dev/loop23 bs=1024 count=900000
So data from shifted system2.img written to shifted system.img
so now second partition in system.img can be mounted without shared_blocks and is writable.
All the above described manipulations not let me run Android sdk Emulator with command:
\>./avdmanager create avd -n test -k "system-images;android-30;google_apis;x86_64"
\>./emulator -avd test -no-cache -show-kernel
I have got error:
Filesystem on /dev/block/pci/pci0000:00/0000:00:06.0/by-name/metadata was not cleanly shutdown; state flags: 0x1, incompat feature flags: 0x46
\> fdisk -lu 'system.img'
Start End Sectors Size Type
system.img1 2048 4095 2048 1M Linux filesystem
system.img2 4096 6311935 6307840 3G Linux filesystem
\> sudo mount -o loop,offset=$((4096\*512)) 'system.img'
Without luck.
Tried to get hexdump
\> sudo losetup /dev/loop21 --offset=$((4096\*512)) 'system.img' ;
\> sudo hexdump /dev/loop21 -n 12500 -C;
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00001000 67 44 6c 61 34 00 00 00 4e 31 cf 64 27 54 42 f4 |gDla4...N1.d'TB.|
00001010 0e 25 c7 72 a1 8d 1f cc d8 b1 29 12 32 e5 93 f6 |.%.r......).2...|
00001020 5e 52 2f c7 ac 07 df 03 00 00 01 00 02 00 00 00 |^R/.............|
00001030 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002000 67 44 6c 61 34 00 00 00 4e 31 cf 64 27 54 42 f4 |gDla4...N1.d'TB.|
00002010 0e 25 c7 72 a1 8d 1f cc d8 b1 29 12 32 e5 93 f6 |.%.r......).2...|
00002020 5e 52 2f c7 ac 07 df 03 00 00 01 00 02 00 00 00 |^R/.............|
00002030 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00002040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00003000 30 50 4c 41 0a 00 00 00 80 00 00 00 20 43 72 43 |0PLA........ CrC|
00003010 60 37 de ab 1b ef 45 7c a2 c1 1e fb a6 64 16 ee |`7....E|.....d..|
00003020 85 bf 04 dc bc c8 cf 00 d1 91 e0 14 d0 01 00 00 |................|
00003030 33 3f d6 a7 ed 2d f2 64 6c ee 5c f3 1b d3 55 e5 |3?...-.dl.\...U.|
00003040 d3 27 c5 1e f0 7b c5 9f 4d 1f 82 a7 f2 5f 0e 6f |.'...{..M...._.o|
00003050 00 00 00 00 04 00 00 00 34 00 00 00 d0 00 00 00 |........4.......|
00003060 04 00 00 00 18 00 00 00 30 01 00 00 02 00 00 00 |........0.......|
00003070 30 00 00 00 90 01 00 00 01 00 00 00 40 00 00 00 |0...........@...|
00003080 73 79 73 74 65 6d 00 00 00 00 00 00 00 00 00 00 |system..........|
00003090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000030a0 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 |................|
000030b0 01 00 00 00 73 79 73 74 65 6d 5f 65 78 74 00 00 |....system_ext..|
000030c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000030d0 00 00 00 00 |....|
Tried mount with -offset=203000
Also tried:
\> simg2img system.img system.unsimg.img
Edit: i made mistake in link. Real link is https://dl.google.com/android/repository/sys-img/google_apis/x86_64-30_r16.zip .
The problem : Google starting from Android-29 or Android-Q begin use ext4 filesystem with parameter "shared_blocks" - it is some type of compression, wich combine similar filesystem blocks. Before all manipulations make copy of system.img. You can watch it with commands
\>cp system.img system2.img
\>sudo losetup /dev/loop22 --offset=$((6144\*512)) 'system2.img'
\>sudo tune2fs -l /dev/loop22 | egrep "(shared_blocks|Block count)"
We have got Block count
Somehow 2048*3 = 6144 - is block number that works.
To unshare blocks and make almost normal ext4 filesystem need run:
\>sudo e2fsck -f /dev/loop22
\>sudo resize2fs /dev/loop22 3G #expand FS to new size 3G
\>sudo e2fsck -E unshare_blocks /dev/loop22
\>sudo mount /dev/loop22 /mnt; #mount partition
I delete useless files size=200M
\>sudo resize2fs /dev/loop22 $((900000/4)) #shrink size to 900000 blocks with block size 4k
Manipulation with system.img
\>sudo losetup /dev/loop23 --offset=$((6144*512)) 'system.img'
Write shrinked image to system.img
sudo dd if=/dev/loop22 of=/dev/loop23 bs=1024 count=900000
So data from shifted system2.img written to shifted system.img
so now second partition in system.img can be mounted without shared_blocks and is writable.
All the above described manipulations not let me run Android sdk Emulator with command:
\>./avdmanager create avd -n test -k "system-images;android-30;google_apis;x86_64"
\>./emulator -avd test -no-cache -show-kernel
I have got error:
Filesystem on /dev/block/pci/pci0000:00/0000:00:06.0/by-name/metadata was not cleanly shutdown; state flags: 0x1, incompat feature flags: 0x46
Asked by Сергей Мельчаков
(11 rep)
Jun 28, 2025, 05:19 PM
Last activity: Jul 3, 2025, 12:07 PM
Last activity: Jul 3, 2025, 12:07 PM