Add new build command avd_patch

This commit is contained in:
topjohnwu
2022-01-19 05:12:11 -08:00
parent f443cbaa2b
commit 20ef724fad
7 changed files with 158 additions and 31 deletions

View File

@ -383,24 +383,6 @@ def build_stub(args):
build_apk(args, 'stub')
def build_snet(args):
if not op.exists(op.join('stub', 'src', 'main', 'java', 'com', 'topjohnwu', 'snet')):
error('snet sources have to be bind mounted on top of the stub folder')
header('* Building snet extension')
proc = execv([gradlew, 'stub:assembleRelease'])
if proc.returncode != 0:
error('Build snet extention failed!')
source = op.join('stub', 'build', 'outputs', 'apk',
'release', 'stub-release.apk')
target = op.join(config['outdir'], 'snet.jar')
# Extract classes.dex
with zipfile.ZipFile(target, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=False) as zout:
with zipfile.ZipFile(source) as zin:
zout.writestr('classes.dex', zin.read('classes.dex'))
rm(source)
header('Output: ' + target)
def cleanup(args):
support_targets = {'native', 'java'}
if args.target:
@ -470,13 +452,54 @@ def setup_avd(args):
abi = cmd_out([adb_path, 'shell', 'getprop', 'ro.product.cpu.abi'])
proc = execv([adb_path, 'push', f'native/out/{abi}/busybox', 'out/app-debug.apk',
'scripts/emulator.sh', '/data/local/tmp'])
'scripts/avd_magisk.sh', '/data/local/tmp'])
if proc.returncode != 0:
error('adb push failed!')
proc = execv([adb_path, 'shell', 'sh', '/data/local/tmp/emulator.sh'])
proc = execv([adb_path, 'shell', 'sh', '/data/local/tmp/avd_magisk.sh'])
if proc.returncode != 0:
error('emulator.sh failed!')
error('avd_magisk.sh failed!')
def patch_avd_ramdisk(args):
build_binary(args)
build_app(args)
header('* Patching emulator ramdisk.img')
# Create a backup to prevent accidental overwrites
backup = args.ramdisk + '.bak'
if not op.exists(backup):
cp(args.ramdisk, backup)
ini = op.join(op.dirname(args.ramdisk), 'advancedFeatures.ini')
with open(ini, 'r') as f:
adv_ft = f.read()
# Need to turn off system as root
if 'SystemAsRoot = on' in adv_ft:
# Create a backup
cp(ini, ini + '.bak')
adv_ft = adv_ft.replace('SystemAsRoot = on', 'SystemAsRoot = off')
with open(ini, 'w') as f:
f.write(adv_ft)
abi = cmd_out([adb_path, 'shell', 'getprop', 'ro.product.cpu.abi'])
proc = execv([adb_path, 'push', f'native/out/{abi}/busybox', 'out/app-debug.apk',
'scripts/avd_patch.sh', '/data/local/tmp'])
if proc.returncode != 0:
error('adb push failed!')
proc = execv([adb_path, 'push', backup, '/data/local/tmp/ramdisk.cpio.gz'])
if proc.returncode != 0:
error('adb push failed!')
proc = execv([adb_path, 'shell', 'sh', '/data/local/tmp/avd_patch.sh'])
if proc.returncode != 0:
error('avd_patch.sh failed!')
proc = execv([adb_path, 'pull', '/data/local/tmp/ramdisk.cpio.gz', args.ramdisk])
if proc.returncode != 0:
error('adb pull failed!')
def build_all(args):
@ -512,13 +535,13 @@ stub_parser = subparsers.add_parser('stub', help='build the stub app')
stub_parser.set_defaults(func=build_stub)
avd_parser = subparsers.add_parser(
'emulator', help='build and setup AVD for development')
'emulator', help='setup AVD for development')
avd_parser.set_defaults(func=setup_avd)
# Need to bind mount snet sources on top of stub folder
# Note: source code for the snet extension is *NOT* public
snet_parser = subparsers.add_parser('snet', help='build snet extension')
snet_parser.set_defaults(func=build_snet)
avd_patch_parser = subparsers.add_parser(
'avd_patch', help='patch AVD ramdisk.img')
avd_patch_parser.add_argument('ramdisk', help='path to ramdisk.img')
avd_patch_parser.set_defaults(func=patch_avd_ramdisk)
clean_parser = subparsers.add_parser('clean', help='cleanup')
clean_parser.add_argument(