如何得知手機程式的 Package與Launch Activity Name?

如何得知手機程式的 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,另外一開始啟動掃描的時間不會很久。

Apk Information_free APK detailedInfo

另外一個可以得知 Package Name 與 Launch Activity Name 的 app 是“App Detective”

https://play.google.com/store/apps/details?id=com.zmarties.detective&hl=en

 

AppDetective

 

啟動之後,點選特定要查詢的App,例如這張圖為 “104工作快找”

  • General > Package Name > 可以得知 Package Name
  • Activity > Launch Activity > 可以得知 Launch Activity Name

App Detective Activity

 

方法二: 使用 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)

	@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);
		
		
			
	}

 

另外,如果這個手機應用程式是在模擬器上執行,可以透過直接安裝該 APK的方式啟動。如此一來就不需要知道 Package Name or ActivityName

範例程式如下:

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();
		
	
	}

}

 

Leave a Reply

Your email address will not be published.