遇到JSR/RET与computeFrames不兼容错误,疑因mysql-connector-java版本问题
解决“JSR/RET are not supported with computeFrames”错误及代码优化建议
你的判断完全正确——这个错误确实是由mysql-connector-java-3.0.17-ga-bin这个老旧驱动版本导致的,下面给你详细的原因分析和解决方案:
错误根源
mysql-connector-java 3.0.17是2006年发布的超老版本,它的字节码中使用了JSR/RET指令。而Android的D8/R8编译器在启用computeFrames选项(默认开启,用于生成调试所需的栈帧信息)时,不支持这种过时的字节码指令,因此抛出了这个错误。
解决方案
1. 升级MySQL驱动(推荐)
直接替换为兼容Android的新版驱动,比如mysql-connector-java 8.0.x系列,或者更轻量的MariaDB Connector/J(与MySQL完全兼容)。
修改你的依赖配置:
// 替换旧依赖为新版MySQL驱动 implementation 'mysql:mysql-connector-java:8.0.33' // 或者用更轻量的MariaDB驱动(兼容MySQL) // implementation 'org.mariadb.jdbc:mariadb-java-client:3.2.0'
注意:新版MySQL驱动的Driver类路径已变更为
com.mysql.cj.jdbc.Driver,你需要修改代码中的Class.forName参数;新版驱动也支持自动注册,甚至可以省略Class.forName这一步。
2. 临时绕过方案(不推荐)
如果暂时无法升级驱动,可以尝试在build.gradle中关闭computeFrames选项,但这会削弱调试体验,且老驱动存在大量安全漏洞和兼容性问题,不建议长期使用:
android { compileOptions { javaCompileOptions { annotationProcessorOptions { arguments = [ "android.enableComputeFrames": "false" ] } } } }
你的代码额外优化建议
除了驱动问题,你的数据库操作代码还有两个关键问题需要修复:
- SQL注入风险:直接将用户输入的
text拼接到SQL语句中,极易被攻击者利用进行SQL注入攻击。改为使用PreparedStatement:
// 替换原有的Statement代码 String query = "INSERT INTO name (test) VALUES (?)"; PreparedStatement pstmt = conn.prepareStatement(query); pstmt.setString(1, text); pstmt.executeUpdate();
- 资源未正确释放:
conn.close()放在try块中,如果发生异常,连接会无法关闭,导致资源泄漏。应该放到finally块中:
Connection conn = null; PreparedStatement pstmt = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, USER, PASS); // ... 数据库操作 } catch (Exception e) { msg = "Connection goes wrong"; e.printStackTrace(); } finally { try { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者D-cent




