Proguard删除android库中的重写资源ID

时间:2015-12-01 01:00:20

标签: android android-gradle proguard android-resources android-proguard

我有一个带有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?

1 个答案:

答案 0 :(得分:0)

AppLegendActivity班级中,您覆盖LegendActivity,您需要更改setContentView(R.layout.....);或删除super.onCreate(Bundle b);