Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Missing proguard rule leads to crash #172

Open
kierse opened this issue Jan 18, 2023 · 1 comment
Open

Missing proguard rule leads to crash #172

kierse opened this issue Jan 18, 2023 · 1 comment

Comments

@kierse
Copy link
Contributor

kierse commented Jan 18, 2023

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

@LeoColman
Copy link

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

LeoColman added a commit to LeoColman/Petals that referenced this issue Apr 23, 2023
Related: requery/sqlite-android#172
Related: requery/sqlite-android#178
Related: cashapp/sqldelight#3589
Related: #266
Signed-off-by: Leonardo Colman Lopes <dev@leonardo.colman.com.br>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants