我正在对AOSP SystemUI应用程序进行一些修改,并且在尝试在任意设备上运行时遇到了一个非常特殊的问题:findViewById()
返回null
,同时浏览其中孩子们发现它确实存在。
我正在使用this AOSP source code并通过lunch full-eng
和make
进行构建。它编译得很好,但是SystemUI在第337行的逻辑中与IllegalArgumentException崩溃:
mRecentsContainer = (ViewGroup) findViewById(R.id.recents_container);
[...]
if (mRecentsContainer instanceof RecentsHorizontalScrollView){
[...]
} else if (mRecentsContainer instanceof RecentsVerticalScrollView){
[...]
}
else {
throw new IllegalArgumentException("missing Recents[Horizontal]ScrollView");
}
一些调试显示mRecentsContainer
实际上是null
。
我认为可能是一个布局被夸大而没有包含该特定视图,所以为了检查,我使用getChildCount()
和getChildAt()
以递归方式浏览所有视图的子项。事实并非如此; @id/recents_container
就在那里,两层深处:
> @id/recents_root (7f0e0070) [RecentsPanelView]: (2 children)
--> @id/recents_bg_protect (7f0e0071) [FrameLayout]: (2 children)
----> @id/recents_container (7f0e0072) [RecentsVerticalScrollView]: (1 children)
------> @id/recents_linear_layout (7f0e0073) [LinearLayout]: (0 children)
----> @id/recents_no_apps (7f0e0074) [FrameLayout]: (1 children)
------> [unnamed] (ffffffff) [TextView]
--> @id/recents_dismiss_button (7f0e0075) [View]
安装应用程序时,来自system_process
的Logcat会出现一个单一提示:
12-11 22:38:01.090:W / ResourceType(165):无法在包0中输入0x7f060000(t = 5 e = 0)(错误-75)
检查R.java
目录中的SystemUI_intermediates
会发现它指向一个看似无关的status_bar_recents_app_label_color
,这只是res/values/color.xml
中定义的颜色。
导致这种情况的原因是什么?布局是不是正确膨胀,因为我在我没有编译的设备上运行它?我认为可能问题可能是SystemUI对内部Android资源的引用,这些资源可能无法正确映射到我设备上的资源。这可能吗?
答案 0 :(得分:1)
显然,一些生成的文件仍然存在。
从头开始重建源make clean
解决了它。
或者,我已经发现删除以下中间目录可以加快构建速度,但我不能100%确定它涵盖了所有目录:
rm -rf out/target/product/generic/obj/APPS/SystemUI_intermediates/
rm -rf out/target/common/R/com/android/systemui
rm -rf out/target/product/generic/obj/APPS/framework-res_intermediates/
rm -f /out/target/common/R/com/android/internal/R.java
rm -rf out/target/product/generic/obj/PACKAGING/
rm -f out/target/product/generic/system/app/SystemUI.apk