You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基础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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:23:40