C# 基於 adb 控制安卓


我司呢,有深信服網關。

我們做項目,日常是比較“清閑”的,所以呢,深信服讓你沒有辦法愉快的使用電腦,

但是手機是可以連外網和外面的 wifi 的,所以我們就玩手機,但是玩手機這么明顯會被 Leader 打死的。

所以,硬核一點,用電腦玩自己的手機。

 

adb.exe 就不介紹了,自行百度。一言以蔽之就是 PC 用來調試安卓手機的。

http://adbshell.com/downloads 下載地址。

 

adb 的命令大家也自行百度,或者看文檔,有很多博文資料。

我們的目的簡單來說就兩點,一是可以看到手機屏幕,二是可以操作。

下面給出關鍵的代碼。

 

首先加載時

用 adb 命令連接設備

這里還不知道多個設備會怎么樣,因為我只有一個(哭

            var result = CMDHelper.Execute("adb shell getprop ro.product.model");
            StatusInfo($"檢查設備:{result}");

            if (result.Contains("no devices") || string.IsNullOrWhiteSpace(result))
            {
                RadioButtonStop.Enabled = true;
                StatusInfo("未檢測到設備");
            }
            else
            {
                RadioButtonStop.Enabled = false;
                BackgroundWorker = new BackgroundWorker();
                BackgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
                BackgroundWorker.RunWorkerAsync();
            }

連接設備成功之后,開后台工作線程,委托方法執行。

BackgroundWorker BackgroundWorker = null;

方法:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //循環截屏獲取圖片
            while (true)
            {
                if (RadioButtonStop.Enabled)
                { return; }

                StatusInfo("獲取屏幕");

                var tempFileName = "001.png";
                CMDHelper.Execute("adb shell screencap -p /sdcard/" + tempFileName);
                CMDHelper.Execute("adb pull /sdcard/" + tempFileName);

                if (System.IO.File.Exists(tempFileName))
                {
                    using (var temp = Image.FromFile(tempFileName))
                    {
                        PictureBox.Invoke(new Action(() => { PictureBox.Image = new Bitmap(temp); }));
                    }
                    GC.Collect();
                    if (System.IO.File.Exists(tempFileName))
                    {
                        try
                        {
                            System.IO.File.Delete(tempFileName);
                        }
                        catch
                        {
                        }
                    }
                    Thread.Sleep(1000);
                }
            }
        }

第一句 adb 命令是手機截圖存儲在自身sdcard目錄下。

第二句是將這個文件拉取到 adb 的所在文件夾。

然后GC強制清一下內存,然后線程等待1秒。

避免刷新過於頻繁,實際上使用的時候會發現卡頓明顯,方法基本上是3s運行一次,這中間跨機器的操作,截圖,IO,慢一點也是正常。

假如要玩肝肝肝的游戲,實時的畫面就不是那么重要。

優化的思路的話,平常可以是不刷新或者很久才刷新,然后在操作過后等待1-2s的動畫再進行刷新,或者把安卓的動畫直接關掉,這樣就不會感覺到卡頓。

 

然后是點擊的處理:

        private void PictureBox_MouseClick(object sender, MouseEventArgs e)
        {
            if (PictureBox.Image == null)
            { return; }

            if (e.Button != System.Windows.Forms.MouseButtons.Left)
            { return; }
            

            //計算實際坐標
            var tapx = 3 * e.X;
            var tapy = 3 * e.Y;

            StatusInfo(string.Format("點擊屏幕 {0} {1}", tapx.ToString("0"), tapy.ToString("0")));

            var result = CMDHelper.Execute(string.Format("adb shell input tap {0} {1}", tapx.ToString("0"), tapy.ToString("0")));//點擊坐標
            StatusInfo(result);
        }

點擊的處理寫在 PictureBox 的點擊事件里,

這里主要講一下坐標,比如我的小米5s  像素是1920*1080。

截取獲得的圖片也是這個像素,那么在pc顯示器上按照這個像素顯示是不ok的,

這里按一個倍數縮小就行了,我是省事寫死了。我的 PictureBox  高寬是 640*360 sizeModel 調整成 StretchImage 即可,這樣圖片按比例縮放不會變形。

然后計算實際的坐標時也只需要乘回縮小的倍數就可以了。 

 

這些就是最基本的代碼了。

基於 adb 我們可以做出很多很有用的東西,比如肝肝肝的游戲做腳本,像微信跳一跳的這種輔助也可以實現。

只不過工作量也少不了(手動狗頭 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM