获取gradle构建的aapt2参数?

时间:2018-05-02 20:05:37

标签: android gradle aapt aapt2

我有兴趣尝试使用aapt2从命令行编译android应用程序。我在尝试执行aapt2 link命令时遇到连接约束布局库的问题。该程序从Android studio / gradle成功构建。如何让gradle命令行调用向我显示它正在运行的aapt2命令?

为了记录,我试图运行./gradlew assembleDebug --debug,我只能看到对aapt2-proto库的调用。

1 个答案:

答案 0 :(得分:3)

链接

该命令将有点复杂并且将取决于许多事情(例如您的资源,项目的依赖关系,使用的标志等),因此获得完整命令的最简单方法是实际" break&#34 ;资源 编辑 res / values / strings.xml 文件以包含:

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

转到项目目录并运行&#34; gradlew clean assembleDebug&#34;。链接期间AAPT2将失败,Android Gradle Plugin将打印出所使用的完整命令 我使用的是版本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 :平台的路径&#39; android.jar
  • - 清单:清单文件(AGP使用合并的清单,而不仅仅是您的来源中的清单)
  • -o :输出文件
  • -R :资源。通常你会一个接一个地通过,但由于这里有很多,他们会被写入文件,然后该文件被传递给AAPT2(这就是为什么&#39;&#39; s&#39 34; @&#34;路径前的符号)
  • - 自动添加叠加:允许叠加
  • - java :R.java的输出目录
  • - proguard-main-dex :主要dex的Proguard规则的输出文件
  • - custom-package :R class的包
  • -0 :请勿压缩这些扩展程序
  • - output-text-symbols :R.txt的输出文件
  • - 无版本载体:没有矢量绘图的自动版本控制

可能对您有用的其他标志:

  • -v :详细记录
  • -A :包含您希望放置在APK文件中的资源的目录,不会被处理或压缩,只是按原样放入输出文件
  • -h :打印出帮助

编译

编译命令非常简单。你基本上告诉AAPT2要编译哪个单个文件以及输出它的位置。

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

编译的标志是:

  • -o :将放置编译文件的目录
  • - 伪本地化:为伪语言环境生成源
  • - 遗产:导致AAPT2更宽松,并将某些错误视为警告(如AAPT1所做)
  • -v :详细记录
  • -h :打印出帮助

要记住的一件事是编译的文件是二进制.flat文件,输出名称基于输入名称和文件的父目录名称。这意味着如果输入文件是 res / drawable-450dpi / img.png ,则输出文件将是 drawable-450dpi_img.png.flat 。编译值文件获得扩展名&#34; arsc.flat&#34;而不只是&#34; .flat&#34;,所以文件 res / values-en / strings.xml 将被编译为 values-en_strings.arsc.flat 。这是由AAPT2自动完成的,因此您不必担心它,但如果您以后需要查找已编译的文件,请务必知道。

关于编译的另一个有趣的事实是,它在记住输入文件是什么(以及XML文件的行号)时非常好,所以如果链接失败,错误就不会指向.flat文件,但改为原始输入文件。