【问题标题】:App crashing once in the Google Play Store, but never on Android Studio应用程序在 Google Play 商店中崩溃过一次,但从未在 Android Studio 中崩溃过
【发布时间】:2016-07-11 16:37:50
【问题描述】:

早上好。

我的应用在 Google Play 商店发布后崩溃,然后从它安装。如果我从 Android Studio 安装我的应用程序,它根本不会崩溃。

当我尝试打开从使用 RushORM 制作的本地数据库中获取信息的布局时,应用程序似乎崩溃了。

这是 ANR 在 GP 控制台上报告的内容:

ANR 输入调度超时(等待发送非键事件,因为触摸窗口尚未完成对 500.0 毫秒前交付给它的某些输入事件的处理。等待队列长度:35。等待队列头年龄:5507.1 毫秒.)

这就是崩溃在 GP 控制台上报告的内容:

a.a.a.b.b.c: This is most likely caused by a change in data structure or new RushObject.
This issue should be resolved by a database migration.
This can be done by updating db version number in the manifest or setting Rush in debug mode.
To set Rush in debug mode add this to your manifest file - <meta-data android:name="Rush_debug" android:value="true" />
    at a.a.a.a.j.b(Unknown Source)
    at a.a.a.b.n.a(Unknown Source)
    at a.a.a.b.n.a(Unknown Source)
    at a.a.a.b.al.b(Unknown Source)
    at com.avena.avenafit.dashboard.g.L(Unknown Source)
    at com.avena.avenafit.dashboard.g.a(Unknown Source)
    at com.avena.avenafit.dashboard.ad.a(Unknown Source)
    at b.a.a.a.c.a(Unknown Source)
    at com.avena.avenafit.dashboard.ad.a(Unknown Source)
    at android.support.v4.app.af.a(Unknown Source)
    at android.support.v4.app.af.a(Unknown Source)
    at android.support.v4.app.j.run(Unknown Source)
    at android.support.v4.app.af.e(Unknown Source)
    at android.support.v4.app.af.b(Unknown Source)
    at android.support.v4.app.ap.b(Unknown Source)
    at android.support.v4.view.ViewPager.a(Unknown Source)
    at android.support.v4.view.ViewPager.c(Unknown Source)
    at android.support.v4.view.ViewPager.onMeasure(Unknown Source)
    at android.view.View.measure(View.java:18794)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.support.design.widget.CoordinatorLayout.a(Unknown Source)
    at android.support.design.widget.CoordinatorLayout.onMeasure(Unknown Source)
    at android.view.View.measure(View.java:18794)
    at android.support.v4.widget.DrawerLayout.onMeasure(Unknown Source)
    at android.view.View.measure(View.java:18794)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    at android.support.v7.widget.ContentFrameLayout.onMeasure(Unknown Source)
    at android.view.View.measure(View.java:18794)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
    at android.view.View.measure(View.java:18794)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    at android.view.View.measure(View.java:18794)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
    at android.view.View.measure(View.java:18794)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)
    at android.view.View.measure(View.java:18794)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
    at android.view.Choreographer.doCallbacks(Choreographer.java:670)
    at android.view.Choreographer.doFrame(Choreographer.java:606)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我已经尝试在我的清单文件中更改我的数据库版本:

<!-- Updating this will cause a database upgrade -->
<meta-data
    android:name="Rush_db_version"
    android:value="2" />

现在,如果我从 GPStore 安装了该应用程序,并且我打开了 Android Studio,我会看到注册了很多奇怪的错误。在所有这些中,这一个引起了我的注意:

07-11 11:17:08.037 17067-17067/com.avena.avenafit E/SQLiteLog: (1) no such column: type_of_check

type_of_check 如果我的数据库结构之一上的字段(正如我所提到的,使用 RushORM 制作)。作为参考,这是我的课程:

package com.avena.avenafit.dbb;

import co.uk.rushorm.core.RushObject;

public class UserCheck extends RushObject {

private String type_of_check;
private String check_date;
private String hour_checked;

/* Classes must include an empty constructor */
public UserCheck() {}

    public String getType_of_check() {
      return type_of_check;
    }
    public void setType_of_check(String type_of_check) {
      this.type_of_check = type_of_check;
    }

    public String getCheck_date() {
      return check_date;
    }
    public void setCheck_date(String check_date) {
      this.check_date = check_date;
    }

    public String getHour_checked() {
      return hour_checked;
    }
    public void setHour_checked(String hour_checked) {
      this.hour_checked = hour_checked;
    }

}

这是我设置 type_of_check 的示例:

breakfast.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {

                String time =
                        new SimpleDateFormat("HH:mm", Locale.getDefault()).format(date);

                sendCheck("check_breakfast");
                breakfast.setColorFilter(color_green);

                UserCheck check1 = new UserCheck();
                check1.setType_of_check("1");
                check1.setCheck_date(currentDate);
                check1.setHour_checked(time.toString());
                check1.save();

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    });

有人看到我在这里缺少什么吗?

【问题讨论】:

  • 您的实际迁移代码在哪里,似乎在您的表中添加了一列?
  • 你在用proguard吗?
  • rushorm.com/#Proguard 如果您使用的是 Proguard。看起来您正在根据该错误日志进行缩小
  • 您是否缩小了您的发行版 apk?如果是,请尝试缩小调试版本并在手机上运行它以查看正确的日志
  • @mastrgamr 它不起作用。这条线说-keep public class * implements co.uk.rushorm.core.Rush { *; },但我没有使用工具,而是扩展。听起来很傻,但我会尝试切换这些词。

标签: android google-play google-console-developer rushorm


【解决方案1】:

RushOrm 只需要这一行即可与 ProGuard 一起使用。

 -keep public class * implements co.uk.rushorm.core.Rush { *; }

之所以实现 Rush,是因为你扩展的 RushObject 实现了 Rush 本身。

类可以通过直接实现 Rush 而不是扩展 RushObject 来与 RushOrm 一起使用,这就是为什么这是与 ProGuard 一起使用它的最佳方式

谢谢

【讨论】:

  • 非常感谢您帮我解决这个问题。并感谢一个很好的解释。如果我可以建议的话,这个解释在官方文档上会很好。
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多