Amdroid 4.0コンパイル生成Recoveryのエラー:ValueError:toomany values to unpack

3603 ワード

差分パッケージを作成する過程でこの問題を発見し、その後、このプロジェクトはコンパイルの過程ですでに報告が間違っていることに気づいたが、影響しないだけだ.img .binファイルの生成です.
エラーメッセージ:
Traceback (most recent call last):
  File "./build/tools/releasetools/ota_from_target_files", line 1107, in <module>
    main(sys.argv[1:])
  File "./build/tools/releasetools/ota_from_target_files", line 1075, in main
    WriteFullOTAPackage(input_zip, output_zip, OPTIONS.fota)
  File "./build/tools/releasetools/ota_from_target_files", line 460, in WriteFullOTAPackage
    Item.GetMetadata(input_zip)
  File "./build/tools/releasetools/ota_from_target_files", line 177, in GetMetadata
    name, uid, gid, mode = line.split()
ValueError: too many values to unpack
make: *** [out/{Project Name}/target/product/{Project Name}/{Project Name}-ota-eng.root_2k.zip] Error 1

エラーの関数:
  def GetMetadata(cls, input_zip):

    try:
      # See if the target_files contains a record of what the uid,
      # gid, and mode is supposed to be.
      output = input_zip.read("META/filesystem_config.txt")
    except KeyError:
      # Run the external 'fs_config' program to determine the desired
      # uid, gid, and mode for every Item object.  Note this uses the
      # one in the client now, which might not be the same as the one
      # used when this target_files was built.
      p = common.Run(["fs_config"], stdin=subprocess.PIPE,
                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      suffix = { False: "", True: "/" }
      input = "".join(["%s%s
" % (i.name, suffix[i.dir]) for i in cls.ITEMS.itervalues() if i.name]) output, error = p.communicate(input) assert not error for line in output.split("
"): if not line: continue name, uid, gid, mode = line.split() i = cls.ITEMS.get(name, None) if i is not None: i.uid = int(uid) i.gid = int(gid) i.mode = int(mode, 8) if i.dir: i.children.sort(key=lambda i: i.name) # set metadata for the files generated by this script. i = cls.ITEMS.get("system/recovery-from-boot.p", None) if i: i.uid, i.gid, i.mode = 0, 0, 0644 i = cls.ITEMS.get("system/etc/install-recovery.sh", None) if i: i.uid, i.gid, i.mode = 0, 0, 0544

解決:この問題は最終的に解決し、まずプロジェクトの背景を振り返る.
変更項目は暗証番号によって19の事業者を切り替えることができ、各事業者のスイッチング機のアニメーション、壁紙などが異なるため、出荷時に持参したapkもあり、あるapkをフィルタリングし、対応する事業者を正常に切り替えるために異なるカスタマイズを実現するために、コンパイルファイルシステムに/SYSTEM/vendor/thirdpartyディレクトリを追加し、顧客が提供したいくつかのapkを追加した.
コンパイル後filesystem_config.txtにもそのディレクトリの体現がある.しかし、apkをコミットするときにお客様から直接与えられたように、apkの名前を変更せず、apkの名前にスペースがあるため、この問題が発生しました.
エラー2
Traceback (most recent call last):
  File "./build/tools/releasetools/ota_from_target_files", line 1159, in <module>
    main(sys.argv[1:])
  File "./build/tools/releasetools/ota_from_target_files", line 1136, in main
    OPTIONS.source_info_dict = common.LoadInfoDict(source_zip, OPTIONS.device_type)
  File "/workspace/Q885SHIP/build/tools/releasetools/common.py", line 111, in LoadInfoDict
    raise ValueError("can't find recovery API version in input target-files")
ValueError: can't find recovery API version in input target-files

参照先:http://blog.csdn.net/npjocj/article/details/12624043