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