diff --git a/tools/run_on_app.py b/tools/run_on_app.py
index 0415a52..add4b77 100755
--- a/tools/run_on_app.py
+++ b/tools/run_on_app.py
@@ -386,6 +386,23 @@
     return 'deploy' if options.compiler == 'r8' else 'proguarded'
   return options.type
 
+def has_injars_and_libraryjars(pgconfs):
+  # Check if there are -injars and -libraryjars in the configuration.
+  has_injars = False
+  has_libraryjars = False
+  for pgconf in pgconfs:
+    pgconf_dirname = os.path.abspath(os.path.dirname(pgconf))
+    with open(pgconf) as pgconf_file:
+      for line in pgconf_file:
+        trimmed = line.strip()
+        if trimmed.startswith('-injars'):
+          has_injars = True
+        elif trimmed.startswith('-libraryjars'):
+          has_libraryjars = True
+        if has_injars and has_libraryjars:
+          return True
+  return False
+
 def check_no_injars_and_no_libraryjars(pgconfs):
   # Ensure that there are no -injars or -libraryjars in the configuration.
   for pgconf in pgconfs:
@@ -398,7 +415,6 @@
         elif trimmed.startswith('-libraryjars'):
           raise Exception("Unexpected -libraryjars found in " + pgconf)
 
-
 def run_with_options(options, args, extra_args=None, stdout=None, quiet=False):
   if extra_args is None:
     extra_args = []
@@ -441,7 +457,7 @@
     print('Valid types are {}'.format(version.keys()))
     return 1
   values = version[type]
-  inputs = None
+  inputs = []
   # For R8 'deploy' the JAR is located using the Proguard configuration
   # -injars option. For chrome and nest we don't have the injars in the
   # proguard files.
@@ -460,24 +476,30 @@
   if 'main-dex-list' in values:
     args.extend(['--main-dex-list', values['main-dex-list']])
 
+  libraries = values['libraries'] if 'libraries' in values else []
   if options.compiler == 'r8':
     if 'pgconf' in values and not options.k:
-      sanitized_lib_path = os.path.join(
-          os.path.abspath(outdir), 'sanitized_lib.jar')
-      if 'no_inputs_in_pgconf' in values and values['no_inputs_in_pgconf']:
-        check_no_injars_and_no_libraryjars(values['pgconf'])
-        SanitizeLibraries(
-          sanitized_lib_path, values['libraries'], values['inputs'])
-        args.extend(['--lib', sanitized_lib_path])
-        for lib in values['pgconf']:
-          args.extend(['--pg-conf', lib])
-        args.extend(values['inputs'])
-      else:
+      if has_injars_and_libraryjars(values['pgconf']):
+        sanitized_lib_path = os.path.join(
+            os.path.abspath(outdir), 'sanitized_lib.jar')
         sanitized_pgconf_path = os.path.join(
             os.path.abspath(outdir), 'sanitized.config')
         SanitizeLibrariesInPgconf(
             sanitized_lib_path, sanitized_pgconf_path, values['pgconf'])
+        libraries = [sanitized_lib_path]
         args.extend(['--pg-conf', sanitized_pgconf_path])
+      else:
+        # -injars without -libraryjars or vice versa is not supported.
+        check_no_injars_and_no_libraryjars(values['pgconf'])
+        for pgconf in values['pgconf']:
+          args.extend(['--pg-conf', pgconf])
+        if 'sanitize_libraries' in values and values['sanitize_libraries']:
+          sanitized_lib_path = os.path.join(
+              os.path.abspath(outdir), 'sanitized_lib.jar')
+          SanitizeLibraries(
+            sanitized_lib_path, values['libraries'], values['inputs'])
+          libraries = [sanitized_lib_path]
+          inputs = values['inputs']
       app_provided_pg_conf = True
     if options.k:
       args.extend(['--pg-conf', options.k])
@@ -493,9 +515,8 @@
       extra_args.append('-Dcom.android.tools.r8.stringSwitchConversion=1')
       extra_args.append('-Dcom.android.tools.r8.traverseOneOfAndRepeatedProtoFields=0')
 
-  if (not options.no_libraries and 'libraries' in values
-      and 'no_inputs_in_pgconf' in values and not values['no_inputs_in_pgconf']):
-    for lib in values['libraries']:
+  if not options.no_libraries:
+    for lib in libraries:
       args.extend(['--lib', lib])
 
   if not outdir.endswith('.zip') and not outdir.endswith('.jar') \
@@ -515,8 +536,7 @@
   if options.r8_flags:
     args.extend(options.r8_flags.split(' '))
 
-  if inputs:
-    args.extend(inputs)
+  args.extend(inputs)
 
   t0 = time.time()
   if options.dump_args_file:
diff --git a/tools/youtube_data.py b/tools/youtube_data.py
index d94393f..17ae6eb 100644
--- a/tools/youtube_data.py
+++ b/tools/youtube_data.py
@@ -158,9 +158,10 @@
       'min-api' : ANDROID_L_API,
     },
     'deploy' : {
-      # -injars and -libraryjars are no longer used in the configuration. Instead
-      # they are taken directly from 'inputs' and 'libraries'.
-      'no_inputs_in_pgconf': True,
+      # When -injars and -libraryjars are used for specifying inputs library
+      # sanitization is on by default. For this version of YouTube -injars and
+      # -libraryjars are not used, but library sanitization is still required.
+      'sanitize_libraries': True,
       'inputs': ['%s_deploy.jar' % V14_44_PREFIX],
       'libraries' : [os.path.join(V14_44_BASE, 'legacy_YouTubeRelease_combined_library_jars.jar')],
       'pgconf': [
