簡體   English   中英

獲取gradle構建的aapt2參數?

[英]Getting the aapt2 parameters of a gradle build?

我有興趣嘗試使用aapt2從命令行編譯android應用程序。 嘗試執行aapt2 link命令時,鏈接約束布局庫時出現問題。 該程序可從Android studio / gradle成功構建。 如何使gradle命令行調用向我顯示正在運行的aapt2命令?

作為記錄,我嘗試運行./gradlew assembleDebug --debug,我所看到的只是對aapt2-proto庫的調用。

鏈接

該命令會有點復雜,並且取決於很多事情(例如您的資源,項目的依賴項,使用的標志等),因此獲取完整命令的最簡單方法是實際“破壞”資源。
編輯您的res / values / strings.xml文件以包含:

<string name="incorrect">@string/idontexist</string>

轉到項目目錄,然后運行“ gradlew clean assembleDebug”。 AAPT2在鏈接期間將失敗,並且Android Gradle插件將打印出所使用的完整命令。
我正在使用3.2.0-alpha13版本,它為我提供了完整的命令:

error: failed linking references.
Command: <path>/.gradle/caches/transforms-1/files-1.1/aapt2-3.2.0-alpha13-4662957-linux.jar/cbe84ab07c48b199e5fe8d202dd5845e/aapt2-3.2.0-alpha13-4662957-linux/aapt2 link -I\
      <path>/Android/Sdk/platforms/android-27/android.jar\
      --manifest\
      <path>/AndroidStudioProjects/Library/app/build/intermediates/merged_manifests/debug/processDebugManifest/merged/AndroidManifest.xml\
      -o\
      <path>/AndroidStudioProjects/Library/app/build/intermediates/processed_res/debug/processDebugResources/out/resources-debug.ap_\
      -R\
      @<path>/AndroidStudioProjects/Library/app/build/intermediates/incremental/processDebugResources/resources-list-for-resources-debug.ap_.txt\
      --auto-add-overlay\
      --java\
      <path>/AndroidStudioProjects/Library/app/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r\
      --proguard-main-dex\
      <path>/AndroidStudioProjects/Library/app/build/intermediates/legacy_multidex_aapt_derived_proguard_rules/debug/processDebugResources/manifest_keep.txt\
      --custom-package\
      com.example.foo.bar\
      -0\
      apk\
      --output-text-symbols\
      <path>/AndroidStudioProjects/Library/app/build/intermediates/symbols/debug/R.txt\
      --no-version-vectors
Daemon:  AAPT2 aapt2-3.2.0-alpha13-4662957-linux Daemon #0

此處用於AAPT2的標志:

  • -I :平台的android.jar的路徑
  • --manifest :清單文件(AGP使用合並的清單,而不只是源文件中的清單)
  • -o :輸出文件
  • -R :資源。 通常,您將一一傳遞,但是由於這里有很多傳遞,因此它們被寫入文件,然后將該文件傳遞給AAPT2(這就是路徑前面有“ @”符號的原因)
  • --auto-add-overlay :允許覆蓋
  • --java :R.java的輸出目錄
  • --proguard-main-dex :主dex的Proguard規則的輸出文件
  • --custom-package :R類的軟件包
  • -0 :不壓縮這些擴展名
  • --output-text-symbols :R.txt的輸出文件
  • --no-version-vectors :沒有矢量可繪制對象的自動版本控制

其他可能對您有用的標志:

  • -v :詳細日志記錄
  • -A :包含要放置在APK文件中的資產的目錄,將不會對其進行處理或壓縮,只需將其原樣放入輸出文件
  • -h :打印出幫助

編譯

編譯命令非常簡單。 您基本上可以告訴APT2編譯哪個文件以及在哪里輸出。

<path>aapt2 compile -o /path/to/output/dir /path/to/file/to/compile.xml

編譯標志為:

  • -o :將放置編譯文件的目錄
  • --pseudo-localize :生成偽語言環境的源
  • --legacy :使AAPT2寬大處理並將某些錯誤視為警告(如AAPT1那樣)
  • -v :詳細日志記錄
  • -h :打印出幫助

要記住的一件事是,編譯文件是二進制.flat文件,輸出名稱基於輸入名稱和文件的父目錄名稱。 這意味着,如果輸入文件為res / drawable-450dpi / img.png,則輸出文件將為drawable-450dpi_img.png.flat 編譯后的值文件的擴展名為“ arsc.flat”,而不僅僅是“ .flat”,因此res / values-en / strings.xml文件將被編譯為values-en_strings.arsc.flat 這是由AAPT2自動完成的,因此您不必擔心,但是如果以后需要查找已編譯的文件,很高興知道這一點。

關於編譯的另一個有趣的事實是,記住輸入文件的內容(以及XML文件的行號)很漂亮,因此,如果鏈接失敗,錯誤將不會指向.flat文件,而是指向原始輸入文件代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM