首页 > 解决方案 > Firebase Android:创建原子字段更新程序失败,java.lang.IllegalArgumentException:必须是整数类型

问题描述

我的 Android 应用在调试模式下运行良好,但在发布模式下崩溃。当我尝试使用 Firebase Auth.App 登录时会出现问题,如果我在发布版本中设置 debuggable : true 可以正常工作。日志 cat 提供 Atomic 字段更新相关的错误。是因为 proguard 正在删除一些课程吗?我在下面提供了代码和 Logcat:

if (task.getException() instanceof FirebaseAuthUserCollisionException) {
    Toast.makeText(SignUpActivity.this, "You are already registered", Toast.LENGTH_SHORT).show();
    mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            progressBar.setVisibility(View.GONE);
            if (task.isSuccessful()) {
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                String uid = user.getUid();
                sharedPref = getApplicationContext().getSharedPreferences(uid, Context.MODE_PRIVATE);
                sharedPref.edit().clear().commit();

                DocumentReference docRef = db.collection("PB_USERS").document(uid);
                docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            SharedPreferences.Editor editor = sharedPref.edit();
                            DocumentSnapshot document = task.getResult();
                            if (document.exists()) {
                                CurrentUser currentUser = document.toObject(CurrentUser.class);
                                ArrayList<String> purchases = currentUser.getPurchases();
                                for (String purchasedTrade : purchases) {
                                    editor.putBoolean(purchasedTrade, false);
                                }
                                editor.apply();


                                Intent intent = new Intent(SignUpActivity.this, MainActivity.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                    startActivity(intent);
                                    finish();

                            }

错误:

08-21 17:58:10.571 26027-26054/? E/bfy: Creating atomic field updaters failed
    java.lang.IllegalArgumentException: Must be integer type
        at java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl.<init>(AtomicIntegerFieldUpdater.java:278)
        at java.util.concurrent.atomic.AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdater.java:52)
        at bfy.<clinit>(Unknown Source)
        at bfl.a(Unknown Source)
        at bfl.a(Unknown Source)
        at awp.<init>(Unknown Source)
        at arw.a(Unknown Source)
        at ary.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at axh$a.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:818)
08-21 17:58:10.631 26027-26054/? E/bfx: Creating atomic field updaters failed
    java.lang.ClassCastException
        at java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>(AtomicReferenceFieldUpdater.java:208)
        at java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdater.java:70)
        at bfx$a.<clinit>(Unknown Source)
        at bfx.a(Unknown Source)
        at bfx$c.a(Unknown Source)
        at bdt$a.a(Unknown Source)
        at bho.a(Unknown Source)
        at bgw.a(Unknown Source)
        at axs.a(Unknown Source)
        at awm.a(Unknown Source)
        at awy.f(Unknown Source)
        at awy.a(Unknown Source)
        at arl.a(Unknown Source)
        at art.a(Unknown Source)
        at arw.c(Unknown Source)
        at asa.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at axh$a.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:818)
08-21 17:58:10.639 26027-26054/? E/bil: FieldUpdaterAtomicHelper failed
    java.lang.IllegalArgumentException: Must be integer type
        at java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl.<init>(AtomicIntegerFieldUpdater.java:278)
        at java.util.concurrent.atomic.AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdater.java:52)
        at bil.a(Unknown Source)
        at bil.<clinit>(Unknown Source)
        at bgb.<init>(Unknown Source)
        at bho$f.a(Unknown Source)
        at bim.a(Unknown Source)
        at bdt$a.a(Unknown Source)
        at bfy$e.a(Unknown Source)
        at bdt$a.a(Unknown Source)
        at bfx$c.a(Unknown Source)
        at bdt$a.a(Unknown Source)
        at bho.a(Unknown Source)
        at bgw.a(Unknown Source)
        at axs.a(Unknown Source)
        at awm.a(Unknown Source)
        at awy.f(Unknown Source)
        at awy.a(Unknown Source)
        at arl.a(Unknown Source)
        at art.a(Unknown Source)
        at arw.c(Unknown Source)
        at asa.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at axh$a.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:818)

我是 Android 和 Java 的初学者。这是应用程序 build.gradle 部分:

 compileSdkVersion 27
    defaultConfig {
        applicationId "in.permabull.permabull"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }

标签: androidfirebase

解决方案


根据我的观察,我认为模型类(CurrentUser)的名称声明在使用 proguard 规则后发生了变化,因此添加一条语句以从 proguard 中排除 Currentuser.class 将解决该问题。将以下语句添加到项目文件夹中的 progurad-rules.pro 文件中

-keep class in.permabull.permabull.CurrentUser { *; }

注意:如果 CurrentUser 类驻留在路径 java/in/permabull/permabull/CurrentUser 中,则根据其他更改。干杯:)


推荐阅读