定义了 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 )

关于Android混淆文件统一管理

Android项目Git提交仓库的忽略文件

Android项目Git提交仓库的忽略文件

gradle

找不到自定义的 gradle plugin