sqlite-android
sqlite-android copied to clipboard
Missing proguard rule leads to crash
I'm seeing the following when running an Android application that has been obfuscated using proguard:
----- class 'Lio/requery/android/database/sqlite/SQLiteConnection;' cl=0x14b003d8 -----
objectSize=396 (224 from super)
access=0x8000.0011
super='java.lang.Class<java.lang.Object>' (cl=0x0)
interfaces (1):
0: java.lang.Class<androidx.core.os.CancellationSignal$OnCancelListener> (cl=0x14b003d8)
vtable (22 entries, 11 in super):
0: void io.requery.android.database.sqlite.SQLiteConnection.close()
1: void io.requery.android.database.sqlite.SQLiteConnection.collectDbStats(java.util.ArrayList)
2: void io.requery.android.database.sqlite.SQLiteConnection.collectDbStatsUnsafe(java.util.ArrayList)
3: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.describeCurrentOperationUnsafe()
4: void io.requery.android.database.sqlite.SQLiteConnection.dump(android.util.Printer, boolean)
5: void io.requery.android.database.sqlite.SQLiteConnection.dumpUnsafe(android.util.Printer, boolean)
6: void io.requery.android.database.sqlite.SQLiteConnection.enableLocalizedCollators()
7: void io.requery.android.database.sqlite.SQLiteConnection.execute(java.lang.String, java.lang.Object[], androidx.core.os.CancellationSignal)
8: android.os.ParcelFileDescriptor io.requery.android.database.sqlite.SQLiteConnection.executeForBlobFileDescriptor(java.lang.String, java.lang.Object[], androidx.core.os.CancellationSignal)
9: int io.requery.android.database.sqlite.SQLiteConnection.executeForChangedRowCount(java.lang.String, java.lang.Object[], androidx.core.os.CancellationSignal)
10: int io.requery.android.database.sqlite.SQLiteConnection.executeForCursorWindow(java.lang.String, java.lang.Object[], io.requery.android.database.CursorWindow, int, int, boolean, androidx.core.os.CancellationSignal)
11: long io.requery.android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(java.lang.String, java.lang.Object[], androidx.core.os.CancellationSignal)
12: long io.requery.android.database.sqlite.SQLiteConnection.executeForLong(java.lang.String, java.lang.Object[], androidx.core.os.CancellationSignal)
13: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.executeForString(java.lang.String, java.lang.Object[], androidx.core.os.CancellationSignal)
14: void io.requery.android.database.sqlite.SQLiteConnection.finalize()
15: boolean io.requery.android.database.sqlite.SQLiteConnection.isPreparedStatementInCache(java.lang.String)
16: boolean io.requery.android.database.sqlite.SQLiteConnection.isPrimaryConnection()
17: void io.requery.android.database.sqlite.SQLiteConnection.onCancel()
18: void io.requery.android.database.sqlite.SQLiteConnection.prepare(java.lang.String, io.requery.android.database.sqlite.SQLiteStatementInfo)
19: void io.requery.android.database.sqlite.SQLiteConnection.reconfigure(io.requery.android.database.sqlite.SQLiteDatabaseConfiguration)
20: void io.requery.android.database.sqlite.SQLiteConnection.setOnlyAllowReadOnlyOperations(boolean)
21: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.toString()
direct methods (60 entries):
0: void io.requery.android.database.sqlite.SQLiteConnection.<clinit>()
1: void io.requery.android.database.sqlite.SQLiteConnection.<init>(io.requery.android.database.sqlite.SQLiteConnectionPool, io.requery.android.database.sqlite.SQLiteDatabaseConfiguration, int, boolean)
2: void io.requery.android.database.sqlite.SQLiteConnection.access$200(io.requery.android.database.sqlite.SQLiteConnection, io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement)
3: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.access$300(java.lang.String)
4: byte[] io.requery.android.database.sqlite.SQLiteConnection.access$500()
5: io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement io.requery.android.database.sqlite.SQLiteConnection.acquirePreparedStatement(java.lang.String)
6: void io.requery.android.database.sqlite.SQLiteConnection.applyBlockGuardPolicy(io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement)
7: void io.requery.android.database.sqlite.SQLiteConnection.attachCancellationSignal(androidx.core.os.CancellationSignal)
8: void io.requery.android.database.sqlite.SQLiteConnection.bindArguments(io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement, java.lang.Object[])
9: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.canonicalizeSyncMode(java.lang.String)
10: void io.requery.android.database.sqlite.SQLiteConnection.detachCancellationSignal(androidx.core.os.CancellationSignal)
11: void io.requery.android.database.sqlite.SQLiteConnection.dispose(boolean)
12: void io.requery.android.database.sqlite.SQLiteConnection.finalizePreparedStatement(io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement)
13: io.requery.android.database.sqlite.SQLiteDebug$DbStats io.requery.android.database.sqlite.SQLiteConnection.getMainDbStatsUnsafe(int, long, long)
14: int io.requery.android.database.sqlite.SQLiteConnection.getTypeOfObject(java.lang.Object)
15: boolean io.requery.android.database.sqlite.SQLiteConnection.hasCodec()
16: boolean io.requery.android.database.sqlite.SQLiteConnection.isCacheable(int)
17: void io.requery.android.database.sqlite.SQLiteConnection.nativeBindBlob(long, long, int, byte[])
18: void io.requery.android.database.sqlite.SQLiteConnection.nativeBindDouble(long, long, int, double)
19: void io.requery.android.database.sqlite.SQLiteConnection.nativeBindLong(long, long, int, long)
20: void io.requery.android.database.sqlite.SQLiteConnection.nativeBindNull(long, long, int)
21: void io.requery.android.database.sqlite.SQLiteConnection.nativeBindString(long, long, int, java.lang.String)
22: void io.requery.android.database.sqlite.SQLiteConnection.nativeCancel(long)
23: void io.requery.android.database.sqlite.SQLiteConnection.nativeClose(long)
24: void io.requery.android.database.sqlite.SQLiteConnection.nativeExecute(long, long)
25: int io.requery.android.database.sqlite.SQLiteConnection.nativeExecuteForBlobFileDescriptor(long, long)
26: int io.requery.android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(long, long)
27: long io.requery.android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(long, long, long, int, int, boolean)
28: long io.requery.android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(long, long)
29: long io.requery.android.database.sqlite.SQLiteConnection.nativeExecuteForLong(long, long)
30: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.nativeExecuteForString(long, long)
31: void io.requery.android.database.sqlite.SQLiteConnection.nativeFinalizeStatement(long, long)
32: int io.requery.android.database.sqlite.SQLiteConnection.nativeGetColumnCount(long, long)
33: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.nativeGetColumnName(long, long, int)
34: int io.requery.android.database.sqlite.SQLiteConnection.nativeGetDbLookaside(long)
35: int io.requery.android.database.sqlite.SQLiteConnection.nativeGetParameterCount(long, long)
36: boolean io.requery.android.database.sqlite.SQLiteConnection.nativeHasCodec()
37: boolean io.requery.android.database.sqlite.SQLiteConnection.nativeIsReadOnly(long, long)
38: long io.requery.android.database.sqlite.SQLiteConnection.nativeOpen(java.lang.String, int, java.lang.String, boolean, boolean)
39: long io.requery.android.database.sqlite.SQLiteConnection.nativePrepareStatement(long, java.lang.String)
40: void io.requery.android.database.sqlite.SQLiteConnection.nativeRegisterCustomFunction(long, io.requery.android.database.sqlite.SQLiteCustomFunction)
41: void io.requery.android.database.sqlite.SQLiteConnection.nativeRegisterFunction(long, io.requery.android.database.sqlite.SQLiteFunction)
42: void io.requery.android.database.sqlite.SQLiteConnection.nativeRegisterLocalizedCollators(long, java.lang.String)
43: void io.requery.android.database.sqlite.SQLiteConnection.nativeResetCancel(long, boolean)
44: void io.requery.android.database.sqlite.SQLiteConnection.nativeResetStatementAndClearBindings(long, long)
45: io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement io.requery.android.database.sqlite.SQLiteConnection.obtainPreparedStatement(java.lang.String, long, int, int, boolean)
46: io.requery.android.database.sqlite.SQLiteConnection io.requery.android.database.sqlite.SQLiteConnection.open(io.requery.android.database.sqlite.SQLiteConnectionPool, io.requery.android.database.sqlite.SQLiteDatabaseConfiguration, int, boolean)
47: void io.requery.android.database.sqlite.SQLiteConnection.open()
48: void io.requery.android.database.sqlite.SQLiteConnection.recyclePreparedStatement(io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement)
49: void io.requery.android.database.sqlite.SQLiteConnection.releasePreparedStatement(io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement)
50: void io.requery.android.database.sqlite.SQLiteConnection.setAutoCheckpointInterval()
51: void io.requery.android.database.sqlite.SQLiteConnection.setForeignKeyModeFromConfiguration()
52: void io.requery.android.database.sqlite.SQLiteConnection.setJournalMode(java.lang.String)
53: void io.requery.android.database.sqlite.SQLiteConnection.setJournalSizeLimit()
54: void io.requery.android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration()
55: void io.requery.android.database.sqlite.SQLiteConnection.setPageSize()
56: void io.requery.android.database.sqlite.SQLiteConnection.setSyncMode(java.lang.String)
57: void io.requery.android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration()
58: void io.requery.android.database.sqlite.SQLiteConnection.throwIfStatementForbidden(io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement)
59: java.lang.String io.requery.android.database.sqlite.SQLiteConnection.trimSqlForDisplay(java.lang.String)
static fields (3 entries):
0: byte[] io.requery.android.database.sqlite.SQLiteConnection.EMPTY_BYTE_ARRAY
1: java.lang.String[] io.requery.android.database.sqlite.SQLiteConnection.EMPTY_STRING_ARRAY
2: java.util.regex.Pattern io.requery.android.database.sqlite.SQLiteConnection.TRIM_SQL_PATTERN
instance fields (12 entries):
0: int io.requery.android.database.sqlite.SQLiteConnection.mCancellationSignalAttachCount
1: io.requery.android.database.sqlite.CloseGuard io.requery.android.database.sqlite.SQLiteConnection.mCloseGuard
2: io.requery.android.database.sqlite.SQLiteDatabaseConfiguration io.requery.android.database.sqlite.SQLiteConnection.mConfiguration
3: int io.requery.android.database.sqlite.SQLiteConnection.mConnectionId
4: long io.requery.android.database.sqlite.SQLiteConnection.mConnectionPtr
5: boolean io.requery.android.database.sqlite.SQLiteConnection.mIsPrimaryConnection
6: boolean io.requery.android.database.sqlite.SQLiteConnection.mIsReadOnlyConnection
7: boolean io.requery.android.database.sqlite.SQLiteConnection.mOnlyAllowReadOnlyOperations
8: io.requery.android.database.sqlite.SQLiteConnectionPool io.requery.android.database.sqlite.SQLiteConnection.mPool
9: io.requery.android.database.sqlite.SQLiteConnection$PreparedStatementCache io.requery.android.database.sqlite.SQLiteConnection.mPreparedStatementCache
10: io.requery.android.database.sqlite.SQLiteConnection$PreparedStatement io.requery.android.database.sqlite.SQLiteConnection.mPreparedStatementPool
11: io.requery.android.database.sqlite.SQLiteConnection$OperationLog io.requery.android.database.sqlite.SQLiteConnection.mRecentOperations
Failed to register native method io.requery.android.database.sqlite.SQLiteConnection.nativeLoadExtension(JLjava/lang/String;Ljava/lang/String;)V in base.apk!classes2.dex
jni_internal.cc:825] JNI FatalError called: RegisterNatives failed for 'io/requery/android/database/sqlite/SQLiteConnection'; aborting...
Looks like there needs to be a proguard rule for SQLiteConnection. PR incoming
@npurushe This issue should be closed as completed in #173