Android 应用仅在发布 APK 时崩溃
Android App crashes only with release APK
我有一个奇怪的问题。我构建了一个在调试模式下运行良好的应用程序(直接调试到我的 phone 并在我的 phone 上安装了调试 APK),但如果我使用发布构建 APK,该应用程序会在某一时刻崩溃。
我发现应用程序在发布 APK 时崩溃,但我不知道为什么以及我能做什么:
protected final String TABLE = "done";
protected final String COL_ID = "_id";
protected final String COL_TASK = "taskid";
protected final String COL_DATE = "donedate";
protected String getLastDoneDate(String id) {
String date = "";
String filter = COL_TASK + " LIKE ?";
String[] filterArgs = new String[] {id};
String sortOrder = COL_DATE + " DESC";
String[] columns = new String[] {COL_DATE};
Cursor c = MyTime.db.query(TABLE, columns, filter, filterArgs, null, null, sortOrder, "1");
if (c.moveToFirst()) {
date = c.getString(c.getColumnIndex(COL_DATE));
}
c.close();
return date;
}
如果我删除行 Cursor c = ...(以及所有根据 c 的内容)它就可以工作。
数据库看起来像这样:
CREATE TABLE IF NOT EXISTS done (
_id INTEGER PRIMARY KEY autoincrement,
taskid INTEGER,
donedate TEXT DEFAULT '');
Gradle 片段:
buildTypes {
release {
shrinkResources false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
shrinkResources false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
我无法通过调试找到问题,因为调试时不会发生崩溃。
有人可以帮我解决这个问题吗?
除了 SQLite,你可以检查 proguard-rules.pro 文件,它可能会导致 release.apk 崩溃。如果你想瘦更多,点击https://developer.android.com/studio/build/shrink-code.html
我在 gradle 文件中添加了 debuggable = true 并找到了问题的原因。
buildTypes {
release {
shrinkResources false
debuggable true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
shrinkResources false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Table "done" 未创建,因为我试图将两个 table 创建语句放入单个 db.execSQL()
仅当您在 build.gradle 文件的发布部分添加以下行时才会出现此问题:
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
Use this instead of above:
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
gradle 文件的示例如下所示,它解决了我的问题:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
希望对您有所帮助!快乐编码...
我在 https://medium.com/@aanshul16/android-app-crashes-in-release-mode-but-working-perfectly-in-debug-c051cc83a019 中也发现并提到了类似的问题
因此,您可以首先通过在调试模式中启用 "minifyEnable" 来检查是否问题在调试模式下重现,那么肯定是因为混淆器。
我遇到了同样的问题,我通过将 minifyEnabled 和 shrinkResources 都设置为 false 解决了这个问题
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
我有一个奇怪的问题。我构建了一个在调试模式下运行良好的应用程序(直接调试到我的 phone 并在我的 phone 上安装了调试 APK),但如果我使用发布构建 APK,该应用程序会在某一时刻崩溃。 我发现应用程序在发布 APK 时崩溃,但我不知道为什么以及我能做什么:
protected final String TABLE = "done";
protected final String COL_ID = "_id";
protected final String COL_TASK = "taskid";
protected final String COL_DATE = "donedate";
protected String getLastDoneDate(String id) {
String date = "";
String filter = COL_TASK + " LIKE ?";
String[] filterArgs = new String[] {id};
String sortOrder = COL_DATE + " DESC";
String[] columns = new String[] {COL_DATE};
Cursor c = MyTime.db.query(TABLE, columns, filter, filterArgs, null, null, sortOrder, "1");
if (c.moveToFirst()) {
date = c.getString(c.getColumnIndex(COL_DATE));
}
c.close();
return date;
}
如果我删除行 Cursor c = ...(以及所有根据 c 的内容)它就可以工作。
数据库看起来像这样:
CREATE TABLE IF NOT EXISTS done (
_id INTEGER PRIMARY KEY autoincrement,
taskid INTEGER,
donedate TEXT DEFAULT '');
Gradle 片段:
buildTypes {
release {
shrinkResources false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
shrinkResources false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
我无法通过调试找到问题,因为调试时不会发生崩溃。
有人可以帮我解决这个问题吗?
除了 SQLite,你可以检查 proguard-rules.pro 文件,它可能会导致 release.apk 崩溃。如果你想瘦更多,点击https://developer.android.com/studio/build/shrink-code.html
我在 gradle 文件中添加了 debuggable = true 并找到了问题的原因。
buildTypes {
release {
shrinkResources false
debuggable true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
shrinkResources false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Table "done" 未创建,因为我试图将两个 table 创建语句放入单个 db.execSQL()
仅当您在 build.gradle 文件的发布部分添加以下行时才会出现此问题:
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
Use this instead of above:
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
gradle 文件的示例如下所示,它解决了我的问题:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
希望对您有所帮助!快乐编码...
我在 https://medium.com/@aanshul16/android-app-crashes-in-release-mode-but-working-perfectly-in-debug-c051cc83a019 中也发现并提到了类似的问题 因此,您可以首先通过在调试模式中启用 "minifyEnable" 来检查是否问题在调试模式下重现,那么肯定是因为混淆器。
我遇到了同样的问题,我通过将 minifyEnabled 和 shrinkResources 都设置为 false 解决了这个问题
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}