[adb 命令學習篇] adb 命令總結


 

https://testerhome.com/topics/2565

Android 常用 adb 命令總結

針對移動端 Android 的測試, adb 命令是很重要的一個點,必須將常用的 adb 命令熟記於心, 將會為 Android 測試帶來很大的方便,其中很多命令將會用於自動化測試的腳本當中。

Android Debug Bridge

adb 其實就是 Android Debug Bridge, Android 調試橋的縮寫,adb 是一個 C/S 架構的命令行工具,主要由 3 部分組成:

  • 運行在 PC 端的 Client : 可以通過它對 Android 應用進行安裝、卸載及調試

    Eclipse 中的 ADT、SDK Tools 目錄下的 DDMS、Monitor 等工具,都是同樣地用到了 adb 的功能來與 Android 設備進行交互。

    PC 端的手機助手,諸如 360 手機助手、豌豆莢、應用寶等,其除了安裝第三方應用方便,其他的功能,基本上都可以通過 adb 命令去完成,這里建議測試人員盡量不要在電腦上安裝這類手機助手,因為其自帶的 adb 程序可能會與 Android SDK 下的 adb 程序產生沖突,5037 端口被占用,導致使用 adb 命令時無法連接到設備

  • 運行在 PC 端的 Service : 其管理客戶端到 Android 設備上 adb 后台進程的連接

    adb 服務啟動后,Windows 可以在任務管理器中找到 adb.exe 這個進程

  • 運行在 Android 設備上的 adb 后台進程

    執行 adb shell ps | grep adbd ,可以找到該后台進程,windows 請使用 findstr 替代 grep

    [xuxu:~]$ adb shell ps | grep adbd
    root      23227 1     6672   832   ffffffff 00019bb4 S /sbin/adbd
    

    這里注意一個地方,就是 adb 使用的端口號,5037,有必要記一下

    接下來我將 adb 命令分為三部分進行介紹,adb 命令adb shell 命令linux 命令

adb 命令

在開發或者測試的過程中,我們可以通過 adb 來管理多台設備,其一般的格式為:

adb [-e | -d | -s <設備序列號>] <子命令>

在配好環境變量的前提下,在命令窗口當中輸入 adb help 或者直接輸入 adb ,將會列出所有的選項說明及子命令。

這里介紹一些里面常用的命令:

  • adb devices , 獲取設備列表及設備狀態

    [xuxu:~]$ adb devices
    List of devices attached 
    44c826a0    device  
    
  • adb get-state , 獲取設備的狀態

    [xuxu:~]$ adb get-state  
    device
    

    設備的狀態有 3 鍾,device , offline , unknown

    device:設備正常連接

    offline:連接出現異常,設備無響應

    unknown:沒有連接設備

  • adb kill-server , adb start-server , 結束 adb 服務, 啟動 adb 服務,通常兩個命令一起用

    一般在連接出現異常,使用 adb devices 未正常列出設備, 設備狀態異常時使用 kill-server,然后運行 start-server 進行重啟服務

  • adb logcat , 打印 Android 的系統日志,這個可以單獨拿出來講

  • adb bugreport , 打印dumpsys、dumpstate、logcat的輸出,也是用於分析錯誤

    輸出比較多,建議重定向到一個文件中

    adb bugreport > d:\bugreport.log
    
  • adb install , 安裝應用,覆蓋安裝是使用 -r 選項

    windows 下如果需要安裝含有中文名的 apk ,需要對 adb 進行修改,百度可以找到做出修改的adb , 支持中文命令的 apk,請自行搜索

  • adb uninstall , 卸載應用,后面跟的參數是應用的包名,請區別於 apk 文件名

    '-k' means keep the data and cache directories , -k 選項,卸載時保存數據和緩存目錄

  • adb pull , 將 Android 設備上的文件或者文件夾復制到本地

    例如復制 Sdcard 下的 pull.txt 文件到 D 盤:

    adb pull sdcard/pull.txt d:\
    

    如果需要重命名為 rename.txt:

    adb pull sdcard/pull.txt d:\rename.txt
    

    注意權限,復制系統權限的目錄下的文件,需要 root ,並且一般的 Android 機 root 之后並不能使用命令去復制,而需要在手機上使用類似於 RE 的文件瀏覽器,先對系統的文件系統進行掛載為可讀寫后,才能在手機上復制移動系統文件,這里推薦使用小米手機的開發版本,IUNI 也是不錯滴~~

  • adb push , 推送本地文件至 Android 設備

    例如推送 D 盤下的 push.txt 至 Sdcard:

    adb push d:\push.txt sdcard/
    

    sdcard 后面的斜杠不能少,否則會出現下面的錯誤:

    [xuxu:~]$ adb push push.txt sdcard
    failed to copy 'push.txt' to 'sdcard': Is a directory
    

    權限問題同 pull 命令

  • adb root , adb remount, 只針對類似小米開發版的手機有用,可以直接已這兩個命令獲取 root 權限,並掛載系統文件系統為可讀寫狀態

  • adb reboot , 重啟 Android 設備

    bootloader , 重啟設備,進入 fastboot 模式,同 adb reboot-bootloader 命令

    recovery , 重啟設備,進入 recovery 模式,經常刷機的同學比較熟悉這個模式

  • adb forward , 將 宿主機上的某個端口重定向到設備的某個端口

    adb forward tcp:1314 tcp :8888
    

    執行該命令后所有發往宿主機 1314 端口的消息、數據都會轉發到 Android 設備的 8888 端口上,因此可以通過遠程的方式控制 Android 設備。

  • adb connect 遠程連接 Android 設備

    手機、PC處於相同的網絡下,手機 root ,安裝應用 adbWireless ,啟動應用后點擊界面中間的按鈕: 

     

    image
     

     

    接着運行 adb connect 192.168.1.102 , 即可通過無線的方式連接手機,缺點是速度比較慢

adb shell 命令

有人問過我,為什么會知道這么多的命令,答案就是我比較愛折騰,這里大家先要了解我為什么要區分 adb 命令和 adb shell 命令 。
簡單點講,adb 命令是 adb 這個程序自帶的一些命令,而 adb shell 則是調用的 Android 系統中的命令,這些 Android 特有的命令都放在了 Android 設備的 system/bin 目錄下,例如我再命令行中敲這樣一個命令:

[xuxu:~]$ adb shell hehe
/system/bin/sh: hehe: not found

很明顯,在 bin 目錄下並不存在這個命令。
自己愛折騰,想看看有哪些命令,也不想去找文檔,於是就啟動模擬器,將整個 system/bin 目錄復制了出來,然后一個一個的去試。。囧~~

打開這些文件就可以發現,里面有些命令其實是一個 shell 腳本,例如打開 monkey 文件:

# Script to start "monkey" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/monkey.jar
trap "" HUP
exec app_process $base/bin com.android.commands.monkey.Monkey $*

再比如打開 am:

#!/system/bin/sh # # Script to start "am" on the device, which has a very rudimentary # shell. # base=/system export CLASSPATH=$base/framework/am.jar exec app_process $base/bin com.android.commands.am.Am "$@" 

還有 SDK sources/android-20/com/android/commands 目錄下:

[xuxu:...oid-20/com/android/commands]$ pwd
/Users/xuxu/utils/android/android-sdk-macosx/sources/android-20/com/android/commands
[xuxu:...oid-20/com/android/commands]$ ll   
total 0
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 am
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 bmgr
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 bu
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 content
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 ime
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 input
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 media
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 pm
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 requestsync
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 settings
drwxr-xr-x  7 xuxu  staff   238B  4  2 10:57 svc
drwxr-xr-x  6 xuxu  staff   204B  4  2 10:57 uiautomator
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 wm

有沒有熟悉的命令? am 、pm、uiautomator ...

下面介紹一些常用的 adb shell 命令 (其中pm、am 命令比較龐大,使用四級標題)

pm

Package Manager , 可以用獲取到一些安裝在 Android 設備上得應用信息

pm 的源碼 Pm.java , 直接運行 adb shell pm 可以獲取到該命令的幫助信息

  • pm list package 列出安裝在設備上的應用

    不帶任何選項:列出所有的應用的包名(不知道怎么找應用的包名的同學看這里)

    adb shell pm list package
    

    -s:列出系統應用

    adb shell pm list package -s 
    

    -3:列出第三方應用

    adb shell pm list package -3
    

    -f:列出應用包名及對應的apk名及存放位置

    adb shell pm list package -f
    

    -i:列出應用包名及其安裝來源,結果顯示例子:

    package:com.zhihu.android installer=com.xiaomi.market

    adb shell pm list package -i
    

    命令最后增加 FILTER:過濾關鍵字,可以很方便地查找自己想要的應用

    參數組合使用,例如,查找三方應用中知乎的包名、apk存放位置、安裝來源:

    [xuxu:~]$ adb shell pm list package -f -3 -i zhihu
    package:/data/app/com.zhihu.android-1.apk=com.zhihu.android  installer=com.xiaomi.market
    
  • pm path 列出對應包名的 .apk 位置

    [xuxu:~]$ adb shell pm path com.tencent.mobileqq
    package:/data/app/com.tencent.mobileqq-1.apk
    
  • pm list instrumentation , 列出含有單元測試 case 的應用,后面可跟參數 -f (與 pm list package 中一樣),以及 [TARGET-PACKAGE]

  • pm dump , 后跟包名,列出指定應用的 dump 信息,里面有各種信息,自行查看

    adb shell pm dump com.tencent.mobileqq

    Packages:
    Package [com.tencent.mobileqq] (4397f810):
    userId=10091 gids=[3003, 3002, 3001, 1028, 1015]
    pkg=Package{43851660 com.tencent.mobileqq}
    codePath=/data/app/com.tencent.mobileqq-1.apk
    resourcePath=/data/app/com.tencent.mobileqq-1.apk
    nativeLibraryPath=/data/app-lib/com.tencent.mobileqq-1
    versionCode=242 targetSdk=9
    versionName=5.6.0
    applicationInfo=ApplicationInfo{43842cc8 com.tencent.mobileqq}
    flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]
    dataDir=/data/data/com.tencent.mobileqq
    supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
    usesOptionalLibraries:
    com.google.android.media.effects
    com.motorola.hardware.frontcamera
    timeStamp=2015-05-13 14:04:24
    firstInstallTime=2015-04-03 20:50:07
    lastUpdateTime=2015-05-13 14:05:02
    installerPackageName=com.xiaomi.market
    signatures=PackageSignatures{4397f8d8 [43980488]}
    permissionsFixed=true haveGids=true installStatus=1
    pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]
    User 0:  installed=true blocked=false stopped=false notLaunched=false enabled=0
    grantedPermissions:
    android.permission.CHANGE_WIFI_MULTICAST_STATE
    com.tencent.qav.permission.broadcast
    com.tencent.photos.permission.DATA
    com.tencent.wifisdk.permission.disconnect
    
  • pm install , 安裝應用

    目標 apk 存放於 PC 端,請用 adb install 安裝

    目標 apk 存放於 Android 設備上,請用 pm install 安裝

  • pm uninstall , 卸載應用,同 adb uninstall , 后面跟的參數都是應用的包名

  • pm clear , 清除應用數據

  • pm set-install-location , pm get-install-location , 設置應用安裝位置,獲取應用安裝位置

    [0/auto]:默認為自動

    [1/internal]:默認為安裝在手機內部

    [2/external]:默認安裝在外部存儲

am

又是一個龐大的命令。。。

am 源碼 Am.java

  • am start , 啟動一個 Activity,已啟動系統相機應用為例

    啟動相機

    [xuxu:~]$ adb shell am start -n com.android.camera/.Camera
    Starting: Intent { cmp=com.android.camera/.Camera }
    

    先停止目標應用,再啟動

    [xuxu:~]$ adb shell am start -S com.android.camera/.Camera
    Stopping: com.android.camera
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]     cmp=com.android.camera/.Camera }
    

    等待應用完成啟動

    [xuxu:~]$ adb shell am start -W com.android.camera/.Camera
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.camera/.Camera }
    Status: ok
    Activity: com.android.camera/.Camera
    ThisTime: 500
    TotalTime: 500
    Complete
    

    啟動默認瀏覽器打開一個網頁

    [xuxu:~]$ adb shell am start -a android.intent.action.VIEW -d http://testerhome.com
    Starting: Intent { act=android.intent.action.VIEW dat=http://testerhome.com }
    

    啟動撥號器撥打 10086

    [xuxu:~]$ adb shell am start -a android.intent.action.CALL -d tel:10086            
    Starting: Intent { act=android.intent.action.CALL dat=tel:xxxxx }
    
  • am instrument , 啟動一個 instrumentation , 單元測試或者 Robotium 會用到

  • am monitor , 監控 crash 與 ANR

    [xuxu:~]$ adb shell am monitor
    Monitoring activity manager...  available commands:
    (q)uit: finish monitoring
    ** Activity starting: com.android.camera
    
  • am force-stop , 后跟包名,結束應用

  • am startservice , 啟動一個服務

  • am broadcast , 發送一個廣播

還有很多的選項,自己多多發掘~~

input

這個命令可以向 Android 設備發送按鍵事件,其源碼 Input.java

  • input text , 發送文本內容,不能發送中文

    adb shell input text test123456
    

    前提先將鍵盤設置為英文鍵盤

  • input keyevent , 發送按鍵事件,KeyEvent.java

    adb shell input keyevent KEYCODE_HOME
    

    模擬按下 Home 鍵 ,源碼里面有定義:

    public static final int KEYCODE_HOME = 3;

    因此可以將命令中的 KEYCODE_HOME 替換為 3

  • input tap , 對屏幕發送一個觸摸事件

    adb shell input tap 500 500
    

    點擊屏幕上坐標為 500 500 的位置

  • input swipe , 滑動事件

    adb shell input swipe 900 500 100 500
    

    從右往左滑動屏幕

    如果版本不低於 4.4 , 可以模擬長按事件

    adb shell input swipe 500 500 501 501 2000
    

    其實就是在小的距離內,在較長的持續時間內進行滑動,最后表現出來的結果就是長按動作

到這里會發現,MonkeyRunner 能做到的事情,通過 adb 命令都可以做得到,如果進行封裝,會比 MR 做得更好。

screencap

截圖命令

adb shell screencap -p /sdcard/screen.png

截屏,保存至 sdcard 目錄

screenrecord

4.4 新增的錄制命令

adb shell screenrecord sdcard/record.mp4

執行命令后操作手機,ctrl + c 結束錄制,錄制結果保存至 sdcard

uiautomator

執行 UI automation tests , 獲取當前界面的控件信息

runtest:executes UI automation tests RunTestCommand.java

dump:獲取控件信息,DumpCommand.java

[xuxu:~]$ adb shell uiautomator dump   
UI hierchary dumped to: /storage/emulated/legacy/window_dump.xml

不加 [file] 選項時,默認存放在 sdcard 下

ime

輸入法,Ime.java

[xuxu:~]$ adb shell ime list -s                           
com.google.android.inputmethod.pinyin/.PinyinIME
com.baidu.input_mi/.ImeService

列出設備上的輸入法

[xuxu:~]$ adb shell ime set com.baidu.input_mi/.ImeService
Input method com.baidu.input_mi/.ImeService selected    

選擇輸入法

wm

Wm.java

[xuxu:~]$ adb shell wm size
Physical size: 1080x1920  

獲取設備分辨率

monkey

請參考 Android Monkey 的用法

settings

Settings.java,請參考 探究下 Android4.2 中新增的 settings 命令

dumpsys

請參考 android 中 dumpsys 命令使用

log

這個命令很有意思,可以在 logcat 里面打印你設定的信息,具體用途自己思考!

adb shell log -p d -t xuxu "test adb shell log"

-p:優先級,-t:tag,標簽,后面加上 message

[xuxu:~]$ adb logcat -v time -s xuxu               
--------- beginning of /dev/log/system
--------- beginning of /dev/log/main
05-15 13:57:10.286 D/xuxu    (12646): test adb shell log  

getprop

查看 Android 設備的參數信息,只運行 adb shell getprop,結果以 key : value 鍵值對的形式顯示,如要獲取某個 key 的值:

adb shell getprop ro.build.version.sdk

獲取設備的 sdk 版本

linux 命令

操作你的 Android 設備,常用到的命令,只列出,不詳解!

cat、cd、chmod、cp、date、df、du、grep、kill、ln、ls、lsof、netstat、ping、ps、rm、rmdir、top、touch、重定向符號 ">" ">>"、管道 "|"

有些可能需要使用 busybox ,另外建議 windows 下 安裝一個 Cygwin , 沒用過的請百度百科 Cygwin

END

補充一個引號的用途:
場景1、在 PC 端執行 monkey 命令,將信息保存至 D 盤 monkey.log,會這么寫:

adb shell monkey -p com.android.settings 5000 > d:\monkey.log

場景2、在 PC 端執行 monkey 命令,將信息保存至手機的 Sdcard,可能會這么寫:

adb shell monkey -p com.android.settings 5000 > sdcard/monkey.log

這里肯定會報錯,因為最終是寫向了 PC 端當前目錄的 sdcard 目錄下,而非寫向手機的 Sdcard

這里需要用上引號:

adb shell "monkey -p com.android.settings 5000 > sdcard/monkey.log"

對這些命令都熟悉之后,那么接下來就是綜合對編程語言的應用,思考如何用語言去處理這些命令,使得這些命令更加的方便於測試工作。

所以個人 github 上的幾個工具,核心都是 adb 命令,關鍵的地方在於怎么用自己所學的語言去處理這些命令。

貌似內容有點長。。

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!
共收到 51 條回復
2606

整理的比較系統,學習了

1990
nickli · #2 · 2015年05月17日

本來想自己總結一下的,這下省心了😄。

96
vlizy · #3 · 2015年05月17日

整理的不錯,我之前做過一段時間的android系統平台的測試,當時什么也不懂,我是想做單元測試的,學點shell、C之類的開發,當時實在是理解不了android的精髓,后來辭職了。

1756

剛想找些常用的adb命令~~辛苦

609

Orz膜拜一下

1110
ka612nd · #6 · 2015年05月18日

mark,整理的好多都很實用,膜拜!

96
shu · #7 · 2015年05月19日

很全面,多謝整理分享!

3116

太好了!真的很詳細!

96
tesr · #9 · 2015年05月25日

太好了,學習了

2146

謝樓主,才知道windows要用findstr代替grep

4024

非常不錯的文章,又學會了一個命令 pm clear pm install pm uninstall 希望大家都多共享自己學到的東東

309
xi0w · #12 · 2015年06月12日

Nice,贊!

1505
jennyhui · #13 · 2015年06月14日

好贊!!!!adb好稀飯~~ :plus1: monkey開始下半部分 今天就不看了 有點消化不了了 ~ 謝謝樓主的整理~辛苦了~
//adb forward 端口映射這塊不太懂,有空了解下socket通信~ (http://mandapeng.vip.zhourenjian.com/?tag=adb-forwardhttp://blog.csdn.net/dlutbrucezhang/article/details/8577810))(
//ANR這塊我也不是很了解~知道這個東西,處理上也是小白~馬克了解(http://blog.csdn.net/Zengyangtech/article/details/6025671

4013
cathy · #14 · 2015年06月15日

贊~收藏

96

十分全面,學習了

3010

排版好評。更新一下個人的經歷:“PC 端的手機助手,諸如 360 手機助手、豌豆莢、應用寶等,其除了安裝第三方應用方便,其他的功能,基本上都可以通過 adb 命令去完成,這里建議測試人員盡量不要在電腦上安裝這類手機助手,因為其自帶的 adb 程序可能會與 Android SDK 下的 adb 程序產生沖突,5037 端口被占用,導致使用 adb 命令時無法連接到設備” 引用一下樓主的這段話,因為豌豆莢現在“灰常貼心”地推出了一項功能,他會提醒你,adb占用了5037端口,然后你可以點擊關掉它,然后你發現手機仍然可以被正常連接。對於不熟悉cmd命令行操作的測試人員來說,還是挺方便的。當然,security可能是這類助手軟件的一大問題,畢竟客戶不希望自己的產品早早暴露給第三方市場軟件吧。

2990
betis · #17 · 2015年06月25日

個人感受是adb shell dumpsys對於做單項性能測試的重要性,monkey貌似就是用這個命令寫了個小工具用來收集性能指標的~

666

真正的干貨帖子!

3651
small728 · #19 · 2015年07月28日

贊贊贊,辛苦

3912
ppcwhy · #20 · 2015年07月28日

寫的太好了

3651
small728 · #21 · 2015年08月03日

好像沒有adb shell am kill這個命令。我想問一下app程序退出后台,用這個命令殺掉,然后重啟app。這時候如果app有模塊的增刪操作,重啟后會體現出來嗎?

3374
birkhoff · #22 · 2015年08月17日

不錯,收藏下

4889
mohu · #23 · 2015年08月18日

贊,寫的很系統

5217

贊一下

4879
yy_u · #25 · 2015年10月13日

感謝樓主,很全面,很深入,學習並保存!

3442
maestro · #26 · 2015年10月15日

好東西,謝了

5009
liki · #27 · 2015年10月31日

好帖留名

—— 來自TesterHome官方 安卓客戶端

5869

贊,好帖子,adb 使用可以說是一個Android 平台測試人員基本的能力體現

2654
miao · #29 · 2015年12月29日

好貼!

96
wzllr520 · #30 · 2016年01月13日

贊xuxu大神

1387
solomon · #31 · 2016年02月22日

很受益,謝樓主

96
fire · #32 · 2016年02月24日

受教了

7439
pony · #33 · 2016年02月24日

很好,又整了下,

96
kedyer · #34 · 2016年03月20日

總結的好

8052

漲姿勢了,這個比較全,有部分是以前不知道的,感謝xuxu大神。

7412

謝謝,我要牢牢記住

8517

贊,很全面,辛苦分享

8991

贊啊

96
panpeng · #39 · 2016年05月16日

洞主 我這邊有問題跪求 。。。 我這邊mac 安裝的是dmg 鏡像的appium (appium-doctor和appium & 命令都不能用 )提示:not command .... 這邊這中問題怎么解決 ?

96
panpeng · #40 · 2016年05月16日

網上看到有說 dmg安裝的就不能命令行使用 ,如果我這邊想試用命令行怎么辦 ?

1279
heather · #41 · 2016年07月07日

太贊了,有很多之前不造的,這下造了

1216

100分,不怕你驕傲

9982

贊,大贊,100分的贊

4373
duang · #44 · 2016年09月09日

總結的good 膜拜..

1216

又看了一遍 。。大贊

96

很好,感謝分享

96

很贊!~謝謝樓主!

13231
Qian · #48 · 2016年12月04日

很好用,學習了。

96

我們公司自己開發了一個UI自動化測試框架,就是基於python+adb,非常強大。

11185

#49樓 @yaboandriod 我們以前用的是python+uiautomator,有一些操作無法實現,才用的adb send event代替的。

11185

其實我希望lz標注出哪些是常用的,因為每個人都要去重復做一個記錄,把常用的命令記下來。
我之前做android測試的時候,常用的是
adb kill-server 
adb devices
adb shell getprop | grep xxx
adb shell rm xxx
adb shell
adb root
adb reboot
adb reboot fastboot
adb remount
adb install
adb logcat
adb pull
adb push
adb shell input text

因為之后一直做互聯網測試,命令都記不得了,得空的時候我也把哪些筆記整理一下。


免責聲明!

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



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