为了更好地理解Android应用开发工具的工作原理,我开始使用纯GNU Makefile来创建完全独立于 ant 或 gradle 的APK。从这个Makefile我调用低级工具(管道工命令),如 aapt , javac , jarsigner , zipalign , dalvik-exchange , aidl 。 (我参考https://spin.atomicobject.com/2011/08/22/building-android-application-bundles-apks-by-hand/了解一些背景知识)对于小而简单的应用程序项目,现在效果非常好,但是我对一些更复杂的应用程序有一些问题。
在这种特殊情况下,有一个Android应用程序,其中包含一个包含代码和资源的单独库项目。当我使用 aapt 为库项目生成R.java文件时,结果如下:
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.mycompany.myapp.mylibrary;
public final class R {
public static final class attr {
}
public static final class drawable {
public static int image1=0x7f020000;
public static int image2=0x7f020001;
public static int image3=0x7f020002;
public static int image4=0x7f020003;
}
public static final class raw {
public static int indexes=0x7f030000;
public static int vertices=0x7f030001;
}
}
并将文件放在 gen / com / mycompany / myapp / mylibrary / R.java 中。
用于创建文件的命令如下所示。
aapt package --non-constant-id -f -m -0 apk --output-text-symbols ../MyLibraryProject/bin -M ../MyLibraryProject/AndroidManifest.xml -S ../MyLibraryProject/res -I /usr/lib/android-sdk/platforms/android-16/android.jar -J ../MyLibraryProject/gen --generate-dependencies -G ../MyLibraryProject/bin/proguard.txt
稍后,我为主App项目创建了一个常见的R.java。这个也将填写库项目的资源ID(与其他资源一起),但这里库项目的ID是不同的。 (请注意,下面的“...”表示与其他库项目/应用项目本身的资源相关的许多其他行)
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/
package com.mycompany.myapp.mylibrary;
public final class R {
...
public static final class drawable {
...
public static final int image1=0x7f02006f;
public static final int image2=0x7f020070;
public static final int image3=0x7f020073;
public static final int image4=0x7f020074;
...<
}
public static final class raw {
public static final int indexes=0x7f040000;
public static final int vertices=0x7f040001;
}
...
}
该文件放在 gen / com / mycompany / myapp / R.java 中。 要生成此文件,请运行:
aapt package -f -m -0 apk --output-text-symbols bin --auto-add-overlay -M AndroidManifest.xml -S res -S ../MyLibraryProject/bin/res -S ../MyLibraryProject/res -I /usr/lib/android-sdk/platforms/android-16/android.jar -J gen --generate-dependencies -G bin/proguard.txt
让我感到困惑的是,这两种情况下的资源ID不同。我注意到,为了使应用程序正常工作,我将不得不修改第一个文件并将ID更改为它们在最后一个文件中的位置。我还没有找到任何自动执行此操作的管道工工具,所以我觉得需要编写一个自定义工具来完成这项工作。但是当用 ant 构建时,这显然会以某种方式自动发生,所以我想我一定会错过一些东西......谁能告诉我我缺少什么?