Use custom rom inside Android Emulator

Search This thread

dangelob

New member
May 11, 2022
2
0
Hi,

This is my first project that I'm currently working on.

I recently bought a android dashcam which UI I would like to change based on my personal preferences. Unfortunately I'm struggling to setup an environment where I can test the changes I make before replacing the original UI on the device itself. I identified the SystemUI.apk to be the place where the manufacturer made customization. I will be using the SystemUI.apk built from AOSP and making my changes based on that. I had no luck trying to decompile the SystemUI.apk in a way that I could build it again.

I was thinking that I could use an android emulator to use the same ROM as the device itself. The manufacturer did not provide any support in providing stock firmware images in any way. So I used the following steps to 'export' the firmware.
1. Unlocking the bootloader using the Identifier Token so I can flash images using fastboot. TWRP was not an option here because I could not find any images for my device nor could I port an TWRP image myself.
2. Enable ADB debugging over usb
3. Enable ADB root privileges using the password: 2846 (if i remember correctly)
4. Use ADB remount and ADB root to gain privileges over the partitions
5. Gain information on partition data
6. Use ADB pull to export images based on partitions

After following the above steps the next thing was to import the images into an emulator. I used the following steps to do this:
1. Create a new device within Android Studio that has the same screen size and os.
2. Replace the system.img, ramdisk.img with the exported variants in ~/Android/Sdk/../arm64-v8a
3. Turn off EncryptUserData inside advancedFeatures.ini to prevent errors like partitions that are unable to encrypt
4. Use the command below to start the emulator
Code:
~/Android/Sdk/emulator/emulator -avd Junsun_A104_API_27 -verbose -show-kernel
5. After running the emulator I receive the error below and the screen of the emulator stays black.
Code:
Please append a correct "root=" boot option; here are the available partitions:
fe00         2867200 vda  driver: virtio_blk
fe10           67584 vdb  driver: virtio_blk
fe20          819200 vdc  driver: virtio_blk
fe30          409600 vdd  driver: virtio_blk
fe40          524288 vde  driver: virtio_blk
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

My assumption is that the emulator does not contain the same partition model used on the device. I could try to export each partition but I wouldn't know how to let the emulator know how to use these partitions. I tried to export the kernel and import it inside the emulator without luck. I did not receive any errors that way.

So my main question is:
- Is there any way I can import the device's rom inside an android emulator

AvdId=Junsun_A104_API_27
PlayStore.enabled=false
abi.type=arm64-v8a
avd.ini.displayname=Junsun A104 API 27
avd.ini.encoding=UTF-8
disk.dataPartition.size=800M
fastboot.chosenSnapshotFile=
fastboot.forceChosenSnapshotBoot=no
fastboot.forceColdBoot=no
fastboot.forceFastBoot=yes
hw.accelerometer=yes
hw.arc=false
hw.audioInput=yes
hw.battery=yes
hw.camera.back=virtualscene
hw.camera.front=emulated
hw.cpu.arch=arm64
hw.cpu.ncore=4
hw.dPad=no
hw.device.hash2=MD5:7834f5e80eb849ceb46ce01cd4c704f7
hw.device.manufacturer=User
hw.device.name=Junsun A104
hw.gps=yes
hw.gpu.enabled=no
hw.gpu.mode=off
hw.initialOrientation=landscape
hw.keyboard=yes
hw.lcd.density=120
hw.lcd.height=320
hw.lcd.width=1480
hw.mainKeys=no
hw.ramSize=2560
hw.sdCard=yes
hw.sensors.orientation=yes
hw.sensors.proximity=yes
hw.trackBall=no
image.sysdir.1=system-images/android-27/default/arm64-v8a/
runtime.network.latency=none
runtime.network.speed=full
sdcard.size=512M
showDeviceFrame=no
skin.dynamic=yes
skin.name=1480x320
skin.path=_no_skin
skin.path.backup=/home/dangelo/Android/Sdk/skins/tv_1080p
tag.display=Default Android System Image
tag.id=default
vm.heapSize=48

$ cat /proc/partitions
major minor #blocks name

1 0 8192 ram0
1 1 8192 ram1
1 2 8192 ram2
1 3 8192 ram3
1 4 8192 ram4
1 5 8192 ram5
1 6 8192 ram6
1 7 8192 ram7
1 8 8192 ram8
1 9 8192 ram9
1 10 8192 ram10
1 11 8192 ram11
1 12 8192 ram12
1 13 8192 ram13
1 14 8192 ram14
1 15 8192 ram15
254 0 1572864 zram0
179 0 30670848 mmcblk0
179 1 5120 mmcblk0p1
179 2 1024 mmcblk0p2
179 3 35840 mmcblk0p3
179 4 1024 mmcblk0p4
179 5 6144 mmcblk0p5
179 6 6144 mmcblk0p6
179 7 1024 mmcblk0p7
259 0 1024 mmcblk0p8
259 1 1024 mmcblk0p9
259 2 1024 mmcblk0p10
259 3 4096 mmcblk0p11
259 4 1024 mmcblk0p12
259 5 1024 mmcblk0p13
259 6 1024 mmcblk0p14
259 7 1024 mmcblk0p15
259 8 1024 mmcblk0p16
259 9 1024 mmcblk0p17
259 10 1024 mmcblk0p18
259 11 1024 mmcblk0p19
259 12 10240 mmcblk0p20
259 13 2048 mmcblk0p21
259 14 25600 mmcblk0p22
259 15 1024 mmcblk0p23
259 16 10240 mmcblk0p24
259 17 20480 mmcblk0p25
259 18 1024 mmcblk0p26
259 19 35840 mmcblk0p27
259 20 2867200 mmcblk0p28
259 21 153600 mmcblk0p29
259 22 409600 mmcblk0p30
259 23 1024 mmcblk0p31
259 24 1024 mmcblk0p32
259 25 27059183 mmcblk0p33
179 24 4096 mmcblk0rpmb
179 16 4096 mmcblk0boot1
179 8 4096 mmcblk0boot0
253 0 27059167 dm-0

output using the ls command with arguments that I forgot
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 boot -> /dev/block/mmcblk0p27
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 cache -> /dev/block/mmcblk0p29
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 fbootlogo -> /dev/block/mmcblk0p13
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 gpsbd -> /dev/block/mmcblk0p19
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 gpsgl -> /dev/block/mmcblk0p18
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_deltanv -> /dev/block/mmcblk0p23
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_fixnv1 -> /dev/block/mmcblk0p14
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_fixnv2 -> /dev/block/mmcblk0p15
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_gdsp -> /dev/block/mmcblk0p24
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_ldsp -> /dev/block/mmcblk0p25
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_modem -> /dev/block/mmcblk0p22
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_runtimenv1 -> /dev/block/mmcblk0p16
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_runtimenv2 -> /dev/block/mmcblk0p17
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 logo -> /dev/block/mmcblk0p12
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 misc -> /dev/block/mmcblk0p4
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 miscdata -> /dev/block/mmcblk0p2
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 persist -> /dev/block/mmcblk0p21
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 pm_sys -> /dev/block/mmcblk0p26
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 prodnv -> /dev/block/mmcblk0p1
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 recovery -> /dev/block/mmcblk0p3
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 sml -> /dev/block/mmcblk0p7
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 sml_bak -> /dev/block/mmcblk0p8
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 system -> /dev/block/mmcblk0p28
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 trustos -> /dev/block/mmcblk0p5
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 trustos_bak -> /dev/block/mmcblk0p6
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 uboot -> /dev/block/mmcblk0p9
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 uboot_bak -> /dev/block/mmcblk0p10
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 uboot_log -> /dev/block/mmcblk0p11
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 userdata -> /dev/block/mmcblk0p33
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 vbmeta -> /dev/block/mmcblk0p31
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 vbmeta_bak -> /dev/block/mmcblk0p32
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 vendor -> /dev/block/mmcblk0p30
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 wcnmodem -> /dev/block/mmcblk0p20

Device name: Junsun A104
Android: 8.1. Oreo API level 27
CPU:
64bit
ARM64-V8A
Spreadtrum SC9832e
Memory: 2GB
Kernel architecture: aarch64
Kernel version: 4.4.83-00001-g213b4e3
 

Droidriven

Senior Member
Jan 27, 2014
15,419
9
5,358
NC
Verizon Samsung Galaxy S III
HTC Thunderbolt
Hi,

This is my first project that I'm currently working on.

I recently bought a android dashcam which UI I would like to change based on my personal preferences. Unfortunately I'm struggling to setup an environment where I can test the changes I make before replacing the original UI on the device itself. I identified the SystemUI.apk to be the place where the manufacturer made customization. I will be using the SystemUI.apk built from AOSP and making my changes based on that. I had no luck trying to decompile the SystemUI.apk in a way that I could build it again.

I was thinking that I could use an android emulator to use the same ROM as the device itself. The manufacturer did not provide any support in providing stock firmware images in any way. So I used the following steps to 'export' the firmware.
1. Unlocking the bootloader using the Identifier Token so I can flash images using fastboot. TWRP was not an option here because I could not find any images for my device nor could I port an TWRP image myself.
2. Enable ADB debugging over usb
3. Enable ADB root privileges using the password: 2846 (if i remember correctly)
4. Use ADB remount and ADB root to gain privileges over the partitions
5. Gain information on partition data
6. Use ADB pull to export images based on partitions

After following the above steps the next thing was to import the images into an emulator. I used the following steps to do this:
1. Create a new device within Android Studio that has the same screen size and os.
2. Replace the system.img, ramdisk.img with the exported variants in ~/Android/Sdk/../arm64-v8a
3. Turn off EncryptUserData inside advancedFeatures.ini to prevent errors like partitions that are unable to encrypt
4. Use the command below to start the emulator
Code:
~/Android/Sdk/emulator/emulator -avd Junsun_A104_API_27 -verbose -show-kernel
5. After running the emulator I receive the error below and the screen of the emulator stays black.
Code:
Please append a correct "root=" boot option; here are the available partitions:
fe00         2867200 vda  driver: virtio_blk
fe10           67584 vdb  driver: virtio_blk
fe20          819200 vdc  driver: virtio_blk
fe30          409600 vdd  driver: virtio_blk
fe40          524288 vde  driver: virtio_blk
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

My assumption is that the emulator does not contain the same partition model used on the device. I could try to export each partition but I wouldn't know how to let the emulator know how to use these partitions. I tried to export the kernel and import it inside the emulator without luck. I did not receive any errors that way.

So my main question is:
- Is there any way I can import the device's rom inside an android emulator

AvdId=Junsun_A104_API_27
PlayStore.enabled=false
abi.type=arm64-v8a
avd.ini.displayname=Junsun A104 API 27
avd.ini.encoding=UTF-8
disk.dataPartition.size=800M
fastboot.chosenSnapshotFile=
fastboot.forceChosenSnapshotBoot=no
fastboot.forceColdBoot=no
fastboot.forceFastBoot=yes
hw.accelerometer=yes
hw.arc=false
hw.audioInput=yes
hw.battery=yes
hw.camera.back=virtualscene
hw.camera.front=emulated
hw.cpu.arch=arm64
hw.cpu.ncore=4
hw.dPad=no
hw.device.hash2=MD5:7834f5e80eb849ceb46ce01cd4c704f7
hw.device.manufacturer=User
hw.device.name=Junsun A104
hw.gps=yes
hw.gpu.enabled=no
hw.gpu.mode=off
hw.initialOrientation=landscape
hw.keyboard=yes
hw.lcd.density=120
hw.lcd.height=320
hw.lcd.width=1480
hw.mainKeys=no
hw.ramSize=2560
hw.sdCard=yes
hw.sensors.orientation=yes
hw.sensors.proximity=yes
hw.trackBall=no
image.sysdir.1=system-images/android-27/default/arm64-v8a/
runtime.network.latency=none
runtime.network.speed=full
sdcard.size=512M
showDeviceFrame=no
skin.dynamic=yes
skin.name=1480x320
skin.path=_no_skin
skin.path.backup=/home/dangelo/Android/Sdk/skins/tv_1080p
tag.display=Default Android System Image
tag.id=default
vm.heapSize=48

$ cat /proc/partitions
major minor #blocks name

1 0 8192 ram0
1 1 8192 ram1
1 2 8192 ram2
1 3 8192 ram3
1 4 8192 ram4
1 5 8192 ram5
1 6 8192 ram6
1 7 8192 ram7
1 8 8192 ram8
1 9 8192 ram9
1 10 8192 ram10
1 11 8192 ram11
1 12 8192 ram12
1 13 8192 ram13
1 14 8192 ram14
1 15 8192 ram15
254 0 1572864 zram0
179 0 30670848 mmcblk0
179 1 5120 mmcblk0p1
179 2 1024 mmcblk0p2
179 3 35840 mmcblk0p3
179 4 1024 mmcblk0p4
179 5 6144 mmcblk0p5
179 6 6144 mmcblk0p6
179 7 1024 mmcblk0p7
259 0 1024 mmcblk0p8
259 1 1024 mmcblk0p9
259 2 1024 mmcblk0p10
259 3 4096 mmcblk0p11
259 4 1024 mmcblk0p12
259 5 1024 mmcblk0p13
259 6 1024 mmcblk0p14
259 7 1024 mmcblk0p15
259 8 1024 mmcblk0p16
259 9 1024 mmcblk0p17
259 10 1024 mmcblk0p18
259 11 1024 mmcblk0p19
259 12 10240 mmcblk0p20
259 13 2048 mmcblk0p21
259 14 25600 mmcblk0p22
259 15 1024 mmcblk0p23
259 16 10240 mmcblk0p24
259 17 20480 mmcblk0p25
259 18 1024 mmcblk0p26
259 19 35840 mmcblk0p27
259 20 2867200 mmcblk0p28
259 21 153600 mmcblk0p29
259 22 409600 mmcblk0p30
259 23 1024 mmcblk0p31
259 24 1024 mmcblk0p32
259 25 27059183 mmcblk0p33
179 24 4096 mmcblk0rpmb
179 16 4096 mmcblk0boot1
179 8 4096 mmcblk0boot0
253 0 27059167 dm-0

output using the ls command with arguments that I forgot
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 boot -> /dev/block/mmcblk0p27
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 cache -> /dev/block/mmcblk0p29
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 fbootlogo -> /dev/block/mmcblk0p13
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 gpsbd -> /dev/block/mmcblk0p19
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 gpsgl -> /dev/block/mmcblk0p18
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_deltanv -> /dev/block/mmcblk0p23
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_fixnv1 -> /dev/block/mmcblk0p14
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_fixnv2 -> /dev/block/mmcblk0p15
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_gdsp -> /dev/block/mmcblk0p24
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_ldsp -> /dev/block/mmcblk0p25
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_modem -> /dev/block/mmcblk0p22
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_runtimenv1 -> /dev/block/mmcblk0p16
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 l_runtimenv2 -> /dev/block/mmcblk0p17
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 logo -> /dev/block/mmcblk0p12
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 misc -> /dev/block/mmcblk0p4
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 miscdata -> /dev/block/mmcblk0p2
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 persist -> /dev/block/mmcblk0p21
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 pm_sys -> /dev/block/mmcblk0p26
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 prodnv -> /dev/block/mmcblk0p1
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 recovery -> /dev/block/mmcblk0p3
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 sml -> /dev/block/mmcblk0p7
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 sml_bak -> /dev/block/mmcblk0p8
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 system -> /dev/block/mmcblk0p28
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 trustos -> /dev/block/mmcblk0p5
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 trustos_bak -> /dev/block/mmcblk0p6
lrwxrwxrwx 1 root root 20 2022-04-29 14:35 uboot -> /dev/block/mmcblk0p9
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 uboot_bak -> /dev/block/mmcblk0p10
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 uboot_log -> /dev/block/mmcblk0p11
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 userdata -> /dev/block/mmcblk0p33
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 vbmeta -> /dev/block/mmcblk0p31
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 vbmeta_bak -> /dev/block/mmcblk0p32
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 vendor -> /dev/block/mmcblk0p30
lrwxrwxrwx 1 root root 21 2022-04-29 14:35 wcnmodem -> /dev/block/mmcblk0p20

Device name: Junsun A104
Android: 8.1. Oreo API level 27
CPU:
64bit
ARM64-V8A
Spreadtrum SC9832e
Memory: 2GB
Kernel architecture: aarch64
Kernel version: 4.4.83-00001-g213b4e3
All you should need is the system.img and the kernel, then extract the system.img untill you find the /system/app and/or the /system/priv-app(whichever folder contains your UI.apk), extract a copy of the UI.apk. Then use APKtool to remove the signature on the apk file then decompile the apk file then make your modifications then recompile and re-sign the apk file. Then place the newly modified UI.apk in the system folder where you extracted it from(overwrite/delete the old version of the apk). Then compress all the files back into the system.img like it was originally and then try to use your newly modified system.img in your emulator.

Try using Bluestacks or one of the other leading android emulators instead of using Android Studio.