diff --git a/tools/apk_masseur.py b/tools/apk_masseur.py
index 0edd032..b1ea43e 100755
--- a/tools/apk_masseur.py
+++ b/tools/apk_masseur.py
@@ -48,7 +48,7 @@
 def findKeystore():
   return os.path.join(os.getenv('HOME'), '.android', 'app.keystore')
 
-def repack(apk, processed_out, resources, temp, quiet):
+def repack(apk, processed_out, resources, temp, quiet, logging):
   processed_apk = os.path.join(temp, 'processed.apk')
   shutil.copyfile(apk, processed_apk)
   if not processed_out:
@@ -60,14 +60,14 @@
   # Delete original dex files in APK.
   with utils.ChangedWorkingDirectory(temp, quiet=quiet):
     cmd = ['zip', '-d', 'processed.apk', '*.dex']
-    utils.RunCmd(cmd, quiet=quiet)
+    utils.RunCmd(cmd, quiet=quiet, logging=logging)
 
   # Unzip the jar or zip file into `temp`.
   if processed_out.endswith('.zip') or processed_out.endswith('.jar'):
     cmd = ['unzip', processed_out, '-d', temp]
     if quiet:
       cmd.insert(1, '-q')
-    utils.RunCmd(cmd, quiet=quiet)
+    utils.RunCmd(cmd, quiet=quiet, logging=logging)
     processed_out = temp
 
   # Insert the new dex and resource files from `processed_out` into the APK.
@@ -75,15 +75,16 @@
     dex_files = glob.glob('*.dex')
     resource_files = glob.glob(resources) if resources else []
     cmd = ['zip', '-u', '-9', processed_apk] + dex_files + resource_files
-    utils.RunCmd(cmd, quiet=quiet)
+    utils.RunCmd(cmd, quiet=quiet, logging=logging)
   return processed_apk
 
-def sign(unsigned_apk, keystore, temp, quiet):
+def sign(unsigned_apk, keystore, temp, quiet, logging):
   signed_apk = os.path.join(temp, 'unaligned.apk')
-  apk_utils.sign_with_apksigner(unsigned_apk, signed_apk, keystore, quiet=quiet)
+  apk_utils.sign_with_apksigner(
+      unsigned_apk, signed_apk, keystore, quiet=quiet, logging=logging)
   return signed_apk
 
-def align(signed_apk, temp, quiet):
+def align(signed_apk, temp, quiet, logging):
   utils.Print('Aligning', quiet=quiet)
   aligned_apk = os.path.join(temp, 'aligned.apk')
   zipalign_path = (
@@ -96,12 +97,12 @@
     signed_apk,
     aligned_apk
   ]
-  utils.RunCmd(cmd, quiet=quiet)
+  utils.RunCmd(cmd, quiet=quiet, logging=logging)
   return signed_apk
 
 def masseur(
     apk, dex=None, resources=None, out=None, adb_options=None, keystore=None,
-    install=False, quiet=False):
+    install=False, quiet=False, logging=True):
   if not out:
     out = os.path.basename(apk)
   if not keystore:
@@ -109,14 +110,15 @@
   with utils.TempDir() as temp:
     processed_apk = None
     if dex:
-      processed_apk = repack(apk, dex, resources, temp, quiet)
+      processed_apk = repack(apk, dex, resources, temp, quiet, logging)
     else:
       utils.Print(
           'Signing original APK without modifying dex files', quiet=quiet)
       processed_apk = os.path.join(temp, 'processed.apk')
       shutil.copyfile(apk, processed_apk)
-    signed_apk = sign(processed_apk, keystore, temp, quiet=quiet)
-    aligned_apk = align(signed_apk, temp, quiet=quiet)
+    signed_apk = sign(
+        processed_apk, keystore, temp, quiet=quiet, logging=logging)
+    aligned_apk = align(signed_apk, temp, quiet=quiet, logging=logging)
     utils.Print('Writing result to {}'.format(out), quiet=quiet)
     shutil.copyfile(aligned_apk, out)
     if install:
@@ -125,7 +127,7 @@
         adb_cmd.extend(
             [option for option in adb_options.split(' ') if option])
       adb_cmd.extend(['install', '-t', '-r', '-d', out]);
-      utils.RunCmd(adb_cmd, quiet=quiet)
+      utils.RunCmd(adb_cmd, quiet=quiet, logging=logging)
 
 def main():
   (options, apk) = parse_options()
diff --git a/tools/apk_utils.py b/tools/apk_utils.py
index 86f1fe8..69a9db9 100644
--- a/tools/apk_utils.py
+++ b/tools/apk_utils.py
@@ -7,10 +7,10 @@
 import subprocess
 import utils
 
-def sign(unsigned_apk, signed_apk, keystore, quiet=False):
+def sign(unsigned_apk, signed_apk, keystore, quiet=False, logging=True):
   utils.Print('Signing (ignore the warnings)', quiet=quiet)
   cmd = ['zip', '-d', unsigned_apk, 'META-INF/*']
-  utils.RunCmd(cmd, quiet=quiet)
+  utils.RunCmd(cmd, quiet=quiet, logging=logging)
   cmd = [
     'jarsigner',
     '-sigalg', 'SHA1withRSA',
@@ -24,7 +24,8 @@
   utils.RunCmd(cmd, quiet=quiet)
 
 def sign_with_apksigner(
-    unsigned_apk, signed_apk, keystore, password='android', quiet=False):
+    unsigned_apk, signed_apk, keystore, password='android', quiet=False,
+    logging=True):
   cmd = [
     os.path.join(utils.getAndroidBuildTools(), 'apksigner'),
     'sign',
@@ -35,4 +36,4 @@
     '--out', signed_apk,
     unsigned_apk
   ]
-  utils.RunCmd(cmd, quiet=quiet)
+  utils.RunCmd(cmd, quiet=quiet, logging=logging)
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 22e7aa1..23d790a 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -660,7 +660,8 @@
           signed_apk,
           options.keystore,
           options.keystore_password,
-          quiet=options.quiet)
+          quiet=options.quiet,
+          logging=IsLoggingEnabledFor(app, options))
 
   if os.path.isfile(signed_apk):
     apk_dest = os.path.join(out_dir, signed_apk_name)
@@ -811,13 +812,15 @@
     cmd.append('--main-dex-rules')
     cmd.append(main_dex_rules)
 
-  utils.RunCmd(cmd, quiet=options.quiet)
+  utils.RunCmd(
+    cmd, quiet=options.quiet, logging=IsLoggingEnabledFor(app, options))
 
   # Make a copy of the given APK, move the newly generated dex files into the
   # copied APK, and then sign the APK.
   apk_masseur.masseur(
       apk, dex=zip_dest, resources='META-INF/services/*', out=apk_dest,
-      quiet=options.quiet, keystore=options.keystore)
+      quiet=options.quiet, logging=IsLoggingEnabledFor(app, options),
+      keystore=options.keystore)
 
 def RunMonkey(app, options, apk_dest):
   if not WaitForEmulator(options):
@@ -836,7 +839,8 @@
       '-s', str(random_seed), str(number_of_events_to_generate)]
 
   try:
-    stdout = utils.RunCmd(cmd, quiet=options.quiet)
+    stdout = utils.RunCmd(
+        cmd, quiet=options.quiet, logging=IsLoggingEnabledFor(app, options))
     succeeded = (
         'Events injected: {}'.format(number_of_events_to_generate) in stdout)
   except subprocess.CalledProcessError as e:
