PS:最近因爲工做緣由,須要把現有的Android+IOS工程轉成flash air可用的工程,簡單來講就是把ios+android 轉換成anehtml
歡迎各類轉載,轉載請註明出處java
微信:coderbook android
gitHub:https://github.com/coderbookios
blog:http://www.coderbook.netgit
開發環境:github
一、操做系統:Windows/MacOX/Linux 本文以MacOX10.9爲例macos
二、開發環境(IDE):Xcode6.1+FlashBuilder4.6vim
三、SDK:IOS8.0以上,AdobeAirSDK16+xcode
1、概述bash
1)AdobeAirSDK安裝
2)使用FlashBuilder建立actionscript library項目(以TalkingData Adtracking項目爲例)
3)利用xcode建立actionscript調用ios代碼的中間項目
4)建立actionscript調用android代碼的中間工程
5)導出各項目,放在相應的目錄中,並編寫相應配置文件
6)使用airsdk命令編譯生成*.ane項目
7)建立使用調用ane代碼的demo
8)編譯android版本生成apk
9)建立ios版本生成ipa
2、AdobeAirSDK安裝
1)下載以後開始安裝,在mac ox的安裝路徑以下:~/AIRSDK_Compiler
2)配置環境變量。vim ~/.bash_profile 添加以下內容:export PATH=$PATH:/Users/vernon/AIRSDK_Compiler/bin
3)退出保存。
4)打開Command(命令行工具),運行adt -version查看是否配置正確。
5)安裝完成
6)QA
3、使用FlashBuilder建立actionscript library項目
1)下載和安裝FlashBuilder(個人版本是4.6)
2)下載TalkingData SDK Tdtracking版本。ios版本 android版本
3)打開FlashBuiler建立ActionScript library項目,packagename命名爲com.talkingdata.sdk
3.1 打開TalkingDataAdtracking SDK 查看可使用的接口,如下方法都是咱們要封裝的接口
3.2 建立TalkingDataAdTracking類。添加引用 import flash.external.ExtensionContext (actionScript就是經過這個類來實現與ios和android代碼進行通訊的)而且建立 extContext=ExtensionContext.createExtensionContext("com.talkingdata.sdk",null);
。
3.3 對於extContext.call(functionName,TalkingDataAneFunction.AdTracking_init,...);方法的說明:extContext.call方法第一個參數是方法名,這裏我們以前定義的
//函數名稱,之後的調用都是過這個方法名來傳遞的 public static const functionName:String="TalkingDataFunctions";
第二個參數用來標識,調用的是TalkingDataAdtracking的哪一個方法,如上面init方法裏的AdTracking_init方法;
剩下的參數是調用TalkingData Adtracking SDK 所須要的參數。
3.4 剩下的方法實現,能夠參數源碼 gitHub
4、利用xcode建立actionscript調用ios代碼的中間項目
1)從官網下載FlashRuntimeExtensions.h(也能夠從個人github地址下載)文件,這是一個C寫的與actionscript交互的代碼
2)建立一個名稱爲TalkingDataSDKIOSLib的ios library項目,而且添加對FlashRuntimeExtensions.h和TalkingData SDK的引用
如圖:
3)建立名稱爲TalkingDataSDKIOSLib.h和TalkingDataSDKIOSLib.m的調用類,如上圖所示。
4)添加引用而且定義與actionscript中相同值的方法類型(int類型)
5)添加Initializer和Finalizer方法(參數是固定格式)
void TalkingDataSDKContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet){ *numFunctionsToTest=1; FRENamedFunction *func=(FRENamedFunction*)malloc(sizeof(FRENamedFunction) * 1); func[0].name=(const uint8_t*)"TalkingDataFunctions"; func[0].functionData=NULL; func[0].function=&TalkingDataSDKFunctions; *functionsToSet=func; } void TalkingDataSDKContextFinalizer(FREContext ctx){ } void TalkingDataSDKExtensionInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet){ extDataToSet=NULL; *ctxInitializerToSet=&TalkingDataSDKContextInitializer; *ctxFinalizerToSet=&TalkingDataSDKContextFinalizer; }
6)如上面代碼所示,最終的調用函數都指向了TalkingDataSDKFunctions這個方法(也是固定參數),因此添加方法
FREObject TalkingDataSDKFunctions(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]){ ... }
7)
5、建立actionscript調用android代碼的中間工程
1)用FlashBuilder(用eclipse或者android studio均可以)建立名稱爲TalkingDataSDKJava項目,而且添加package:com.talkingdata.sdk.flashair。
2)添加須要使用jar包
2.1 添加talkingdata sdk和FlashRuntimeExtensions.jar(adobe 封裝的jar包)的引用。
2.2 添加android的依賴包(/Users/vernon/android-sdk-macosx/platforms/android-18/andorid.jar)(eclipse或者android studio 不須要添加這步)
3)建立TalkingDataFunctions 繼承FREFunction用來處理全部從actionscript傳過來的方法。
public class TalkingDataFunctions implements FREFunction { TalkingDataSDKContext exContext=null; public TalkingDataFunctions(TalkingDataSDKContext exContext){ this.exContext=exContext; } private String Tag="TalkingDataFunctions"; @Override public FREObject call(FREContext arg0, FREObject[] arg1) { FREObject obj=null; ..... ..... return obj; } }
4)建立TalkingDataSDKContext類繼承FREContext
public class TalkingDataSDKContext extends FREContext{ @Override public Map<String, FREFunction> getFunctions() { Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>(); functionMap.put("TalkingDataFunctions",new TalkingDataFunctions(this)); return functionMap; } @Override public void dispose() { } }
5)建立TalkingDataSDKExtension繼承FREExtension類,並實現createContext方法:
@Override public FREContext createContext(String arg0) { TalkingDataSDKContext talkingDataContext = new TalkingDataSDKContext(); return talkingDataContext; }
6)具體調用TalkingData SDK的方法能夠參考TalkingDataFunctions類的方式。
6、導出各項目,放在相應的目錄中,並編寫相應配置文件
1)建立名爲TalkingDataSDKbuild的文件夾,用來存放全部須要的文件,而且在該文件夾中分別建立名爲Android-ARM、iPhone-ARM、default三個文件夾。
2)導出並生成必須的文件
2.1 以jar包的形式導出「第五步」中建立的代碼。名字爲:anejava.jar 。
2.2 利用jar命令把剛剛導出的talkingdataanejava.jar和talkingdata Adtracking sdk的jar合併成爲一個jar,即talkingdataane.jar。{
mkdir tmp
cd tmp
jar -xvf ../anejava.jar
jar -xvf ../talkingdata-sdk-xxx.jar
jar -cvf talkingdataane.jar .
}
2.3 導出在「第四步」中生成的.a庫(xcode:先選擇設備類型爲IOS Device 而後再 command+B)在Products文件夾下libTalkingDataSDKIOSLib.a
2.4 導出在「第三步」中生成的actionscript的庫。在bin目錄下的TalkingDataSDKAS.swc
3)把相關的庫放到對應的目錄下面
3.1 把talkingdataane.jar放在Android-ARM下面
3.2 把libTalkingDataSDKIOSLib.a放在iPhone-ARM下面
3.3 把TalingDataSDKAS.swc 放在TalkingDataSDKbuild文件夾下面。而且複製一份TalingDataSDKAS副本.swc把它修改爲.zip,而後解壓。
打開解壓後臺的文件,把名字爲library.swf的文件分別copy到Android-ARM、iPhone-ARM、default下面各一份。
而後刪除TalingDataSDKAS副本.zip和TalingDataSDKAS副本文件夾
4)建立其它必要文件
4.1 生成*.p12文件用於給ane簽名
4.2 建立extension.xml
<extension xmlns="http://ns.adobe.com/air/extension/16.0"> <!-- 這裏與三-3.2中的字符串相同 --> <id>com.talkingdata.sdk</id> <versionNumber>1.0.0</versionNumber> <platforms> <!-- Android-ARM 相對android的文件夾--> <platform name="Android-ARM"> <applicationDeployment> <nativeLibrary>talkingdataane.jar</nativeLibrary> <!-- 這裏是以前在android庫中建立的類名 --> <initializer>com.talkingdata.sdk.flashair.TalkingDataSDKExtension</initializer> <finalizer>com.talkingdata.sdk.flashair.TalkingDataSDKExtension</finalizer> </applicationDeployment> </platform> <platform name="iPhone-ARM"> <applicationDeployment> <nativeLibrary>libTalkingDataSDKIOSLib.a</nativeLibrary> <!-- 對ios庫中TalkingDataSDKIOSLib裏方式的名稱 --> <initializer>TalkingDataSDKExtensionInitializer</initializer>
<finalizer>TalkingDataSDKContextFinalizer</finalizer>
</applicationDeployment>
</platform> <platform name="default"> <applicationDeployment/> </platform> </platforms> </extension>
4.3 在iPhone-ARM下建立platform.xml的文件
<platform xmlns="http://ns.adobe.com/air/extension/16.0"> <sdkVersion>8.0</sdkVersion> <linkerOptions> <option>-w</option> <option>-ios_version_min 5.1.1</option> <option>-framework AdSupport</option> <option>-framework Security</option> <option>-framework CoreTelephony</option> <option>-lz</option> </linkerOptions> </platform>
7、打開命令行,進入到TalkingDataSDKbuild目錄下 執行:
adt -package -storetype pkcs12 -keystore a.p12 -storepass wangying -target ane com.talkingdata.adtracking.ane extension.xml -swc TalkingDataSDKAS.swc -platform Android-ARM -C Android-ARM . -platform iPhone-ARM -C iPhone-ARM . -platform default -C default .
生成com.talkingdata.adtracking.ane。到這裏,其實,編寫工做已經完成。
8、建立使用調用ane代碼的demo
1)建立名TalkingDataSDKDemo的Flex mobile項目。
2)引用咱們剛剛建立好的com.talkingdata.adtracking.ane庫。
3)以生成的爲ViewNavigatorApplication類型的application結構來講。打開TalkingDataSDKDemo.mxml。在application_completeHandler方法中進行初始化:
4)在TalkingDataSDKDemoHomeView.mxml頁面添加添加一個按鈕事件,調用onCreateRole方法,以下:
<?xml version="1.0" encoding="utf-8"?> <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView"> <fx:Script> <![CDATA[ import com.talkingdata.sdk.TalkingDataAdTracking; protected function oncreateButton_click(event:MouseEvent):void { TalkingDataAdTracking.onCreateRole("rolename_td"); } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> <s:Button x="122" y="87" label="Createrole" click="oncreateButton_click(event)"/> </s:View>
5)編輯TalkingDataSDKDemo-app.xml文件添加android必須的權限,而且修改TalkingDataSDKDemo-app.xml下面的命名空間爲16.0
<android> <colorDepth>16bit</colorDepth> <manifestAdditions><![CDATA[ <manifest android:installLocation="auto"> <!--See the Adobe AIR documentation for more information about setting Google Android permissions--> <!--Removing the permission android.permission.INTERNET will have the side effect of preventing you from debugging your application on your device--> <uses-permission android:name="android.permission.INTERNET"/> <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>--> <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>--> <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> </manifest> ]]></manifestAdditions> </android>
<?xml version="1.0" encoding="utf-8" standalone="no"?> <application xmlns="http://ns.adobe.com/air/application/16.0"> ..... </application>
6)保存,而且拷貝bin目錄下面*.xml和*.swf到TalkingDataSDKbuild目錄下面
7)運行以下腳本(或者使用flashbuilder導出)生成android可運行的apk
adt -package -target apk -storetype PKCS12 -keystore a.p12 -storepass wangying talkingdata-android-adtracking.apk TalkingDataSDKDemo-app.xml TalkingDataSDKDemo.swf -extdir .
8)編譯ios版本
8.1 修改TalkingDataSDKDemo-app.xml的<iPhone></iPhone>部分,添加bundleId
<iPhone> <InfoAdditions><![CDATA[ <key>com.talkingdata.sdk.aneDemo</key> <array> <string>1</string> <string>2</string> </array> ]]></InfoAdditions> <requestedDisplayResolution>high</requestedDisplayResolution> </iPhone>
8.2 在ios開發者後臺建立bundleId爲com.talkingdata.sdk.aneDemo的開發者證書,如,命名爲:anetrackingadhoc.mobileprovision
8.3 運行如下腳本,生成ipa包:
adt -package -target ipa-test -provisioning-profile anetrackingadhoc.mobileprovision -storetype PKCS12 -keystore a.p12 -storepass wangying talkingdata-adtracking.ipa TalkingDataSDKDemo-app.xml TalkingDataSDKDemo.swf -extdir . -platformsdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk