我有一个带有LegendActivity的库,使用布局legend.xml,它引用id为“icons”的视图。现在,在我的应用程序中,我使用“AppLegendActivity”将此活动子类化,并使用应用程序的覆盖legend.xml,其中不包含任何带有“icon”的视图。
库
public class LegendActivity extends Activity {
@Override
public void onCreate(Bundle b) {
setContentView(R.layout.legend);
View icons_view = findViewById(R.id.icons);
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/icons"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
应用
public class AppLegendActivity extends LegendActivity {
@Override
public void onCreate(Bundle b) {
super.onCreate(Bundle b);
View app_icons_view = findViewById(R.id.app_icons);
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/app_icons"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
这是对我的实际代码的过度简化,但这是问题的症结所在。当我运行pro-guard时,我收到以下错误:
Warning: com.example.activity.LegendActivity: can't find referenced field 'int icons' in program class com.example.R$id
如果我在proguard中添加“-dontwarn”标志,我可以让应用程序进行编译,但是一旦AppLegendActivity调用super.onCreate,就会调用对R.id.icons的引用,应用程序崩溃:
ava.lang.NoSuchFieldError: com.example.r.icons
App的build.grade引用proguard部分:
buildTypes {
release {
// Proguard
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
我的proguard-rules.pro
-dontwarn com.example.**
可以重新考虑此代码以避免此崩溃吗?是。我可以简单地重命名一些资源文件并让这个冲突消失吗?当然。但在实际项目中,这个更加复杂,我不知道这种重构的影响的全部延伸。有没有办法让库的R文件不删除/混淆应用程序覆盖资源后不再可见的ID?
答案 0 :(得分:0)
在AppLegendActivity
班级中,您覆盖LegendActivity
,您需要更改setContentView(R.layout.....);
或删除super.onCreate(Bundle b);