code: def Install(self, apk_path, destination_dir='', replace_existing=True,
                  grant_permissions=False, timeout_ms=None, transfer_progress_callback=None):
          
          if not destination_dir:
              destination_dir = '/data/local/tmp/'
          basename = os.path.basename(apk_path)
          destination_path = posixpath.join(destination_dir, basename)
          self.Push(apk_path, destination_path, timeout_ms=timeout_ms, progress_callback=transfer_progress_callback)
  
          cmd = ['pm install']
          if grant_permissions:
              cmd.append('-g')
          if replace_existing:
              cmd.append('-r')
          cmd.append('"{}"'.format(destination_path))
  
          ret = self.Shell(' '.join(cmd), timeout_ms=timeout_ms)
  
          # Remove the apk
          rm_cmd = ['rm', destination_path]
          rmret = self.Shell(' '.join(rm_cmd), timeout_ms=timeout_ms)
  
          return ret
docs: Install an apk to the device.
  
          Doesn't support verifier file, instead allows destination directory to be
          overridden.
  
          Args:
            apk_path: Local path to apk to install.
            destination_dir: Optional destination directory. Use /system/app/ for
              persistent applications.
            replace_existing: whether to replace existing application
            grant_permissions: If True, grant all permissions to the app specified in its manifest
            timeout_ms: Expected timeout for pushing and installing.
            transfer_progress_callback: callback method that accepts filename, bytes_written and total_bytes of APK transfer
  
          Returns:
            The pm install output.