定义了 Gradle 混乱 id 的 Proguard
Posted
技术标签:
【中文标题】定义了 Gradle 混乱 id 的 Proguard【英文标题】:Proguard with Gradle messes id's defined 【发布时间】:2013-12-07 07:18:56 【问题描述】:只有在使用 proguard + gradle 构建时才会出现此问题。如果从 android 工具和 proguard 导出 - 所有引用都正确映射。
问题:
我在一个库项目中定义了一些 id
<resources>
<item type="id" name="background" />
</resources>
活动布局在主项目中
<?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_
android:layout_
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
它崩溃了。
【问题讨论】:
【参考方案1】:我在我的 Proguard 配置中有它来满足 R
类
-keepclassmembers class **.R$*
public static <fields>;
【讨论】:
我实际上将其包含在默认配置中。对不起,我没有提到。我已经用更多细节更新了答案。【参考方案2】:尝试添加以下内容:
-keepclasseswithmembernames class *
public <init>(android.content.Context, android.util.AttributeSet, int);
【讨论】:
谢谢。但这无助于解决使用 Gradle 构建时缺少 id 的问题。以上是关于定义了 Gradle 混乱 id 的 Proguard的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件组件化中的 Gradle 构建脚本实现 ② ( 组件化基本实现 | Project 相关目录 | 定义组件切换标志位 | 切换插件导入 | 切换设置应用 ID )