android - Proguard 与 Gradle 混淆了 id 的定义

标签 android gradle obfuscation proguard android-library

仅当使用 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/

相关文章:

java - Firebase 在不同设备/Android 版本上以不同顺序返回子节点的 key

android - 为生产 React Native 发布应用程序

java - 使用 JAX-RS 带注释的资源的 ReSTLet 客户端

java - 按姓名搜索联系人列表

grails - 有什么办法可以反编译grails/groovy jar文件?

intellij-idea - 无法从 IntelliJ 中的 Gradle 脚本解决 groovy 文件

android - 云消息和安卓

asp.net - 如何使 ASP.NET HTML 代码对客户端(用户)不可见

java - 使用 Eclipse IDE 排除第 3 方库,它是来自 ProGuard 的类和子类

java - 混淆器:NoSuchMethodError:android.net.http.AndroidHttpClient.execute