sqlite-android icon indicating copy to clipboard operation
sqlite-android copied to clipboard

Missing proguard rule leads to crash

Open kierse opened this issue 2 years ago • 1 comments

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

kierse avatar Jan 18 '23 00:01 kierse

@npurushe This issue should be closed as completed in #173

LeoColman avatar Apr 23 '23 00:04 LeoColman