張 天,耿慶田,高琦坤
(長春師范大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,吉林長春 130032)
隨著“互聯(lián)網(wǎng)+”和大數(shù)據(jù)應(yīng)用的不斷深入,移動互聯(lián)終端在各個(gè)行業(yè)中的應(yīng)用越來越普及,移動終端的應(yīng)用程序也越來越多,尤其一些專業(yè)領(lǐng)域,需要特殊定制行業(yè)移動應(yīng)用。由于Android的免費(fèi)特性,很多移動終端都以其作為運(yùn)行平臺來開發(fā)相應(yīng)的行業(yè)應(yīng)用。在編制過程中,程序員經(jīng)常需要調(diào)用相關(guān)行業(yè)專用硬件信息來獲取數(shù)據(jù),而在編制應(yīng)用程序過程中未必具備某些專用硬件,或者應(yīng)用程序編制者不能熟悉使用這些專用硬件,而從專用硬件中得到數(shù)據(jù)才能保證應(yīng)用程序的測試運(yùn)行,此時(shí)可以利用Android程序的運(yùn)行機(jī)制進(jìn)行程序替換,以獲取和設(shè)定上層應(yīng)用程序需要的特定數(shù)據(jù)進(jìn)行測試。
Android應(yīng)用程序采取了MVC的設(shè)計(jì)模式,程序界面與程序運(yùn)行代碼是分離的。我們每設(shè)計(jì)一個(gè)窗口程序界面,需要同時(shí)完成兩項(xiàng)工作:一是應(yīng)用程序的界面設(shè)計(jì);一是用戶在界面操作時(shí)的響應(yīng)代碼。程序界面在項(xiàng)目工程中以布局文件形式存在,而界面響應(yīng)代碼則以JAVA類的形式存在。在Android中將這兩項(xiàng)統(tǒng)一稱作Activity(活動)。在Android Studio中創(chuàng)建活動如圖1所示,從中可看出活動的組成。
圖1 Android Studio創(chuàng)建活動
在Android的項(xiàng)目中,會有一個(gè)活動作為主活動,當(dāng)程序第一次運(yùn)行時(shí)最先顯示給用戶,然后通過這個(gè)活動進(jìn)行其它活動的調(diào)用執(zhí)行。為了使Android平臺可以自動啟動主活動,在每個(gè)項(xiàng)目中有一個(gè)配置文件,文件名為AndroidManifest.xml,在這個(gè)文件中定義了我們所建立的每一個(gè)活動的屬性與關(guān)聯(lián)。代碼如下:
android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar">
Android通過intent-filter標(biāo)簽中action屬性值來確定哪一個(gè)活動會作為主活動啟動,從上述代碼中可以看到,action值為“android.intent.action.MAIN”時(shí),Android平臺將調(diào)用對應(yīng)的活動作為應(yīng)用程序的第一個(gè)窗口呈現(xiàn)在用戶眼前。通過使action取不同的值,可以啟動不同的活動,其中包括一些系統(tǒng)活動和用戶所設(shè)定的活動。
在Android系統(tǒng)中,要啟動某一個(gè)活動,需要發(fā)送Intent對象給Android平臺,Android平臺通過Intent中包含的action名稱來決定啟動哪一個(gè)Activity??梢酝ㄟ^這種方式來對一些現(xiàn)有應(yīng)用程序中的運(yùn)行活動進(jìn)行替代,向應(yīng)用程序發(fā)送模擬數(shù)據(jù),對應(yīng)用程序進(jìn)行運(yùn)行測試。
以替代Android相機(jī)程序?yàn)槔?,假設(shè)程序員在編制程序過程中,需要調(diào)用相機(jī)獲取圖像之后才能繼續(xù)進(jìn)行程序調(diào)試,但是每次打開相機(jī)獲取圖像時(shí)操作過于緩慢。我們可以創(chuàng)建一個(gè)測試應(yīng)用項(xiàng)目,通過修改Intent調(diào)用機(jī)制,使應(yīng)用程序每次只調(diào)用我們編寫的測試應(yīng)用,而不啟動Android平臺中的相機(jī)應(yīng)用,在測試應(yīng)用中,可以直接為調(diào)用者提供他們所需要的已經(jīng)拍照好的圖像,這樣就可以節(jié)省大量程序調(diào)試時(shí)間,同時(shí)為程序調(diào)試提供特定數(shù)據(jù)。
首先,明確在我們所使用的Android平臺中需要替換的應(yīng)用程序的完整包名和調(diào)用此應(yīng)用程序所指定的Intent的屬性值內(nèi)容。為獲取以上兩方面信息,可以借助網(wǎng)絡(luò)上的APK反編譯工具對所要替代程序的安裝包進(jìn)行反編譯,本文推薦比較常用的APK反編譯工具APK Editor Pro,圖形化界面易操作。之后在反編譯好的文件夾中找到該程序的AndroidManifest.xml文件,在該文件中查找到此程序的完整包名和調(diào)用該程序所發(fā)出的intent值并記錄。
圖2 Android對相同Intent請求調(diào)用示意圖
然后,在建立測試應(yīng)用項(xiàng)目時(shí)對該項(xiàng)目空間命名,采用剛剛查找到的包名信息進(jìn)行命名,在測試項(xiàng)目的AndroidManifest.xml文件中對Activity進(jìn)行定義時(shí),intent-filter標(biāo)簽中的action屬性值設(shè)成我們記錄的intent值。以這種方式進(jìn)行設(shè)置后,如果將測試程序安裝到現(xiàn)有Android平臺后,在平臺當(dāng)中就會出現(xiàn)兩個(gè)同名包的應(yīng)用程序,那么當(dāng)啟動該名稱的程序時(shí),Android系統(tǒng)會調(diào)用最后安裝的應(yīng)用程序,這樣就實(shí)現(xiàn)了原有啟動程序的替換。此方案詳細(xì)替換過程如圖2所示,經(jīng)過替換后,由測試程序向主程序提供調(diào)用返回?cái)?shù)據(jù)。
最后,可以在測試程序中按照預(yù)先設(shè)定,為主程序提供所需的測試數(shù)據(jù),在提供數(shù)據(jù)之前,也可以在測試程序中對測試數(shù)據(jù)進(jìn)行加工處理,以適應(yīng)主程序要求。
本文中提供的方法可以用作替換現(xiàn)有第三方應(yīng)用程序被自開發(fā)的程序調(diào)用,針對不便修改的第三方程序也可以調(diào)用其它活動進(jìn)行替換,從而為第三方程序提供我們想提供給它的數(shù)據(jù)內(nèi)容,但在這方面應(yīng)用時(shí),需要注意相關(guān)的版權(quán)問題及相關(guān)的法律法規(guī)。