我有兴趣尝试使用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: list 文件(AGP使用合并的 list ,而不只是源文件中的 list )
  • -o:输出文件
  • -R:资源。通常,您将一一传递,但是由于这里有很多传递,因此它们被写入一个文件,然后将该文件传递给AAPT2(这就是为什么路径前有“@”符号的原因)
  • -自动添加覆盖:允许覆盖
  • --java:R.java的输出目录
  • --proguard-main-dex:主dex的Proguard规则的输出文件
  • --custom-package:R类
  • 的软件包
  • -0:不压缩这些扩展
  • --output-text-symbols:R.txt的输出文件
  • --no-version-vectors:没有 vector 可绘制对象
  • 的自动版本控制

    其他可能对您有用的标志:
  • -v:详细记录
  • -A:包含要放置在APK文件中的 Assets 的目录,它们不会被处理或压缩,只需按原样放入输出文件
  • -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文件,而是指向原始输入文件代替。

    10-08 18:01