无法在我的 android 应用程序中使 proguard 工作

Posted

技术标签:

【中文标题】无法在我的 android 应用程序中使 proguard 工作【英文标题】:Not able to make proguard work in my android app 【发布时间】:2018-05-08 03:51:23 【问题描述】:

我无法让 proguard 在我的应用中工作。当我将 minify 启用为 true 时,布局屏幕中的 textinputlayout 工作正常,但我有一个包含一个膨胀 XML 的警报对话框,该 XML 没有膨胀(该 XML 包含一个 textinputlayout。请帮助大家。这是代码 sn-p。

PS:我正在使用移动应用发布,请不要因为对齐不正确而抨击。我真的需要帮助。

Build.gradle 条目-->

buildTypes  
           release         
           minifyEnabled true 
           proguardFiles getDefaultProguardFile('proguardandroid.txt'),    'proguard-rules.pro'         signingConfig
           signingConfigs.release   
                   
          

       dependencies  compile fileTree(include: ['*.jar'], dir: 'libs')      
       compile 'com.android.support:appcompat-v7:25.1.0'
       compile 'com.google.code.gson:gson:2.2.4'
       compile 'com.android.support:design:25.1.0' 
       compile 'com.android.support:support-v4:25.1.0'
       compile 'com.android.support:cardview-v7:25.1.0'
       compile project(':volley-1.0.0') 
       compile project(':photoview-1.2.4') 
       compile project(':calligraphy-2.2.0') 

XML 屏幕中的TextInputLayout -->

    <android.support.design.widget.TextInputLayout    
    android:id="@+id/pin_login_wrapper" 
    android:layout_     
    android:layout_>   

    <android.support.design.widget.TextInputEditText    
    android:layout_         
    android:layout_        
    android:gravity="center_horizontal"     
    android:hint="Please enter PIN"         
    android:inputType="numberPassword"
    android:maxLength="4" 
    android:textSize="24sp"/>  
    </android.support.design.widget.TextInputLayout>

警报对话框代码-->

AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.AlertDialogStyle); 
final TextInputLayout otpWrapper = (TextInputLayout) (LayoutInflater.from(getContext())).inflate(R.layout.single_edit_text_material, null);
otpWrapper.setHint("Please enter OTP"); 
otpWrapper.getEditText().setSingleLine(true); 
otpWrapper.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER); 
setEditTextMaxLength(otpWrapper.getEditText(), 6); 
builder.setView(otpWrapper); builder.setNegativeButton("Cancel", null); 
builder.setPositiveButton("Submit", new DialogInterface.OnClickListener()
    @Override   public void onClick(DialogInterface dialog, int which) 
     
 );
 builder.setCancelable(false); final AlertDialog d = builder.create(); 
 d.setCanceledOnTouchOutside(false); d.show();

single_edit_text_material.xml -->

    <android.support.design.widget.TextInputLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/wrapper" android:layout_ 
    android:layout_ android:paddingEnd="8dp" 
    android:paddingStart="8dp" android:paddingTop="8dp"> 
    <android.support.design.widget.TextInputEditText 
    android:layout_ 
    android:layout_/> 
    </android.support.design.widget.TextInputLayout>

编辑:当 proguard 未启用时,对话框会在工作状态下弹出 textinputlayout,但当我启用 proguard 时,会弹出对话框但 textinputlayout 不存在,只有确定按钮存在。 android监视器没有错误

proguard 关闭时的屏幕

proguard 开启时的屏幕

【问题讨论】:

您无法将 TextInputLayout 设置为视图,甚至无法对其进行充气。看我的回答你就明白了。 你能发布错误消息/堆栈跟踪吗? @AesSedai101 Android 显示器没有错误。 【参考方案1】:

proguard-rules 中忽略 TextInputLayoutAlertDialog 包和类。

看看下面的例子

How to keep/exclude a particular package path when using proguard?

How keep my class from obfuscate by proguard

How to exclude a classes from being kept by proguard

【讨论】:

【参考方案2】:

我没有正确配置 proguard,也没有保留 gson 库使用的模型。所以我的对象返回的值完全不同。由于启用了 proguard,所以我无法调试,这让我认为我们可能需要对 UI 元素进行例外处理。但是 Pankaj 的帮助让我意识到这不是 UI,所以随机搜索让我知道我们需要保留 gson 库使用的模型类

【讨论】:

很高兴间接听到,我帮助您解决了您的问题。【参考方案3】:

试试下面的代码。

对于您的 single_edit_text_material.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/textInput"
        android:layout_
        android:layout_
        android:hint="Please enter OTP">

        <EditText
            android:id="@+id/editText"
            android:layout_
            android:layout_
            android:maxLength="6" />

    </android.support.design.widget.TextInputLayout>

</LinearLayout>

在您要显示警报对话框的活动中,使用以下代码:

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.Theme_AppCompat_Dialog_Alert);
View view = (LayoutInflater.from(this)).inflate(R.layout.single_edit_text_material, null);
TextInputLayout otpWrapper = view.findViewById(R.id.textInput);
EditText editText = view.findViewById(R.id.editText);
builder.setView(view);
builder.setNegativeButton("Cancel", null);
builder.setPositiveButton("Submit", new DialogInterface.OnClickListener() 
    @Override
    public void onClick(DialogInterface dialog, int which) 
    
);
builder.setCancelable(false);
final AlertDialog d = builder.create();
d.setCanceledOnTouchOutside(false);
d.show();

你会得到下面的输出:

【讨论】:

同样的事情正在发生。当 proguard 未启用时,对话框在工作状态下弹出 textinputlayout,但是当我启用 proguard 时,对话框正在弹出,但 textinputlayout 不存在,只有 ok 按钮。 android监视器没有错误 @Ashish0294 您使用的是哪个 gradle 版本?

以上是关于无法在我的 android 应用程序中使 proguard 工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ionic 2 中使状态栏颜色可变

如何在android中使我的应用程序设备管理员?

广播接收器在某些设备中使应用程序崩溃

在android google map v2中使标记只能点击一次

在我的 Android 应用程序中,将数字(通过 Twitter 的 Fabric)升级到 2.0.0 版后,数字主题不起作用

如何在运行时在android中使部分文本加粗?