一種調用動畫數據的方法及裝置與流程
2023-09-21 12:54:55
本發明涉及計算機技術領域,特別涉及一種調用動畫數據的方法及裝置。
背景技術:
目前,flash被廣泛的用於網頁設計和網頁動畫製作及網頁視頻播放等。大多數的視頻網站包括直播網站都採用flash做為其視頻播放器,並且大多數的網頁遊戲也會使用flash來開發,flash的具體使用文件是swf文件。絕大多數的flash程序都是由多個swf(shockwaveflash)文件來組成的,通常都是通過主swf文件來加載其他的swf文件,使用此方法的好處是,可以進行模塊化開發,同時也可以對其他的swf文件進行加密。比如對與遊戲資源文件,通常會使用一個獨立的swf文件來存儲,並且可以對獨立的swf文件進行加密,反止被hack破解。而解密步驟都會在主swf文件中。在主swf文件中會有具體的接口來對數據進行解密。通常正常的使用swf文件都是在主swf的代碼中來加載其他的swf文件,並且將其加入到flash顯示的主舞臺中,這樣其他swf文件才可以進行顯示。而對於其他情況僅僅只是想調用另一個swf文件中的一個方法,比如想調用主swf文件中對其他swf文件解密的方法,或者是想調用主swf文件中數據打包等方法,則沒有辦法只調用其中一個接口。
技術實現要素:
本發明實施例提供了一種調用動畫數據的方法及裝置,在不加載第三方動畫到主舞臺的情況下,直接去調用第三方動畫文件的接口,實現動畫數據的獲取。
第一方面,本發明實施例中提供一種調用動畫數據的方法,所述方法包括:
編寫加載第三方的動畫文件;
查找所述動畫文件具有的類及接口;
獲取需要的目標類並進行實例化,獲取所述目標類的實例化對象及對應的接口;
調用所述實例化對象的接口獲取所述動畫文件中的動畫數據。
進一步的,所述編寫加載第三方的動畫文件的步驟,具體包括:
定義一個動畫文件加載實例;
註冊動畫文件加載完成的回調函數;
創建請求動畫文件的接口;
調用所述接口加載所述動畫文件;
編寫所述回調函數。
進一步的,所述查找所述動畫文件具有的類及接口的步驟,包括:
查找所述動畫文件使用的符號,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
通過反編譯工具讀取所述使用的符號,確定所述動畫文件具有的類及接口。
進一步的,所述獲取需要的目標類並進行實例化,獲取目標類的實例化對象的步驟,具體包括:
調用類判斷接口判斷是否存在需要的目標類;
若是,則調用類獲取接口獲取所述目標類;
根據所述目標類,創建所述目標類的實例化對象,確定所述實例化對象的接口。
進一步的,所述調用所述實例化對象的接口獲取所述動畫文件中的動畫數據的步驟,具體包括:
獲取所述目標類的目標接口,所述目標接口為用戶需要獲取動畫數據的接口,所述目標接口具有用於存放加密前動畫數據的數據參數;
調用所述實例化對象的目標接口獲取所述數據參數。
第二方面,本發明實施例中提供一種調用動畫數據的裝置,所述裝置包括:
編寫單元,用於編寫加載第三方的動畫文件;
查找單元,用於查找所述動畫文件具有的類及接口;
獲取單元,用於獲取需要的目標類並進行實例化,獲取所述目標類的實例化對象及對應的接口;
調用單元,用於調用所述實例化對象的接口獲取所述動畫文件中的動畫數據。
進一步的,所述編寫單元具體用於:
定義一個動畫文件加載實例;
註冊動畫文件加載完成的回調函數;
創建請求動畫文件的接口;
調用所述接口加載所述動畫文件;
編寫所述回調函數。
進一步的,所述查找單元具體用於:
查找所述動畫文件使用的符號,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
通過反編譯工具讀取所述使用的符號,確定所述動畫文件具有的類及接口。
進一步的,所述獲取單元具體用於:
調用類判斷接口判斷是否存在需要的目標類;
若是,則調用類獲取接口獲取所述目標類;
根據所述目標類,創建所述目標類的實例化對象,確定所述實例化對象的接口。
進一步的,所述調用單元具體用於:
獲取所述目標類的目標接口,所述目標接口為用戶需要獲取動畫數據的接口,所述目標接口具有用於存放加密前動畫數據的數據參數;
調用所述實例化對象的目標接口獲取所述數據參數。
本發明實施例中編寫加載第三方的動畫文件;查找動畫文件具有的類及接口;獲取需要的目標類並進行實例化,獲取目標類的實例化對象及對應的接口;調用實例化對象的接口獲取動畫文件中的動畫數據。本發明實施例中在不加載第三方動畫到主舞臺的情況下,直接去調用第三方動畫文件的接口,實現動畫數據的獲取。
附圖說明
圖1是本發明實施例中調用動畫數據的方法的一個實施例示意圖;
圖2為圖1所示實施例中步驟s1的具體實施例流程示意圖;
圖3為圖1所示實施例中步驟s2的具體實施例流程示意圖;
圖4為圖1所示實施例中步驟s3的具體實施例流程示意圖;
圖5為圖1所示實施例中步驟s4的具體實施例流程示意圖;
圖6是本發明實施例中調用動畫數據的裝置的一個實施例示意圖。
具體實施方式
為了使本技術領域的人員更好地理解本發明方案,下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分的實施例,而不是全部的實施例。基於本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都應當屬於本發明保護的範圍。
本發明實施例中,調用動畫數據的方法應用於調用動畫數據的裝置中,該裝置可以位於終端中,例如移動終端或固定終端,具體的,可以是手機、平板等移動終端,或者伺服器等固定終端設備中。
請參閱圖1,本發明實施例中調用動畫數據的方法一個實施例包括:
s1、編寫加載第三方的動畫文件;
本發明實施例中,第三方的動畫文件可以是第三方的swf文件。
s2、查找所述動畫文件具有的類及接口;
由於動畫文件的格式是公開的,以swf文件為例,可以採取一些方式對swf文件進行查找,知道這個swf文件具有哪些類,保護哪些函數接口等。
s3、獲取需要的目標類並進行實例化,獲取所述目標類的實例化對象及對應的接口;
s4、調用所述實例化對象的接口獲取所述動畫文件中的動畫數據。
本發明實施例中編寫加載第三方的動畫文件;查找動畫文件具有的類及接口;獲取需要的目標類並進行實例化,獲取目標類的實例化對象及對應的接口;調用實例化對象的接口獲取動畫文件中的動畫數據。本發明實施例中在不加載第三方動畫到主舞臺的情況下,直接去調用第三方動畫文件的接口,實現動畫數據的獲取。
其中,如圖2所示,所述步驟s1具體可以包括:
s11、定義一個動畫文件加載實例;
具體的,仍以swf文件為例,可以首先定義一個actionscript的loader實例。而在actionscript中提供了一個loader類用來加載swf文件,或者是圖片jpg,gif動畫等文件。因此定義一個swf文件加載實例具體實現如下:
varswfloader:loader=newloader;
s12、註冊動畫文件加載完成的回調函數;
本步驟中仍以swf文件為例,在actionscript中提供了一個loader實例的接口,用來註冊加載完成事件,當loader加載完成一個swf文件後,會回調這個註冊的函數,以告訴它swf文件已經加載完成。在loader中提供了一個addeventlistener接口用來註冊事件。
接口具體原型如下:
addeventlistener(type:string,
listener:function,
usecapture:boolean=false,
priority:int=0,
useweakreference:boolean=false)
其中,第一個參數type:string用來表示註冊的事件類型,對應於本文則是event.complete,表示註冊swf加載完成事件;第二個參數listener:function用來表示註冊的完成事件完成後的回調函數,用於觸發回調函數執行;第三個參數priority:int用於標示事件的優先級,使用默認值0;第四個參數useweakreference:boolean指定回調函數是弱應用還是強引用,使用默認值false。
s13、創建請求動畫文件的接口;
仍以swf文件為例,創建請求動畫文件的接口即,創建請求swf的接口urlrequest,在actionscript提供接口用來從網絡或者本地請求一個swf文件,具體接口如下:
urlrequest(url:string=null)
其中,參數url:string標示傳入的url地址或者本地路徑。
s14、調用所述接口加載所述動畫文件;
在動畫文件為swf文件時,可以調用loader實例的接口來加載請求的swf文件,具體接口如下:
load(request:urlrequest,context:loadercontext=null)
其中,參數request:urlrequest就是加載的請求對象,就是步驟s13中創建的urlrequest對象。
s15、編寫所述回調函數。
編寫回調函數swfloadcompletehandler,此函數即是上面調用的註冊加載完成的回調函數。
進一步的,如圖3所示,上述步驟s2具體可以包括:
s21、查找所述動畫文件使用的符號,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
s22、通過反編譯工具讀取所述使用的符號,確定所述動畫文件具有的類及接口。
由於swf文件的格式是公開的,很容易找到第三方的反編譯工具,可以對swf進行反編譯,swf文件會存儲所有使用的符號,比如會存儲所有的包名,所有的類名,所有的函數名和變量名等,那麼通過反編譯工具是可以讀取到這些名字,可以知道這個swf文件保護哪些類,哪些函數接口,從而可以為後續使用反射機制來獲取到這些類及接口。
進一步的,如圖4所示,上述步驟s3具體可以包括:
s31、調用類判斷接口判斷是否存在需要的目標類,若是,則執行步驟s32;
s32、調用類獲取接口獲取所述目標類;
s33、根據所述目標類,創建所述目標類的實例化對象,確定所述實例化對象的接口。
仍以swf文件為例,首先在s1中我們通過loader的接口加載了一個第三方的swf文件,然後通過步驟s2的反編譯可以看到swf有哪些類有哪些接口,進而可以找到需要的接口來進行調用。先舉例假設swf有一個類名是classdata,在loader實例中已經將第三方的swf文件加載了,那麼通過loader的接口則可以獲取到第三方的類信息,並進行實例化。那麼通過反射機制的具體調用方法是如下:
(1)先調用loader的接口判斷是否存在這個目標類。
通過loader的接口hasdefinition(上述類判斷接口)則可以判斷第三方swf是否具有這個目標類。原型如下:
hasdefinition(name:string):boolean
其中,參數name:string則是填入類的名字(目標類的名字),返回值則是true則存在,是false則不存在。調用如下:
varbdefine:boolean=swfloader.contentloaderinfo.applicationdomain.hasdefinition("classdata");
其中,swfloader則是步驟s1中加swf的loader實例,參數"classdata"則是假設存在這個類。返回值bdefine標示是否存在這個類。
(2)調用loader的接口獲取這個目標類。
通過loader的接口getdefinition(上述類獲取接口)則可以獲取到這個類。原型如下:
getdefinition(name:string):object
其中,參數name:string則是類的名字,返回值則是目標類。
varcclass:class=swfloader.contentloaderinfo.applicationdomain.getdefinition("classdata")asclass;
其中swfloader則是步驟s1中加swf的loader實例,參數"classdata"則是假設存在這個目標類。返回值cclass則是對應的classdata這個目標類。
(3)實例化類的對象。
通過步驟2獲取到了類cclass後,可以通過其創建一個實例化對象,確定該實例化對象的接口。
具體如下:
varobj:cclass=newcclass;
這樣就創建了一個cclass的實例對象obj。至此,通過這個步驟就實現通過反射機制來創建一個類的實例化對象。
進一步的,如圖5所示,上述步驟s4具體可以包括:
s41、獲取所述目標類的目標接口;
其中,所述目標接口為用戶需要獲取動畫數據的接口,所述目標接口具有用於存放加密前動畫數據的數據參數;
s42、調用所述實例化對象的目標接口獲取所述數據參數。
通過步驟s3創建了一個類的實例化對象obj,從而可以直接調用其接口方法,來實現如數據解密,數據獲取等。具體如下:
假設類cclass有一個接口decodedata(int*data,intnlen),接口有一個參數data,用於存放加密前的數據。則可以直接通過obj對象來調用。
varndata:int;
varnlen:int;
obj.decodedata(ndata,nlen);
至此,通過這個步驟就實現了通過反射機制獲取到的類並調用其接口。從而可以比較方便的調用第三方swf的接口的獲取數據。
下面介紹本發明實施例中調用動畫數據的裝置的實施例。
請參閱圖6,為本發明實施例中調用動畫數據的裝置的一個實施例示意圖,該實施例中,調用動畫數據的裝置包括:
編寫單元601,用於編寫加載第三方的動畫文件;
查找單元602,用於查找所述動畫文件具有的類及接口;
獲取單元603,用於獲取需要的目標類並進行實例化,獲取所述目標類的實例化對象及對應的接口;
調用單元604,用於調用所述實例化對象的接口獲取所述動畫文件中的動畫數據。
進一步的,所述編寫單元601具體用於:
定義一個動畫文件加載實例;
註冊動畫文件加載完成的回調函數;
創建請求動畫文件的接口;
調用所述接口加載所述動畫文件;
編寫所述回調函數。
進一步的,所述查找單元602具體用於:
查找所述動畫文件使用的符號,所述符號包括所有使用的包名,所有的類名,所有的函數名和變量名;
通過反編譯工具讀取所述使用的符號,確定所述動畫文件具有的類及接口。
進一步的,所述獲取單元603具體用於:
調用類判斷接口判斷是否存在需要的目標類;
若是,則調用類獲取接口獲取所述目標類;
根據所述目標類,創建所述目標類的實例化對象,確定所述實例化對象的接口。
進一步的,所述調用單元604具體用於:
獲取所述目標類的目標接口,所述目標接口為用戶需要獲取動畫數據的接口,所述目標接口具有用於存放加密前動畫數據的數據參數;
調用所述實例化對象的目標接口獲取所述數據參數。
所屬領域的技術人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統,裝置和單元的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
在本申請所提供的幾個實施例中,應該理解到,所揭露的系統,裝置和方法,可以通過其它的方式實現。例如,以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現時可以有另外的劃分方式,例如多個單元或組件可以結合或者可以集成到另一個系統,或一些特徵可以忽略,或不執行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位於一個地方,或者也可以分布到多個網絡單元上。可以根據實際的需要選擇其中的部分或者全部單元來實現本實施例方案的目的。
另外,在本發明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以採用硬體的形式實現,也可以採用軟體功能單元的形式實現。
所述集成的單元如果以軟體功能單元的形式實現並作為獨立的產品銷售或使用時,可以存儲在一個計算機可讀取存儲介質中。基於這樣的理解,本發明的技術方案本質上或者說對現有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟體產品的形式體現出來,該計算機軟體產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算機設備(可以是個人計算機,伺服器,或者網絡設備等)執行本發明各個實施例所述方法的全部或部分步驟。而前述的存儲介質包括:u盤、移動硬碟、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、磁碟或者光碟等各種可以存儲程序代碼的介質。
以上所述,以上實施例僅用以說明本發明的技術方案,而非對其限制;儘管參照前述實施例對本發明進行了詳細的說明,本領域的普通技術人員應當理解:其依然可以對前述各實施例所記載的技術方案進行修改,或者對其中部分技術特徵進行等同替換;而這些修改或者替換,並不使相應技術方案的本質脫離本發明各實施例技術方案的精神和範圍。