gsi_util: adding flash_gsi subcommand
This change implements the flash_gsi subcommand: 1. Erase userdata/cache partition 2. Erase metadata partition (optional) 3. Flash generic system image 4. Disable Android Verified Boot (optional) 5. Reboot the device Bug: 70253882 Test: make gsi_util Test: gsi_util flash_gsi Test: gsi_util --debug flash_gsi --image system.img Change-Id: I552c04aaf227c6fca2e5c3caab26d713e2f6f5d0
This commit is contained in:
@@ -20,6 +20,9 @@ python_binary_host {
|
||||
"gsi_util/commands/*.py",
|
||||
"gsi_util/utils/*.py",
|
||||
],
|
||||
required: [
|
||||
"avbtool",
|
||||
],
|
||||
version: {
|
||||
py2: {
|
||||
enabled: true,
|
||||
|
||||
@@ -28,7 +28,7 @@ class GsiUtil(object):
|
||||
|
||||
# Adds gsi_util COMMAND here.
|
||||
# TODO(bowgotsai): auto collect from gsi_util/commands/*.py
|
||||
_COMMANDS = ['hello']
|
||||
_COMMANDS = ['flash_gsi', 'hello']
|
||||
|
||||
_LOGGING_FORMAT = '%(message)s'
|
||||
_LOGGING_LEVEL = logging.WARNING
|
||||
|
||||
63
gsi/gsi_util/gsi_util/commands/flash_gsi.py
Normal file
63
gsi/gsi_util/gsi_util/commands/flash_gsi.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# Copyright 2017 - The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
"""Implementation of gsi_util flash_gsi command."""
|
||||
|
||||
from gsi_util.utils import cmd_utils
|
||||
from gsi_util.utils import fastboot_utils
|
||||
from gsi_util.utils import file_utils
|
||||
|
||||
|
||||
def do_flash_gsi(args):
|
||||
"""Flashes a GSI image (system.img).
|
||||
|
||||
Also erases userdata/metadata partition and disables
|
||||
Android Verified Boot (AVB).
|
||||
|
||||
Args:
|
||||
args: flash_gsi command arguments.
|
||||
"""
|
||||
|
||||
fastboot_utils.erase() # erases userdata/cache partition
|
||||
# Not every device has metadata partition, so allow_error is True.
|
||||
fastboot_utils.erase('metadata', allow_error=True)
|
||||
|
||||
# Flashes GSI.
|
||||
fastboot_utils.flash('system', args.image)
|
||||
|
||||
# Disables AVB.
|
||||
with file_utils.UnopenedTemporaryFile() as vbmeta_image:
|
||||
# vbmeta flag 2 means disable entire AVB verification.
|
||||
cmd_utils.run_command(['avbtool', 'make_vbmeta_image',
|
||||
'--flag', '2',
|
||||
'--padding_size', '4096',
|
||||
'--output', vbmeta_image])
|
||||
# Not every device uses AVB, so allow_error is True.
|
||||
fastboot_utils.flash('vbmeta', vbmeta_image, allow_error=True)
|
||||
|
||||
# Reboots the device.
|
||||
fastboot_utils.reboot()
|
||||
|
||||
|
||||
def setup_command_args(subparsers):
|
||||
"""Sets up command args for 'flash_gsi'."""
|
||||
parser = subparsers.add_parser(
|
||||
'flash_gsi', help='flash a GSI image',
|
||||
description=('Flash a GSI image - '
|
||||
'including erasing userdata, '
|
||||
'disabling AVB (if the device supports AVB) '
|
||||
'and erasing metadata partition (if the device has).'))
|
||||
parser.add_argument('-i', '--image',
|
||||
help='the GSI image to flash', type=str)
|
||||
parser.set_defaults(func=do_flash_gsi)
|
||||
45
gsi/gsi_util/gsi_util/utils/fastboot_utils.py
Normal file
45
gsi/gsi_util/gsi_util/utils/fastboot_utils.py
Normal file
@@ -0,0 +1,45 @@
|
||||
# Copyright 2017 - The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
"""Fastboot-related commands."""
|
||||
|
||||
from gsi_util.utils.cmd_utils import run_command
|
||||
|
||||
|
||||
def flash(partition_name, image_name=None, allow_error=False):
|
||||
"""fastboot flash a partition with a given image."""
|
||||
|
||||
cmd = ['fastboot', 'flash', partition_name]
|
||||
|
||||
# image_name can be None, for `fastboot` to flash
|
||||
# ${ANDROID_PRODUCT_OUT}/{partition_name}.img.
|
||||
if image_name is not None:
|
||||
cmd.append(image_name)
|
||||
|
||||
run_command(cmd, raise_on_error=not allow_error)
|
||||
|
||||
|
||||
def erase(partition_name=None, allow_error=False):
|
||||
"""fastboot erase a partition."""
|
||||
|
||||
if partition_name is None:
|
||||
run_command(['fastboot', '-w'], raise_on_error=not allow_error)
|
||||
else:
|
||||
run_command(['fastboot', 'erase', partition_name],
|
||||
raise_on_error=not allow_error)
|
||||
|
||||
|
||||
def reboot():
|
||||
"""fastboot reboot a device."""
|
||||
run_command(['fastboot', 'reboot'], raise_on_error=False)
|
||||
Reference in New Issue
Block a user