问题的背景是这个样子的:我们的项目里面集成了zxing库,今天开发人员发现,RN调试界面打开Dev Setting时居然打开的是zxing的配置界面(´⊙ω⊙`)
如下图:
zxing的配置界面
本人是iOS开发出身,Android代码只能是看得懂,原理什么的不清楚,大概方向就是两个页面的资源重复了,先查到Dev Setting打开的页面资源名
public class DevSettingsActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(getApplication().getResources().getString(R.string.catalyst_settings_title));
addPreferencesFromResource(R.xml.preferences);
}
}
全局搜索了一下,确实发现了react-native和zxing中都有preferences.xml文件,再查看app/build/intermediates/res/merged/debug/xml/preferences.xml,发现内容和zxing的preferences.xml一致,这么说来就是build相同名字资源文件时优先级的问题了。
于是我去看build.gradle的依赖配置,发现了zxing配置在react-native之前,猜想可能就是编译顺序问题了,调整了一下位置后,Dev Setting跳转回RN的配置界面了。
// 错误顺序
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':zxing')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.facebook.react:react-native:+'
....
// 正确顺序
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.facebook.react:react-native:+'
compile project(':zxing')
....
估计是编译时合并资源文件做了去重处理,先编译到的就先留下,后编译到的就抛弃。
网友评论