2023-05-12|閱讀時間 ‧ 約 14 分鐘

App 自動化測試(四)ReDroid 容器安裝 Google Play 套件、App下載安裝

前言

前幾篇聊到作業系統、Docker 跟 Android 容器的準備,再來就是替 Android 容器開啟 Google Play 套件並安裝待測 App 供後續手動或者自動測試使用。

Google Play 套件處理

標準的 ReDroid 容器是沒有包含Google Play 套件的需要另外安裝,以下也是按照教學文操作,有點出入,不過大致符合。

下載並準備 Google Play 套件
OpenGapps下載 GApps,這邊選擇 x86_64架構的 Android 11 最小化的pico 版本,會得到一包 ZIP 壓縮檔,裡面包含許多小的子套件,如果沒有裝過 lzip,可以用以下指令裝一下
sudo apt install lunzip
直接下載的指令
$ wget https://master.dl.sourceforge.net/project/opengapps/x86_64/20220503/open_gapps-x86_64-11.0-pico-20220503.zip
$ unzip open_gapps-x86_64-11.0-pico-20220503.zip -d gapps
檢視解壓縮的檔案可以看到這樣的目錄結構
$ tree gapps/ -d
gapps/
├── Core
├── GApps
├── META-INF
│   └── com
│       └── google
│           └── android
└── Optional

再來是最繁瑣的一個步驟,要重建 System 結構。
首先將 Core / GApps 內的所有 tar.lz 解壓縮到另外一個目錄去,如果對於解壓LZ不熟,可以看這篇
$ cd gapp
$ mkdir unizipped
$ cd unizipped/
$ rm setupwizardtablet-x86_64 -fr
$ cat ../Core/*.lz | tar --lzip -xvf - -i
$ cat ../GApps/*.lz | tar --lzip -xvf - -i
再來建立要上傳設備的 System 目錄,然後把解開的檔案一一放回去,這邊不是直接放回去就好,要做一點處理,把 common 或者 nodpi 前的路徑去掉。特別要注意的就是 setupwizard 用 default 就好。
scott@osboxes:~/Downloads/gapps/unzipped$ find . -name common | xargs cp -t system -r
scott@osboxes:~/Downloads/gapps/unzipped$ cp system/common/common/* system/common/. -r
scott@osboxes:~/Downloads/gapps/unzipped$ rm system/common/common -fr
scott@osboxes:~/Downloads/gapps/unzipped$ find . -name nodpi | xargs cp -t system -r
scott@osboxes:~/Downloads/gapps/unzipped$ cp system/common/* system/. -r
scott@osboxes:~/Downloads/gapps/unzipped$ cp system/nodpi/* system/. -r
scott@osboxes:~/Downloads/gapps/unzipped$ rm system/nodpi -fr
scott@osboxes:~/Downloads/gapps/unzipped$ rm system/common -fr
先看期望結果
scott@osboxes:~/Downloads/gapps/unzipped$ tree system/
system/
├── app
│   ├── GoogleCalendarSyncAdapter
│   │   └── GoogleCalendarSyncAdapter.apk
│   ├── GoogleContactsSyncAdapter
│   │   └── GoogleContactsSyncAdapter.apk
│   ├── GoogleExtShared
│   │   └── GoogleExtShared.apk
│   └── GoogleTTS
│       └── GoogleTTS.apk
├── etc
│   ├── default-permissions
│   │   ├── default-permissions.xml
│   │   └── opengapps-permissions-q.xml
│   ├── permissions
│   │   ├── com.google.android.dialer.support.xml
│   │   ├── com.google.android.maps.xml
│   │   ├── com.google.android.media.effects.xml
│   │   ├── privapp-permissions-google.xml
│   │   └── split-permissions-google.xml
│   ├── preferred-apps
│   │   └── google.xml
│   └── sysconfig
│       ├── dialer_experience.xml
│       ├── google_build.xml
│       ├── google_exclusives_enable.xml
│       ├── google-hiddenapi-package-whitelist.xml
│       └── google.xml
├── framework
│   ├── com.google.android.dialer.support.jar
│   ├── com.google.android.maps.jar
│   └── com.google.android.media.effects.jar
├── priv-app
│   ├── AndroidAutoPrebuiltStub
│   │   └── AndroidAutoPrebuiltStub.apk
│   ├── AndroidMigratePrebuilt
│   │   └── AndroidMigratePrebuilt.apk
│   ├── CarrierSetup
│   │   └── CarrierSetup.apk
│   ├── ConfigUpdater
│   │   └── ConfigUpdater.apk
│   ├── GoogleBackupTransport
│   │   └── GoogleBackupTransport.apk
│   ├── GoogleExtServices
│   │   └── GoogleExtServices.apk
│   ├── GoogleFeedback
│   │   └── GoogleFeedback.apk
│   ├── GoogleOneTimeInitializer
│   │   └── GoogleOneTimeInitializer.apk
│   ├── GooglePackageInstaller
│   │   └── GooglePackageInstaller.apk
│   ├── GooglePartnerSetup
│   │   └── GooglePartnerSetup.apk
│   ├── GoogleRestore
│   │   └── GoogleRestore.apk
│   ├── GoogleServicesFramework
│   │   └── GoogleServicesFramework.apk
│   ├── Phonesky
│   │   └── Phonesky.apk
│   ├── PrebuiltGmsCore
│   │   └── PrebuiltGmsCore.apk
│   └── SetupWizard
│       └── SetupWizard.apk
└── product
│   └── overlay
│      └── PlayStoreOverlay.apk
└── system

30 directories, 36 files

安裝 Google Play 套件
取得 root 權限,重新連結後移除舊有套件
adb connect localhost:5555
adb -s localhost:5555 root
adb connect localhost:5555
adb -s localhost:5555 shell "rm -rf system/priv-app/PackageInstaller"
推送整理好的 system 到裝置中
adb -s localhost:5555 push system /
adb -s localhost:5555 shell "pm grant com.google.android.gms android.permission.ACCESS_COARSE_LOCATION"
adb -s localhost:5555 shell "pm grant com.google.android.gms android.permission.ACCESS_FINE_LOCATION"
adb -s localhost:5555 shell "pm grant com.google.android.setupwizard android.permission.READ_PHONE_STATE"
adb -s localhost:5555 shell "pm grant com.google.android.setupwizard android.permission.READ_CONTACTS"
adb reboot
重新啟動 ReDroid 容器
sudo docker ps -a 
sudo docker restart <容器ID>
$ adb connect localhost:5555
connected to localhost:5555
$ adb devices
List of devices attached
localhost:5555	device

註冊裝置
新版 Google Play 要認證裝置並取得證書才能使用,自製的虛擬裝置也可以,但要上 Google 網站認證:
方法就是透過 ADB 取得裝置 ID,手動申請,過幾分鐘就會開通
$ adb -s localhost:5555 root
$ adb connect localhost:5555
$ adb -s localhost:5555 shell 'sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \
    "select * from main where name = \"android_id\";"'
之後重新啟動容器並連接裝置
$ sudo docker restart redroid11
$ adb connect localhost:5555
$ scrcpy -s localhost:5555
就可以開心從虛擬裝置中透過 Google Play 去下載所需的 App

待測 App 處理

待測的 App 可以從兩個面向看,一是有沒有上架 PlayStore,二是有沒有原始開發團隊支持。
有沒有開發團隊支援的差別在於,後續測試 App 時需要知道關鍵的 Activities 跟 Components,有的話直接問比較快,沒有的話就要暴力拆解猜測。

下載 App
有上架 PlayStore 在 Google Play 框架裝好後,就能直接從市集取用。沒有的話要手動從非官方網站獲得,就會有暴露被植入惡意木馬的風險。
前者就略過,自行上市集下載即可,後者可以用的網站有:
  1. Evozi APK Downloader:貼上 Play Store 網站的連結就可以幫你下載
  2. APK Pure:知名的第三方下載源
  3. APK Mirror:知名的第三方下載源
再次提醒,使用非官方下載,要提防安全風險。

安裝 App
這邊使用 ADB 就能簡單完成
adb -s localhost:5555 install "jp.naver.line.android.apk"

執行並檢視 Log

這邊一樣透過 ADB 獲得裝置的即時 Log
adb logcat

小結

這一系列把作業系統、容器、安卓容器跟官方市集都講完了,接下來就會真正進入測試工具 Appium。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.