仅当使用 proguard + gradle 构建时才会出现该问题。如果从 android 工具和 proguard 导出 - 所有引用都会正确映射。
问题:
我在库项目中定义了一些 id
<resources>
<item type="id" name="background" />
</resources>
Activity 布局位于主项目中
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@id/background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/splash"
tools:ignore="ContentDescription" />
使用 proguard 构建后的 NullPointer
被抛出到主项目的 Activity
this.findViewById(R.id.background).setOnClickListener(new View.OnClickListener() {
不要建议我重新定义 id,因为这是错误的方法并且无论如何都会崩溃。
android:id="@+id/background"
更新:事实证明,它甚至弄乱了主项目布局中定义的 id,例如
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/backgroundTEST"/>
也因 NullPointerException
崩溃。我认为这是因为库项目,因为第一个失败的项目来自库项目。
配置如下
$ANDROID_HOME/tools/proguard/proguard-android.txt
是
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-dontoptimize
-dontpreverify
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-dontwarn android.support.**
我的项目的 proguard-project.txt
-injars bin/classes
-injars libs
-outjars bin/classes-processed.jar
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.support.v4.app.FragmentActivity
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
来自build.gradle
buildTypes {
release {
runProguard true
proguardFile getDefaultProguardFile('proguard-android.txt')
proguardFile 'proguard-project.txt'
signingConfig signingConfigs.release
}
}
我担心的是,它可能不包含 getDefaultProguardFile('proguard-android.txt')
。
好吧,为了进行实验,我已将 proguard-android.txt
内容复制粘贴到 proguard-project.txt
> 还是之后
gradle clean
gradle assembleRelease
它崩溃了。
最佳答案
我的 Proguard 配置中有它来满足 R
类
-keepclassmembers class **.R$* {
public static <fields>;
}
关于android - Proguard 与 Gradle 混淆了 id 的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20144378/