全部產品
Search
文件中心

Cloud Phone:iOS SDK

更新時間:Jun 23, 2026

本文介紹如何使用無影雲手機的iOS SDK。

1. 快速開始

1.1 擷取SDK和DEMO

說明

本平台所有文檔、SDK、用戶端程式僅限於本人或本企業使用,未經阿里雲同意不會轉寄給第三方個人或企業。

Integration Environment要求

最低支援iOS版本:10.0

由於iOS系統相關介面的開放,外設滑鼠和鍵盤功能,要求iOS最低版本:13.4

SDK整合

  1. 將SDK解壓拷貝到自己的工程中。

  2. 關聯 SDK庫。

    target --> Build Phases --> Link Binary With Libraries --> + --> Add Other -- Add Files -->選擇對應的framework

  3. 設定Embed。

    target --> General --> Frameworks, Libraries, and Embedded Content --> 找到ASPEngineSDK.framework --> Embed Without Signing

SDK許可權

工程info.plist配置ASPEngineSDK需要的許可權。

1. 錄音許可權

Privacy - Microphone Usage Description

2. 相機許可權

Privacy - Camera Usage Description

SDK簽名

SDK庫是動態庫,真機調試或發布App Store時,需要簽名。

  • 如何擷取簽名ID

通過以下命令,尋找自己本機安裝認證的簽名ID:

security find-identity -v -p codesigning

若沒有本機安裝認證,可以登入Apple開發人員帳號,下載對應認證的授權檔案Profiles,下載後,選中檔案右鍵,右鍵菜單選擇顯示簡介,在預覽處會顯示此授權檔案關聯的所有認證資訊,找到對應認證的資訊,裡面SHA-1對應的值就是我們需要簽名ID。

  • Signing & Capabilities簽名

在工程target裡正確配置Signing & Capabilities裡的認證即可。

  • 添加簽名Shell(模擬器不需要,真機需要)

target --> Build Phases --> + --> New Run Script Phase --> 填寫sh內容,參考下面簽名Shell樣本。

注意:此Run Script必現在Embed Frameworks下面。

  • 簽名Shell樣本

set -e
SHELL_PATH="${PROJECT_DIR}/ASPDemo/Lib/ASPEngineSDK/ASPEngineSDK.framework/link_and_sign.sh"
KEY_ID="你認證的簽名ID"
echo "===> Signing using $KEY_ID"
/bin/bash -c "${SHELL_PATH}"\ "${TARGET_BUILD_DIR}"\ "${FRAMEWORKS_FOLDER_PATH}"\ "${KEY_ID}"

工程配置注意事項

關閉Bitcode。

target --> Build Settings --> Build Options --> Enable Bitcode --> 設定No

1.2 對接流程

1.3 最佳實務

方案詳見無影雲手機快速整合最佳實務。 雲手機整合的總體方案如下圖所示

有多種登入方式,擷取整合SDK所需要的串連雲手機Ticket憑證,流程圖為:

具體整合代碼可以參考生命週期介面的參考代碼。

2. 生命週期介面

2.1 初始化執行個體

+ (instancetype)buildStreamView;

2.2 建立串連

- (void)startWithTicket:(ASPConnTicket*) ticketParam;

ASPConnTicket參數說明:

屬性

說明

connTicket

串連鑒權Ticket。

caFilePath

CA檔案的絕對路徑,用於TLS通訊加密

desktopId

請傳入應用執行個體ID(格式:ai-0cc7s3n1iagyq****)。應用執行個體ID可通過調用雲手機的查詢執行個體詳細資料介面擷取。

useVpc

是否通過企業專網進入

enableTls

是否進行加密傳輸(建議設為YES)

enableStatistics

是否開啟埋點(建議設為YES)

preferRtcTransport

是否使用rtc通道(建議設為YES)

2.3 中斷連線

- (int)stop;

2.4 暫停

暫停雲端下發流和端側流渲染

- (void)pause;

2.5 恢複

恢複雲端下發流和端側流渲染

- (void)resume;

2.6 銷毀執行個體

- (void)dispose;

2.7 回調說明

//雲手機串連相關回調
@property (nonatomic, weak) id<ASPEngineDelegate> engineDelegate;
//解析度發生變化回調
@property (nonatomic, weak) id<ASPEngineResolutionUpdateDelegate> resolutionUpdateDelegate;
//滑鼠游標相關回調
@property (nonatomic, weak) id<ASPEngineCursorDelegate> cursorDelegate;
//雲手機方向發生變化回調
@property (nonatomic, weak) id<ASPEngineOrientationUpdateDelegate> orientationUpdateDelegate;
//埋點相關回調
@property (nonatomic, weak) id<ASPEngineStatisticsDelegate> statisticsDelegate;
//IME相關回調 雲手機暫不支援
@property (nonatomic, weak) id<ASPEngineIMEDelegate> imeDelegate;
//LOG相關回調,delegate建議使用單例
+ (void)setASPEngineLogDelegate:(id<ASPEngineLogDelegate>)delegate;
+ (void)unsetASPEngineLogDelegate;

雲手機串連相關回調ASPEngineDelegate

介面

描述

onConnectionSuccess:(int)connectId

串連雲手機成功回調,返回串連的標識

onConnectionFailureWithErrCode:(int)errCode errMsg:(NSString*)errMsg

串連雲手機失敗回調,返回錯誤碼和錯誤資訊

onEngineErrorWithErrCode:(int)errCode errMsg:(NSString*)errMsg

SDK內部發生異常回調,返回錯誤碼和錯誤資訊

onDisconnected:(int)reason

雲手機串連被斷開,返回被斷開原因

onFirstFrameRendered:(long)timeCostMS

雲手機顯示第一幀畫面回調,返回耗時情況

onReconnect:(int)errorCode

雲手機串連發生重連動作,返回導致重連的錯誤碼

onPolicyUpdate:(NSString *)policy

雲手機策略回調,返回策略配置

onUpdateNetworkQos:(AspNetworkQoS)qos

網路服務品質情況

onSessionSuccess

雲手機串連會話建立成功回調

解析度發生變化回調ASPEngineResolutionUpdateDelegate

介面

描述

onResolutionUpdateWithOldWidth:(int)oldWidth oldHeight:(int)oldHeight width:(int)width height:(int)height

解析度發生變化回調,返回舊解析度和新解析度

onMonitorsDpiConfig:(int)dpi maxSupportDpi:(int)maxSupportDpi

dpi配置和支援的最大dpi,雲手機暫不支援

滑鼠游標相關回調ASPEngineCursorDelegate

介面

描述

onCursorBitmapUpdateWithHotX:(int)hotX hotY:(int)hotY

width:(int)width height:(int)height rgba:(char*)rgba

滑鼠游標資料回調,返回位置、大小和資料

onCursorReset

滑鼠游標發生重設

onCursorHide

滑鼠游標被隱藏

onCursorMoveWithX:(int)x y:(int)y

滑鼠游標移動位置

埋點相關回調ASPEngineStatisticsDelegate

介面

描述

onStatisticsInfoUpdate:(ASPStatisticsInfo *)info

雲手機效能資料回調,返回效能資料對象

LOG相關回調,ASPEngineLogDelegate建議使用單例

介面

描述

onLogMessage:(NSString*)msg

tag:(NSString*)tag

level:(AspLogLevel)level

SDK日誌回調,返回日誌資訊、tag和層級

3. 業務介面

介面

說明

- (BOOL)enableStatistics:(BOOL) enabled enableGuestInfo:(BOOL)enableGuestInfo

是否開啟埋點和擷取鏡像cpu使用率。

- (BOOL)enableMouseMode:(BOOL)enabled

是否開啟滑鼠模式

@property (nonatomic, assign) BOOL enableDump;

是否開啟dump,此功能會消耗效能,只用於開發調試,禁止上線。

- (BOOL)sendKeyboardEvent: (ASPKeyEvent) event;

發送鍵盤按鍵事件。

// leftButton是滑鼠左鍵還是右鍵,滑鼠點擊位置 x:0 y:0

- (BOOL)simulateMouseClick:(BOOL)leftButton;

- (BOOL)simulateMouseClick:(BOOL)leftButton x:(float)x y:(float)y;

類比滑鼠點擊。

- (void)hideCursor;

- (void)showCursor;

隱藏和現實滑鼠游標

- (void)setVideoProfileWithWidth:(int)width height:(int)height fps:(int)fps;

設定解析度。fps暫不支援

@property (nonatomic, assign) BOOL mute;

設定是否靜音。

@property (nonatomic, assign) ASPScaleType scaleType;

畫面填充模式,ASPScaleType參考本文檔枚舉5.1 ASPScaleType

- (void)enableDesktopMode:(BOOL)enabled;

設定是否以桌面圖案運行,設定為enabled後,會將所有Touch訊息轉換為Mouse事件向服務端發送。雲手機建議設定為NO。

- (void)enableDesktopGesture:(BOOL)enabled;

是否使用端側手勢縮放和平移。雲手機建議設定為NO。

@property (nonatomic, assign) BOOL enableTouchFeel;

是否開啟觸感反饋,預設NO。

LyncChannel

發送adb命令通道。實現參考demo的DemoLyncChannel。

DataChannel

端側與鏡像接發自訂資料通道。實現參考demo的DemoEDSAgentChannel。

LyncChannel使用樣本:
//預設命令通道LyncChannel name為static NSString *LYNC_CHANNEL_NAME = @"lync_adb_shell";
//添加LyncChannelself.lync = [[DemoLyncChannel alloc] initWithParameter:LYNC_CHANNEL_NAME];
[self.streamView addLyncChannel:self.lync];
//移除LyncChannel
[self.streamView removeLyncChannel:self.lync];
//LyncChannel實現@interface DemoLyncChannel : BaseLyncChannel@property (nonatomic, strong) NSString *lslaID;

@end@implementation DemoLyncChannel

- (void)onConnectStateChanged:(BOOL)connected {
    NSLog(@"[DemoLyncChannel] onConnectStateChanged %d", connected);
    if (connected) {
        //TEST send cmdself.lslaID = [DemoToolBox getID];
        NSString *cmdData = [DemoToolBox getJsonDataWithId:self.lslaID cmd:@"ls -la"];
        NSLog(@"[DemoLyncChannel] cmdData : %@", cmdData);
        LyncErrorCode code = [self sendString:cmdData];
        NSLog(@"[DemoLyncChannel] cmdData code: %ld", code);
    }
}
- (void)onReceiveStringData:(NSString * _Nonnull)buf {
    NSLog(@"[DemoLyncChannel] onReceiveStringData %@", buf);
    NSDictionary *dic = [DemoToolBox convertStringToJSON:buf];
    NSString *ID = [dic objectForKey:@"id"];
    if (ID != NULL && ID.length && [self.lslaID isEqualToString:ID]) {
        NSLog(@"[DemoLyncChannel] onReceiveStringData get ls -la result");
    }
}
- (void)onReceiveRawData:(NSData * _Nonnull)buf {
    NSString *string = [[NSString alloc] initWithData:buf encoding:NSUTF8StringEncoding];
    NSLog(@"[DemoLyncChannel] onReceiveRawData %@", string);
}
@end
DataChannel使用樣本:
//預設DataChannel name為static NSString *DATA_CHANNEL_NAME = @"wy_vdagent_default_dc";
//添加DataChannelself.esdAgent = [[DemoEDSAgentChannel alloc] initWithParameter:DATA_CHANNEL_NAME];
[self.streamView addDataChannel:self.esdAgent];
//移除DataChannel
[self.streamView removeDataChannel:self.esdAgent];
//DataChannel實現@interface DemoEDSAgentChannel : BaseEDSAgentChannel@end@implementation DemoEDSAgentChannel

- (void)onConnectStateChanged:(ASPDCConnectState)state {
    NSLog(@"[DemoEDSAgentChannel] onConnectStateChanged %ld", state);
    if (state == OPEN) {
        // to send data
    }
}
- (void)onReceiveData:(NSData * _Nonnull)buf {
    NSString *string = [[NSString alloc] initWithData:buf encoding:NSUTF8StringEncoding];
    NSLog(@"[DemoEDSAgentChannel] onConnectStateChanged %@", string);
}
@end

訊息通道使用datachannel,datachannel名稱為wy_vdagent_default_dc。

訊息大小限制500KB。

基體訊息格式如下:

DataChannel 端側發送訊息給鏡像 client --> guest

action:insertcontact/insertsms/sendcontactcvf

  • insertcontact是插入連絡人

參數name是連絡人名稱,必填。

參數phonenumber是電話號碼,必填。

  • insertsms是插入簡訊

參數phonenumber是電話號碼, 必填。

參數textbody是簡訊內容,必填。

參數canInsertdb是否可以插入雲手機簡訊資料庫,選填,預設0, 不插入, 1為插入。

樣本:let jsonarray = [{'action': 'insertcontact','importdata':[{ 'name': '**', 'phonenumber': '**' }, { 'name': '**', 'phonenumber': '**' }]},{'action': 'insertsms','importdata':[{'phonenumber':'**','textbody':'**,"canInsertdb":0/1}]}]

  • sendcontactvcf是通過vcf插入連絡人

參數data是vcf檔案資料流,必填,若檔案過大,需拆包,一個包最大1MB。

參數allsize是vcf檔案資料總大小,必填。

說明

參數timestamp是時間戳記,必填,一個vcf檔案資料下的所有包對應一個目前時間戳,通過時間戳記保證包來源於一個vcf檔案。

樣本:{'action': 'sendcontactvcf',importdata:{data:"", "allsize":檔案資料總大小, "timestamp":時間戳記}}

public void processByteArrayInChunks(byte[] data) {
    int chunkSize = 512 * 1024; // 500KB in bytesint length = data.length;
    long timestamp = System.currentTimeMillis();
    for (int i = 0; i < length; i += chunkSize) {
        int end = Math.min(i + chunkSize, length);
        byte[] chunk = Arrays.copyOfRange(data, i, end);
        String str = new String(chunk, StandardCharsets.UTF_8);
        /**
          {'action': 'sendcontactvcf','importdata':{"data":str, "allsize":length, "timestamp":timestamp}}
        */
    }
}
String recvData = "";
int recvSize = 0;
long recvTimestamp = 0;
public void onMessageReceive(byte[] message) {
  String action = getActioin(meesage);
  String data = getData(message);
  int length = data.length;
  int allSize = getAllSize(message);
  long timestamp = getTimestamp(message);
  if (timestamp != recvTimestamp) {
    clearRecv();
  }
  if (action.equals("sendcontactvcf")) {
    recvSize += length;
    recvData = recvData + data;
    if (recvSize >= allSize) {
      // recvData 寫vcf檔案 插入連絡人
      insertContact(vcfFilePath);
      sendack()
      clearRecv();
    }
  }
}

public void clearRecv() {
  recvData = ""
  recvSize = 0;
  recvTimestamp = 0;
}

DataChannel 鏡像發送訊息給端側 guest --> client

action:openeditsms/openphone/rotation

  • openeditsms開啟編輯簡訊頁面

參數importdata.phonenumber是電話號碼,選填。

參數textbody是簡訊內容,選填。

樣本:{'action': 'openeditsms',importdata:{"phonenumber":"***", "textbody":"***"}} 

  • openphone開啟電話撥號頁面

參數importdata.phonenumber是電話號碼,選填,有電話號,則開啟撥打指定連絡人頁面,沒有電話號碼,則開啟電話撥號頁面。

樣本:{'action': 'openphone','importdata':{"phonenumber":"***"}} 或 {'action': 'openphone'}

DataChannel 回執訊息

action:ack

  • ack是指不管是端側發送訊息給鏡像,還是鏡像發送訊息給端側,收到訊息側,根據業務需要,可回執ack訊息,表明訊息處理的情況

參數source是接收到訊息的action,必填。

參數code是狀態代碼,必填值為0表示未知,1 執行source,2 執行成功,3 執行失敗, 4 不支援執行。

樣本:{'action': 'ack','importdata':{"source":"***", "code": *,"id":*}}

4. 參數詳細說明

4.1 ASPConnTicket

建立串連的配置參數。

屬性

說明

connTicket

串連鑒權Ticket。

caFilePath

CA檔案的絕對路徑,用於TLS通訊加密

desktopId

請傳入應用執行個體ID(格式:ai-0cc7s3n1iagyq****)。應用執行個體ID可通過調用雲手機的查詢執行個體詳細資料介面擷取。

useVpc

是否通過企業專網進入

enableTls

是否進行加密傳輸(建議設為YES)

enableStatistics

是否開啟埋點(建議設為YES)

preferRtcTransport

是否使用rtc通道(建議設為YES)

4.2 ASPStatisticsInfo

效能資料

介面

類型

說明

mReceiveFps

int

接收到的幀率

mRenderFps

int

渲染幀率

mDownstreamBandwithMBPerSecond

double

下行頻寬

mUpstreamBandwithMBPerSecond

double

上行頻寬

mP2pFullLinkageLatencyMS

long

端到端全鏈路時延,已廢棄

mNetworkLatencyMS

long

網路rtt時延

mPingGatewayRtt

long

ping rtt時延

mLostRate

double

丟包率

mServerRenderLatencyMS

long

雲側渲染延遲

mServerEncoderLatencyMS

long

雲側編碼延遲

mServerTotalLatencyMS

long

雲側總延遲

accumulateBandwidth

long

總頻寬

mGuestCpuUsage

long

鏡像CPU使用率

mStreamType

String

流協議類型

infoDic

NSDictionary

效能資料Map

5. 枚舉類型

5.1 ASPScaleType

流化映像內容縮放處理類型。

名稱

含義

ASPScaleTypeFill

總是將流化映像展開至與StreamView相同大小。當StreamView的長寬比例與流化映像長寬比例不相等時。採用該策略可能導致映像有明顯的變形 

ASPScaleTypeFit

對StreamView的渲染地區進行調整,使得StreamView總是能以相同的長寬比例渲染流化映像內容。採用該策略時,流化映像可能無法填滿整個StreamView

6. 錯誤碼

錯誤碼

錯誤訊息(%s表示雲手機或雲應用)

定義模組

原因

2~26主要是網路相關問題

2

串連%s失敗

ASP SDK

無效MAGIC

3

串連%s失敗

ASP SDK

資料有誤

4

用戶端與服務端版本不匹配

ASP SDK

版本不匹配

5

串連需要 TLS

ASP SDK

需要TLS

6

串連不需要 TLS

ASP SDK

不需要TLS而實際使用了TLS

7

您沒有許可權串連當前%s

ASP SDK

許可權問題

8

ASP SDK

遷移過程中client ID無效

9

串連%s失敗

ASP SDK

channel不存在

20

串連ASP伺服器失敗。

ASP SDK

channel 串連錯誤

21

TLS認證出錯了

ASP SDK

TLS 認證錯誤

22

串連%s失敗

ASP SDK

channel link 錯誤

23

串連%s失敗

ASP SDK

串連認證錯誤

24

串連%s失敗

ASP SDK

串連IO錯誤

25

串連%s失敗

ASP SDK

Ticket校正失敗。使用者串連被斷開後,若使用同一個Ticket再次請求建連,也將觸發此錯誤。

26

ASP SDK

xquic 握手失敗

1206

一個ticket 可以重複使用,但是每次只能串連一個。如果雲手機處於串連中,再建立串連就會報此錯。

ASP SDK

1207

執行個體發生重啟,導致Ticket失效了

ASP SDK

sdk流協同錯誤碼

1000

token empty 

ASP SDK

只會出現在流協同的時候,client與server進行二次校正失敗

1001

user empty 

ASP SDK

1200

token invalid 

ASP SDK

1201

vm invalid 

ASP SDK

1202

ADMIN internal error 

ASP SDK

1203

user invalid 

ASP SDK

1204

token experied 

ASP SDK

1500

server internal error 

ASP SDK

1501

server net work error 

ASP SDK

串連中斷開或遇到某些錯誤的情況

2000

擷取%s資料逾時,與服務端中斷連線

ASP SDK

正常斷開

2001

%s已與服務端中斷連線。可能是因為%s進程已被強制終止。

ASP SDK

一般是端上應用被終止進程了,如Android應用使用者通過按下Home鍵終止

2002

已有使用者從其他終端串連當前%s。請稍後重試。

ASP SDK

其他人搶佔了端

2003

%s正在關機或重啟,一般由管理員操作,請稍後重試。

ASP SDK

雲手機被關機或重啟,一般是管理員操作

2004

目前使用者串連被斷開。

ASP SDK

用戶端發起斷流,或服務端發起踢人或斷流

2005

%s已逾時中斷連線,因為已達到管理員設定的使用時間長度限制。

ASP SDK

管理員設定使用時間長度被關

2006

管理員已回收了你使用該雲手機的許可權,即將登出並斷開雲手機的串連。

ASP SDK

管理員取消了使用者授權

2010

串連%s失敗

ASP SDK

Vdagent串連失敗

2011

串連參數傳遞錯誤。

ASP SDK

串連server參數傳遞錯誤

2027

拉流模式已切換。

ASP SDK

拉流模式由搶佔模式切換為協同模式,或由協同模式切換為搶佔模式

2100

剪下板許可權,禁止從%s到本地

ASP SDK

剪貼簿許可權,禁止從VM到本地

2101

剪下板許可權,禁止從本地到%s

ASP SDK

剪貼簿許可權,禁止從本地到 VM

2200

%s正在嘗試重連...

ASP SDK

因為網路問題斷開了,ASP SDK正在重連

2201

您的裝置出現網路異常,導致%s已中斷連線。

ASP SDK

因為網路問題斷開了,ASP SDK因為鏡像原因不支援重連,應用側開始重連

2202

%s重連逾時,請檢查裝置網路後重試。

ASP SDK

ASP SDK重連逾時

2210

終端裝置休眠時斷開了本網,導致雲手機中斷連線

ASP SDK

2212

檢測到您的本網出現異常,導致雲手機中斷連線。

ASP SDK

2220

檢測到您的本網出現異常,導致雲手機中斷連線。

ASP SDK

2240

由於Ticket中的Token失效,導致重連失敗。

2300

應用側傳參出現異常導致串連失敗。

2501

用戶端串連流網關異常,網路不可達。

2502

用戶端串連流網關異常,TCP串連流網關IP逾時, connect *3次 (共15s)。

2503

用戶端串連流網關異常,未知網路錯誤。

2504

用戶端串連流網關異常,軟體原因串連中斷。

2505

用戶端串連流網關異常,串連被拒絕。

2506

Ticket失效,網關解析token失敗。

2507

Ticket失效,到期。

2508

Ticket失效,uuid不匹配。

2509

流網關探測asp-server 失敗

2510

探測server被拒絕:
解決:server 5912未開啟監聽

2511

探測server失敗,timeout和refuse 之外的其他錯誤

2512

流網關token校正失敗

管控token中帶的vpcId和流網關本身所在的vpcId 不一致

2513

用戶端和網關sayhello 過程中tcp收到異常reset

2520

用戶端串連失敗,自主診斷出來是網路異常導致的

2521

用戶端再和流網關tls握手階段重連3次三次都異常斷開

2522

vpn環境下串連出錯

2523

用戶端正在使用國密協議串連。請確認服務端設定或選擇相容的串連方式。

2701

端側網路問題,建議對比手機5g熱點試試能否串連上。

2702

用戶端到流網關SSL握手逾時

2703

用戶端到流網關SayHello逾時

2704

ASP Server回複建鏈訊息逾時

可能原因: asp-server卡死;網路異常;鏡像卡死;mem/cpu high

2705

Asp Client 等待第一幀逾時

可能原因: asp-server卡死;截屏或者gpu驅動異常沒有幀產生;網路異常;mem/cpu high

2706

檢測到用戶端本地的CPU、記憶體使用量率過高可能會導致串連失敗。

2707

AspServer 從Guest擷取第一幀截屏資料逾時

2708

sdk線程卡住導致串連失敗

端側邏輯錯誤

5100

%s串連ASP Server逾時,請稍後重試。

應用側

端側在一段時間內未接收到connected事件

5102

擷取%s資料逾時,請稍後重試。

應用側

端側在一段時間內接收到了connected但未接收到display事件

5004

用戶端出現錯誤,請重新開啟

應用側

傳入端側啟動參數有誤,一般出現在開發階段

5200

用戶端重連逾時,請稍後重試。

應用側

7. 常見問題

如何重啟雲手機

調用管控重啟API 重啟執行個體 進行重啟,調用重啟API後,端側串連的雲手機會斷開,重啟完成後,端側再串連雲手機。

常用ADB命令

功能

命令

返回鍵

input keyevent KEYCODE_BACK

Home鍵

input keyevent KEYCODE_HOME

切換鍵

input keyevent KEYCODE_APP_SWITCH

靜音

input keyevent 164

音量增大

input keyevent KEYCODE_VOLUME_UP

音量減小

input keyevent KEYCODE_VOLUME_DOWN

隱藏導覽列

setprop persist.wy.hasnavibar false; killall com.android.systemui

顯示導覽列

setprop persist.wy.hasnavibar true; killall com.android.systemui

截圖

screencap -p /sdcard/Download/abc.png