当前位置:   article > 正文

Mac ADB环境搭建+Android adb forward转发TCP端口连接数试验_夜神模拟器adb端口转发

夜神模拟器adb端口转发

前言

下载好SDK,如果下载的有Android studio就是用他的SDK。

TCP端口转发:需要Android studio 和AVD(我的avd不好用太卡,用的是夜神模拟器)

一、Mac adb环境配置

打开终端执行:vim ~/.bsah_profile   //(新机器可能没有此文件,可以创建一个 touch ~/.bsah_profile )

然后在文件里加入下面语句:

  1. export PATH=${PATH}:/Volumes/amusement/softwares/android-sdk-macosx/platform-tools
  2. export PATH=${PATH}:/Volumes/amusement/softwares/android-sdk-macosx/tools

其中export PATH=${PATH}:/Volumes/amusement/softwares/android-sdk-macosx/platform-tools的/Volumes/amusement/softwares/android-sdk-macosx是自己的sdk路径,可根据自己的修改

保存退出之后执行sources ~/.bash_profile激活

验证:adb version

  1. Android Debug Bridge version 1.0.40
  2. Version 28.0.2-5303910
  3. Installed as /Volumes/amusement/softwares/android-sdk-macosx/platform-tools/adb

连接手机(手机需要处于开发者模式并且处于允许调试):adb shell

会自动搜索在线设备并进入,若果没有调试的手机,可以使用模拟器(夜神模拟器的连接接口是固定有序的:第一个是端口62001,第二个是62025,第三个是620025+1,以此类推)

命令:adb connect 127.0.0.1:62001

更多adb使用命令:传送门

二、Android adb forward转发TCP端口连接数试验

Android adb的一个命令 : adb forward,该命令转发PC电脑上的端口数据到Android设备的一个端口。

adb forward tcp:18000 tcp:19000

上面的命令,即把PC电脑端TCP端口18000的数据转发到与电脑通过adb连接的Android设备的TCP端口19000上。换言之,假设现在PC端在端口18000绑定,并在该端口读写数据,将会被转发到Android设备端的19000。

写一个例子,假设现在PC端作为客户端,用Java普通Socket写一个客户端绑定端口18000,并在这个端口写入和读取数据,然后Android作为服务器端绑定端口19000,等待客户端连接。服务器端与客户端建立连接后,两者进行数据的IO。

客户端(PC):

  1. import java.io.DataInputStream;
  2. import java.io.DataOutputStream;
  3. import java.net.Socket;
  4. import java.util.concurrent.CompletableFuture;
  5. import java.util.concurrent.ScheduledFuture;
  6. import java.util.concurrent.ScheduledThreadPoolExecutor;
  7. import java.util.concurrent.TimeUnit;
  8. import java.util.logging.Logger;
  9. public class SocketTest {
  10. private ScheduledThreadPoolExecutor mScheduledThreadPoolExecutor = null;
  11. private Runnable mRunnable = null;
  12. private ScheduledFuture<?> mScheduledFuture = null;
  13. private Socket mSocket = null;
  14. private Logger mLogger = Logger.getLogger(SocketTest.class.getName());
  15. private void session() {
  16. DataInputStream dis = null;
  17. DataOutputStream dos = null;
  18. try {
  19. dis = new DataInputStream(mSocket.getInputStream());
  20. dos = new DataOutputStream(mSocket.getOutputStream());
  21. while (true) {
  22. String data = "PC时间:" + System.currentTimeMillis();
  23. dos.writeUTF(data);
  24. dos.flush();
  25. String s = dis.readUTF();
  26. mLogger.info("收到数据:" + s);
  27. Thread.sleep(5000);
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. } finally {
  32. try {
  33. mSocket.close();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. mSocket = null;
  38. }
  39. }
  40. public SocketTest() {
  41. mScheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
  42. mRunnable = new Runnable() {
  43. @Override
  44. public void run() {
  45. if (mSocket == null || !mSocket.isConnected()) {
  46. mLogger.info("尝试建立连接...");
  47. try {
  48. mSocket = new Socket("localhost", 18000);
  49. mLogger.info("建立新连接:" + mSocket.toString());
  50. CompletableFuture.runAsync(new Runnable() {
  51. @Override
  52. public void run() {
  53. session();
  54. }
  55. });
  56. } catch (Exception e) {
  57. mLogger.info("连接异常");
  58. }
  59. } else {
  60. mLogger.info("连接心跳检测:当前已经建立连接,无需重连");
  61. }
  62. }
  63. };
  64. // 每隔3秒周期性的执行心跳检测动作。
  65. mScheduledFuture = mScheduledThreadPoolExecutor.scheduleAtFixedRate(mRunnable, 0, 3, TimeUnit.SECONDS);
  66. }
  67. public static void main(String[] args) {
  68. new SocketTest();
  69. }
  70. }

安卓端(服务器端):

  1. package com.example.yrl.web;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import java.io.DataInputStream;
  6. import java.io.DataOutputStream;
  7. import java.io.IOException;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;
  10. public class MainActivity extends AppCompatActivity {
  11. private String TAG = "Android端";
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. new ServerThread().start();
  16. }
  17. private class ServerThread extends Thread {
  18. @Override
  19. public void run() {
  20. ServerSocket serverSocket = null;
  21. try {
  22. serverSocket = new ServerSocket(19000);
  23. while (true) {
  24. Socket socket = serverSocket.accept();
  25. Log.d(TAG, "接受连接");
  26. new ClientThread(socket).start();
  27. }
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. } finally {
  31. if (serverSocket != null) {
  32. try {
  33. serverSocket.close();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. }
  40. }
  41. private class ClientThread extends Thread {
  42. private Socket socket;
  43. public ClientThread(Socket socket) {
  44. this.socket = socket;
  45. Log.d(TAG, "当前Socket:" + socket.toString());
  46. }
  47. @Override
  48. public void run() {
  49. try {
  50. DataInputStream dis = new DataInputStream(socket.getInputStream());
  51. DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
  52. while (true) {
  53. String data = dis.readUTF();
  54. Log.d(TAG, "收到数据:" + data);
  55. //回写给客户端。
  56. String s = "手机时间:" + System.currentTimeMillis();
  57. dos.writeUTF(s);
  58. dos.flush();
  59. }
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. } finally {
  63. try {
  64. socket.close();
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. }
  70. }
  71. }

有了此代码,线启动服务器端

执行:adb forward tcp:18000 tcp:19000,然后启动Android studio边的代码,再启动PC端

可看到:服务器端(android):

客户端(PC):

过程中遇到的麻烦:

1.studio连接模拟器:在启动app时,显示在线设备,但是连不上,提示:minsdk(API 22) >deviceSDK(API 19),根据意思可知是app最小的sdk版本大于设备版本,只需要将app工程下的build gradle 文件,修改android:minSdkVersion="19"或更小,然后点击在右上侧的蓝色同步按钮,重新生成,即可解决问题

2.做这个也算另一种方法解决了困扰我很长时间的AVD打不开,一直在开机界面,提示“Emulator: emulator: ERROR: detected a hanging thread 'QEMU2 CPU0 thread'. No response for 15013 ms。”  一直没解决,索性不使用他,用模拟器代替。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/224475
推荐阅读
相关标签
  

闽ICP备14008679号