I am interested in trying to compile an android application from the command line using aapt2. I am having a problem linking the constraint-layout library when I try to perform the aapt2 link
command. This program builds successfully from Android studio/gradle. How can I make gradle command line invocation show me the aapt2 command it is running?
For the record, I have tried to run ./gradlew assembleDebug --debug and all I can see is the calls to the aapt2-proto library.
Link
The command will be a bit complicated and will depend on many things (like your resources, the project's dependencies, flags used etc), so the easiest way to get the full command is to actually "break" a resource.
Edit your res/values/strings.xml file to contain:
<string name="incorrect">@string/idontexist</string>
Go to the project's directory and run "gradlew clean assembleDebug". AAPT2 will fail during linking and Android Gradle Plugin will print out the full command used.
I'm using version 3.2.0-alpha13 and it gives me the command in full:
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
The flags used here for AAPT2:
Other flags that might be useful to you:
Compile
Compile command is pretty straightforward. You basically tell AAPT2 which single file to compile and where to output it.
<path>aapt2 compile -o /path/to/output/dir /path/to/file/to/compile.xml
The flags for compile are:
One thing to keep in mind is that the compiled files are binary .flat files and the output name is based in the input name and the file's parent directory name. That means if an input file was res/drawable-450dpi/img.pngthe output file will be drawable-450dpi_img.png.flat. Compiled values files get the extension "arsc.flat" instead of just ".flat", so a file res/values-en/strings.xml will be compiled to values-en_strings.arsc.flat. This is done automatically by AAPT2 so you don't need to worry about it, but it's good to know in case you need to find the compiled file later on.
Another fun fact about compile is that it's nifty when it comes to remembering what the input file was (and the line numbers for XML files), so if linking fails the error won't point to the .flat file, but to the original input file instead.