如何在 kapt 中设置包 ID

How to set package id in kapt

我用功能模块重写了我们的 android 应用程序,例如,在功能模块中,有一些布局文件。 layout/feature_entry.xml,当我记录 R.layout.feature_entry 的值时,我得到 -2130575360(0x81020000)。为什么值为负数,如何解决。

负 id 的一个后果是 DynamicNavHostFragment 无法工作,它会使应用程序崩溃。

崩溃是由于 id 为负造成的,就像:

Caused by: java.lang.IllegalStateException: FragmentContainerView must have an android:id to add Fragment androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment with tag layout/fragment_android_map_0 at androidx.fragment.app.FragmentContainerView.<init>(FragmentContainerView.java:157) at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:51) at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:239) at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1061) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:997) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961) at android.view.LayoutInflater.inflate(LayoutInflater.java:659) at android.view.LayoutInflater.inflate(LayoutInflater.java:534) at androidx.databinding.DataBindingUtil.inflate(DataBindingUtil.java:126) at androidx.databinding.ViewDataBinding.inflateInternal(ViewDataBinding.java:1368)

在FragmentContainerView.java中:

if (name != null && existingFragment == null) {
            if (id <= 0) {
                final String tagMessage = tag != null
                        ? " with tag " + tag
                        : "";
                throw new IllegalStateException("FragmentContainerView must have an android:id to "
                        + "add Fragment " + name + tagMessage);
            }

因此,如果您获得否定的视图 ID,它将抛出 IllegalStateException。

一开始,我不知道为什么会这样。但是这些id是由aapt编译的,这些整数id的格式类似于PPNNXXXX,PP是package id,所以我有1个app,2个feature module,package id分别是0x79,0x80,0x81。 所以这里的问题是如何使这些包 id 为 0x79。什么设置会 enable/disable 不同的包 ID。

更新: 单独的包 id 是可以的,问题是它不应该是负数的 0x8x。那么如何阻止生成无效的包 ID,如 0x8x。

更新: 如果使用aapt2,通过以下方法可以设置package id:

aaptOptions { 
additionalParameters '--allow-reserved-package-id','--package-id','0x70'
}

我认为它不起作用,因为我正在使用 kapt。试过

kapt {
        arguments {
            arg("allow-reserved-package-id", "true")
            arg("package-id", "0x20")
        }
    }

没用。

修复很简单,只需将 minSdkVersion 设置为低于 26 即可。您将获得低于 0x80 的包 ID。但为什么仍然未知。

更新: 在Android 8(API level 26)之前,不支持大于0x7f的资源包id。所以如果我们定义 minSdVersion 为 25,由于兼容性,大于 0x7f 的 package id 将不会被分配。

对于大于 25 的 minSdVersion,将使用大于 0x7f 的包 ID,但是,androidx.fragment.app.FragmentContainerView不支持大于 0x7f 的包 ID。这很可能是 androidx.fragment.app.FragmentContainerView(从 1.4.0-alpha05 开始)的错误。