【问题标题】:App crashes on a particular layout when minifyEnable is set to true当 minifyEnable 设置为 true 时,应用程序在特定布局上崩溃
【发布时间】:2019-05-16 21:47:25
【问题描述】:

错误信息:

2018-12-16 11:08:28.339 7163-7163/? E/AndroidRuntime: 致命异常: main
进程:,PID:7163
java.lang.NumberFormatException: null
在 java.lang.Long.parseLong(Long.java:406)
在 java.lang.Long.parseLong(Long.java:485)
.view.user.main.a.b.b.a(未知来源)
在 androidx.recyclerview.widget.RecyclerView$a.a(未知来源)
在 androidx.recyclerview.widget.RecyclerView$o.a(未知来源)
在 androidx.recyclerview.widget.RecyclerView$o.a(未知来源)
在 androidx.recyclerview.widget.RecyclerView$o.b(未知来源)
在 androidx.recyclerview.widget.LinearLayoutManager$c.a(Unknown Source)
在 androidx.recyclerview.widget.LinearLayoutManager.a(未知来源)
在 androidx.recyclerview.widget.LinearLayoutManager.a(未知来源)
在 androidx.recyclerview.widget.LinearLayoutManager.c(未知来源)
在 androidx.recyclerview.widget.RecyclerView.D(未知来源)
在 androidx.recyclerview.widget.RecyclerView.y(未知来源)
在 androidx.recyclerview.widget.RecyclerView.onLayout(未知来源)
在 android.view.View.layout(View.java:17666)
在 android.view.ViewGroup.layout(ViewGroup.java:5577)
在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
在 android.widget.FrameLayout.onLayout(FrameLayout.java:261)
在 android.view.View.layout(View.java:17666)
在 android.view.ViewGroup.layout(ViewGroup.java:5577)
在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
在 android.widget.FrameLayout.onLayout(FrameLayout.java:261)
在 android.view.View.layout(View.java:17666)
在 android.view.ViewGroup.layout(ViewGroup.java:5577)
在 androidx.constraintlayout.widget.ConstraintLayout.onLayout(未知 来源)
在 android.view.View.layout(View.java:17666) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.View.layout(View.java:17666) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.View.layout(View.java:17666) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 在 android.view.View.layout(View.java:17666) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 android.view.View.layout(View.java:17666) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1494) 在 android.view.View.layout(View.java:17666) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:261) 在 com.android.internal.policy.DecorView.onLayout(DecorView.java:730) 在 android.view.View.layout(View.java:17666) 在 android.view.ViewGroup.layout(ViewGroup.java:5577) 在 android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2390) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2112) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1298) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6437) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:876) 在 android.view.Choreographer.doCallbacks(Choreographer.java:688) 在 android.view.Choreographer.doFrame(Choreographer.java:623) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:862) 在 android.os.Handler.handleCallback(Handler.java:754)

当我在发布版本中使用 minifyEnabled=true 时出现上述错误。
使用minifyEnabled=false 在发布版本中构建相同的项目不会产生错误。

错误不会在应用启动时出现,而是在显示片段时出现。

proguard-rules.pro:

-assumenosideeffects class android.util.Log {
    public static *** d(...);
}

build.gradle(app)(使用的库):

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

android {
    compileSdkVersion 28

    defaultConfig {
        applicationId "my.package.id"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 3
        versionName "0.3"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true
    }

    buildTypes {
        debug {
            minifyEnabled true
            debuggable true
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }
    }
    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    //  Testing
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    //  Support library
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
    implementation 'com.google.android.material:material:1.1.0-alpha01'
    implementation 'androidx.vectordrawable:vectordrawable:1.0.1'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'

    //  Architecture components
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'

    //  Ads
    implementation 'com.google.android.gms:play-services-ads:17.1.2'

    //  Firebase
    implementation 'com.google.firebase:firebase-core:16.0.6'
    implementation 'com.google.firebase:firebase-firestore:17.1.3'
    implementation 'com.google.firebase:firebase-auth:16.0.5'
    implementation 'com.google.firebase:firebase-invites:16.0.6'
    implementation 'com.google.firebase:firebase-dynamic-links:16.1.5'

    //  FirebaseUI for Firebase Auth
    implementation 'com.firebaseui:firebase-ui-auth:4.2.0'

    //  Circular imageView
    implementation 'com.mikhaellopez:circularimageview:3.2.0'
    implementation 'de.hdodenhof:circleimageview:2.2.0'

    //  About libraries
    implementation 'com.mikepenz:aboutlibraries:6.2.0'
}

编辑 1: 在崩溃的片段中,我有一个使用自定义适配器的 RecyclerView,其中使用了以下代码行:

viewHolder.userOrderRecyclerViewItemDateTv.setText(MyDateUtils.getDateStringFromLong(Long.parseLong(order.getOrderDate())));

MyDateUtils.java:

public class MyDateUtils {

    private static String calenderToDateString(Calendar calendar) {

        //  Convert calender object to date string
        return String.format(Locale.ENGLISH, "%02d - %02d - %04d",
                (calendar.get(Calendar.DAY_OF_MONTH)), (calendar.get(Calendar.MONTH) + 1),
                calendar.get(Calendar.YEAR));
    }

    public static String getDateStringFromLong(long dateLong) {

        //  Create a new calender instance
        Calendar calendar = Calendar.getInstance();

        //  Set calender time to given value
        calendar.setTimeInMillis(dateLong);

        //  Return calender as date in string format
        return calenderToDateString(calendar);
    }
}

【问题讨论】:

  • 你是否为你在 build.graddle 文件中添加的库添加了 proguard 规则
  • 在我看来这不是一个proguard问题。你得到一个数字的空值,这不能是空的。添加更多代码以便更好地调试
  • 正如您提到的,它在片段中显示错误您是否在该片段中显示任何列表?
  • 确实可能有一个类似于Long.parseLong((String) null); 的语句......尽管如此数量的库,可能需要相当多的proguard 规则。
  • 尝试禁用 minify 的发布版本并检查它是否再次发生,还有其他问题。还要添加发生崩溃的类/sn-p

标签: android minify


【解决方案1】:

可以通过对任何构建类型使用 minifyEnabled 选项来启用 ProGuard。如果您打算将其用于生产,强烈建议您在开发(一次)中启用它,然后再进行测试。如果没有在您的开发版本上全面测试 ProGuard,您可能会遇到意外崩溃或应用无法按预期运行的情况。

您似乎没有为您在 build.gradle 文件中使用的库添加规则

https://guides.codepath.com/android/Configuring-ProGuard

【讨论】:

  • 这如何回答这个问题?当然不建议混淆开发(调试)构建......因为那时调试会很痛苦。
  • 该链接解释了他如何为 3rd 方库添加 proguard 规则
  • 你能检查我的 build.gradle 文件并告诉添加的第三方库是否需要任何额外的 proguard 规则,如果需要,在哪里可以找到它们......我以前没有使用过 proguard.. ..
  • @MuhammadYounas 我根据您的建议在调试版本中添加了minifyEnabled=true。即便如此,调试版本也没有错误。我只在签名发布版本中出现错误。有什么想法吗??
  • @Abhi 你能发布完整的 build.gradle 代码吗?
【解决方案2】:
    buildTypes {
      debug {
minifyEnabled true  // shrink
useProguard false   // don't obfuscate

proguardFiles getDefaultProguardFile('proguard- 
android.txt'), 'proguard-rules.pro'
 }

 release {
   minifyEnabled true  // shrink
  useProguard true    // obfuscate

   proguardFiles getDefaultProguardFile('proguard- 
  android.txt'), 'proguard-rules.pro'
 }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多