AIR Android開發--APK結構詳解


轉自:http://www.fluidea.cn/blog/archives/308

了解Android SDK開發的朋友都知道,在Android應用中,界面顯示由Activity對象來完成,一個程序包含一個或多個Activity,Activity之間可以相互調用,也可以和其他程序中的Activity交互。那么,使用air開發的Android應用和原生程序有什么區別?是否包含Activity?如何和其他程序交互?

APK的文件結構

和原生Android應用一樣,AIR程序也包含一個Activity,用來檢測AIR Runtime、加載並運行主SWF文件。Adobe並沒有提供相關的信息,事實上,對於Flash開發者來說,也沒必要了解這些信息。不過,我們可以借助其他工具獲取AIR Android應用的秘密,那就是使用apktool對APK文件進行解包。

APK文件本身是一個壓縮包,直接用解壓工具即可打開,但里面的文件都已被編碼為二進制文件格式,不能直接看,比如程序描述文件AndroidManifest.xml,使用apktool工具可以將這些文件解碼還原出來。

apktool(http://code.google.com/p/android-apktool/)是一個非常著名的開源工具包,功能很強大,可以解包APK文件並重新打包,常用來漢化Android應用。

apktool的用法很簡單,下載解壓后,將程序路徑添加到系統的環境變量就可以使用了。以<AIR Android應用開發實戰>第二章的黑白棋程序為例,使用以下命令解包APK文件:
apktool d FlipIt.apk
運行后目錄下會生成一個名為“FlipIt”的文件夾,進去就能看到程序編譯后的結構,如下圖所示:

AndroidManifest.xml是程序描述文件,包含了程序的重要信息: 

<?xml version="1.0" encoding="utf-8"?> 
<manifest android:versionCode="1000" android:versionName="@string/app_version" android:installLocation="auto" package="air.org.fluidea.FlipIt" 
  xmlns:android="http://schemas.android.com/apk/res/android"> 
    <application android:label="@string/app_name" android:icon="@drawable/icon" android:hardwareAccelerated="true"> 
        <activity android:theme="@style/Theme.NoShadow" android:label="@string/app_name" android:name=".AppEntry" android:launchMode="singleTask" android:screenOrientation="user" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="stateHidden|adjustResize"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
            <meta-data android:name="fullScreen" android:value="true" /> 
            <meta-data android:name="uniqueappversionid" android:value="93897e31-13cd-4501-8f60-cc80412af678" /> 
            <meta-data android:name="initialcontent" android:value="FlipIt.swf" /> 
        </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="14" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

package屬性標明了整個程序的包路徑,對比AIR程序中的程序描述文件,我們會發現AIR的ADT打包工具自動在id前面加上了"air."前綴。

Activity節點則清楚地顯示,程序包含一個主Activity,且名稱為“AppEntry"。細心的讀者已經發現,解包生成的文件中有一個smali文件夾,下面對應一個air.org.fluidea.FlipIt.AppEntry.smali文件,還有一個com.adobe.ResourceMap.smali,看上去很像是一些類文件。Smali是Android程序的反編譯代碼,類似於一種中間代碼,雖然並不是源碼,但也是基於文本的。

AIR程序的運行流程

AppEntry是AIR SDK為每個AIR應用創建的主Activity,可以看作是一個外殼,用來檢測AIR runtime的狀態、啟動AIR Runtime、加載並運行主SWF文件。

Smali文件雖然可以讀,但語法很生澀,如果用反編譯工具比如dex2jar和jd-GUI來反編譯APK文件,就可以得到可讀性更強的Java源代碼。

下面是反編譯后AppEntry.java文件中的一段程序入口代碼:

public void onCreate(Bundle paramBundle) 
  { 
    super.onCreate(paramBundle); 
    long l = new Date().getTime(); 
    Log.i("StartupTime1", ":" + l); 
    boolean bool = loadCaptiveRuntimeClasses(); 
    if (!bool) 
      if ((!sRuntimeClassesLoaded) && (!isRuntimeInstalled())) 
        if (isRuntimeOnExternalStorage()) 
          showRuntimeOnExternalStorageDialog(); 
    while (true) 
    { 
      return; 
      showRuntimeNotInstalledDialog(); 
      continue; 
      loadSharedRuntimeDex(); 
      if (sRuntimeClassesLoaded) 
      { 
        createActivityWrapper(bool); 
        InvokeWrapperOnCreate(); 
      } 
      else if (bool) 
      { 
        KillSelf(); 
      } 
      else 
      { 
        launchAIRService(); 
      } 
    } 
  } 

雖然反編譯不能得到完全准確的代碼,但我們已經足以看清整個程序的運行流程。首先,程序啟動后會去檢測是否安裝了AIR Runtime,如果捆綁了AIR Runtime則使用自帶的庫,反之,提醒用戶安裝AIR Runtime;如果安裝了AIR Runtime,就去加載共享庫,也就是lib目錄下的libNativeABI.so庫,然后創建相關的服務,加載運行主SWF。

Ok,到這里為止,我們對AIR Android程序有了更深入的了解。知道這些,對AIR開發還是有很多幫助的,比如,如何實現AIR程序和外部程序的交互,如何從外部啟動AIR程序?AIR程序有怎么啟動其他程序?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM