ios/android代碼生成FLASH可用的actionscript代碼(*.ane)

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
相關文章
相關標籤/搜索