code: def add(self, filename, raw_data=None, dx=None):
          
          if not raw_data:
              log.debug("Loading file from '{}'".format(filename))
              with open(filename, "rb") as fp:
                  raw_data = fp.read()
  
          ret = androconf.is_android_raw(raw_data)
          log.debug("Found filetype: '{}'".format(ret))
          if not ret:
              return None
  
          if ret == "APK":
              digest, _ = self.addAPK(filename, raw_data)
          elif ret == "DEX":
              digest, _, _ = self.addDEX(filename, raw_data, dx)
          elif ret == "DEY":
              digest, _, _ = self.addDEY(filename, raw_data, dx)
          else:
              return None
  
          return digest
docs: Generic method to add a file to the session.
  
          This is the main method to use when adding files to a Session!
  
          If an APK file is supplied, all DEX files are analyzed too.
          For DEX and ODEX files, only this file is analyzed (what else should be
          analyzed).
  
          Returns the SHA256 of the analyzed file.
  
          :param filename: filename to load
          :param raw_data: bytes of the file, or None to load the file from filename
          :param dx: An already exiting :class:`~androguard.core.analysis.analysis.Analysis` object
          :return: the sha256 of the file or None on failure