从纯 Makefile 构建 APK 时如何正确生成 Android 库项目的 R.java 文件?

Rub*_*ben 5 ant android makefile android-resources

为了更好地理解 Android 应用程序开发工具的工作原理,我开始使用纯 GNU Makefile 来创建完全独立于antgradle的 APK 。我从这个 Makefile 中调用低级工具(管道工命令),例如aaptjavacjarsignerzipaligndalvik-exchangeaidl。(我参考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;
    }
}
Run Code Online (Sandbox Code Playgroud)

文件被放置在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
Run Code Online (Sandbox Code Playgroud)

后来,我为主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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

该文件被放置在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
Run Code Online (Sandbox Code Playgroud)

让我困惑的是,这两种情况下的资源 ID 是不同的。我注意到,为了让应用程序正常工作,我必须修改第一个文件并将 ID 更改为最后一个文件中的 ID。我还没有找到任何自动执行此操作的管道工工具,因此我觉得需要编写一个自定义工具来完成这项工作。但是当用ant构建时,这显然会以某种方式自动发生,所以我想我一定错过了一些东西......任何人都可以告诉我我错过了什么吗?