如何得知手機程式的 Package與Launch Activity Name?
這篇文章主要探討一個問題,”如何取得特定 android App的 Package Name 與 Activity Name”?
為什麼要探討這個問題呢? 因為我們在做手機自動化測試的時候,
測試的手機應用程式有可能不是自己單位研發有可能是外部的 APK
這種情況下,當自動化測試程式要執行時,要啟動該 App 就必須要知道該 app 的 Package Name 或是 Activity Name
因此要如何才能取得Package Name or activity Name 呢?
取得 Package Name or Aactivity Name 方法一: 使用 ApkInfo 或是 “”App Detective”(建議)
因為類似的app 很多,筆者比較建議這個 “Apk Information_free”。
因為可以取得 PackageName 與 ActivityName,另外一開始啟動掃描的時間不會很久。
另外一個可以得知 Package Name 與 Launch Activity Name 的 app 是“App Detective”
https://play.google.com/store/apps/details?id=com.zmarties.detective&hl=en
啟動之後,點選特定要查詢的App,例如這張圖為 “104工作快找”
- General > Package Name > 可以得知 Package Name
- Activity > Launch Activity > 可以得知 Launch Activity Name
方法二: 使用 adb指令
- 1. adb shell pm list packages -f
- 2. adb pull <APK path from previous command>
- 3. aapt dump badging <yourpkg.apk>
方法三: 將APK 檔案從手機或是 emulator 取出,觀察 AndroidManifest.xml
- 1. adb shell pm list packages
- 2. adb shell pm path <com.example.someapp>
- 3. adb pull </data/app/com.example.someapp-2.apk>
缺點是AndroidManifest.xml如果用 notepad 開啟會有些像亂碼一般,格式上很難讀懂。
啟動計算機範例程式如下
(要給予正確的 PackageName與 ActivityName)
[pastacode lang=”java” message=”” highlight=”9,10″ provider=”manual”]
@BeforeMethod
public void setUp() throws MalformedURLException{
DesiredCapabilities capabilites = new DesiredCapabilities();
capabilites.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID);
capabilites.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");
capabilites.setCapability("appPackage", "com.android.calculator2");
capabilites.setCapability("appActivity", "com.android.calculator2.Calculator");
AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),capabilites);
driver.manage().timeouts().implicitlyWait(20L, TimeUnit.SECONDS);
}
[/pastacode]
另外,如果這個手機應用程式是在模擬器上執行,可以透過直接安裝該 APK的方式啟動。如此一來就不需要知道 Package Name or ActivityName
範例程式如下:
[pastacode lang=”java” message=”” highlight=”9,10″ provider=”manual”]
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import io.appium.java_client.remote.MobilePlatform;
import org.junit.Test;
import org.openqa.selenium.remote.DesiredCapabilities;
public class myAppiumTest {
@Test
public void test() throws MalformedURLException, InterruptedException {
File appDir = new File("D:\\tools\\BookMyShow\\");
File app = new File(appDir, "bookmyshow.apk");
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(MobileCapabilityType.PLATFORM_NAME, MobilePlatform.ANDROID);
cap.setCapability(MobileCapabilityType.DEVICE_NAME, "Android emulator");
//cap.setCapability(MobileCapabilityType.BROWSER_NAME, "Browser");
cap.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());
AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),cap);
Thread.sleep(5000);
//driver.get("http://www.google.com/");
//driver.findElementById("com.bt.bms:id/btnNoThanks").click();
}
}
[/pastacode]