首页 > 解决方案 > 如何在 kapt 中设置包 ID

问题描述

我用功能模块重写了我们的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 是包 id,所以我有 1 个应用程序,2 个功能模块,包 id 是 0x79、0x80、0x81。所以这里的问题是如何使这些包 id 为 0x79。什么设置将启用/禁用不同的包 ID。

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

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

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

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

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

它不起作用。

标签: androidandroid-layout

解决方案


修复很简单,只需使 minSdkVersion 低于 26。您将获得低于 0x80 的包 ID。但为什么还是未知数。

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

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


推荐阅读