基础Kotlin SSH应用调用SSH功能即崩溃求助
解决SSH调用时应用崩溃的问题
我刚入门做Android SSH工具的时候也碰到过一模一样的崩溃问题——只要碰SSH相关代码就直接崩,连调试日志都打不出来,换设备换电脑都没用,当时头都大了!结合我的踩坑经验,给你几个关键排查方向:
1. 先把崩溃日志捞出来——这是破局关键!
你说调试提示从未显示,大概率是崩溃发生在日志输出之前,或者没正确捕获异常。先想办法拿到崩溃栈:
- 打开Android Studio的Logcat,过滤
AndroidRuntime标签,崩溃时这里会输出完整的调用栈,直接告诉你哪行代码出了问题。 - 如果Logcat里看不到,就在所有SSH相关代码外面套一层
try-catch(Exception e),强制打印错误信息:
try { // 你的SSH连接/命令执行代码 } catch (Exception e) { e.printStackTrace(); // 直接打印完整栈信息 Log.e("SSH_CRASH", "崩溃详情:", e); // 也可以用Log工具输出 }
2. 绝对不能在主线程做SSH操作!
Android从API 11开始就禁止主线程执行网络IO,SSH连接属于典型的网络操作,直接在主线程调用会触发NetworkOnMainThreadException,直接崩给你看。
- 解决方法:把SSH代码放到子线程里,比如用Kotlin协程(推荐):
lifecycleScope.launch(Dispatchers.IO) { try { // 这里写JSch的连接和ls命令执行代码 } catch (e: Exception) { withContext(Dispatchers.Main) { Log.e("SSH", "出错了:${e.message}", e) } } }
- 要是用Java,就用
AsyncTask或者直接新建线程:
new Thread(new Runnable() { @Override public void run() { try { // JSch代码放在这里 } catch (Exception e) { e.printStackTrace(); } } }).start();
3. 检查JSch的依赖和基础配置
先确保你正确引入了JSch依赖,在build.gradle里加:
// Gradle Groovy写法 implementation 'com.jcraft:jsch:0.1.55' // Kotlin DSL写法 implementation("com.jcraft:jsch:0.1.55")
然后先跑一段最小化的JSch示例代码(放到子线程里),排除业务代码的干扰:
JSch jsch = new JSch(); Session session = jsch.getSession("你的用户名", "服务器IP", 22); session.setPassword("你的密码"); // 开发阶段可以跳过主机密钥验证(正式环境千万别这么干!) session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 执行ls命令 ChannelExec channel = (ChannelExec) session.openChannel("exec"); channel.setCommand("ls"); channel.setInputStream(null); channel.setErrStream(System.err); InputStream in = channel.getInputStream(); channel.connect(); // 读取输出 byte[] tmp = new byte[1024]; while (!channel.isClosed()) { while (in.available() > 0) { int len = in.read(tmp); if (len < 0) break; System.out.print(new String(tmp, 0, len)); } Thread.sleep(1000); } channel.disconnect(); session.disconnect();
这段代码如果能正常运行,说明JSch本身没问题,问题出在你的业务逻辑里。
4. 检查权限和网络连通性
- 确认
AndroidManifest.xml里加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 测试虚拟机和SSH服务器的网络是否连通:在虚拟机里用
adb shell ping 服务器IP,看能不能ping通;如果是模拟器,访问本地SSH服务要改用10.0.2.2代替本地IP。
先按这几步排查,基本能定位到崩溃原因——我当初就是踩了主线程的坑,把代码移到子线程就立刻好了!
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

