android - 如何在 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")
}
}
它不起作用。
解决方案
修复很简单,只需使 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)。
推荐阅读
- javascript - 来自 WDIo Cli 的 Appium 功能中的名称
- assembly - 通过字符串循环遇到指针和跟踪寄存器值的问题
- reactjs - 离子反应集并没有真正设定值
- swift - 滚动到最后一个单元格时 UITableViewCell 约束失败
- java - 实现系统应用程序时如何在不显示通知的情况下启动ForegroundService()?
- xamarin - Xamarin:第一次调用 InitializeComponent 很慢
- jenkins - 在 Jenkins 中通过 Okta API 创建 Okta 用户
- coq - 流的感应原理
- google-apps-script - 使用脚本更改文件名后如何更新 Google 表单显示
- django - Django heroku 模板 password_reset_confirm.html 不起作用