`

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程序有怎么启动其他程序?

分享到:
评论

相关推荐

    android开发,给apk授予系统权限

    在Android开发中,给APK授予系统权限是一个高级且关键的操作,主要针对那些需要访问受保护的硬件接口、操作系统服务或者需要在系统层面上运行的应用。这类应用通常用于设备定制、系统工具或需要深度集成的解决方案。...

    基于android系统的air程序开发

    ### 基于Android系统的AIR程序开发 #### 一、概览 Adobe AIR(Adobe Integrated Runtime)是一款由Adobe系统公司开发的跨平台运行环境,它允许开发者使用HTML、JavaScript、Flash以及Flex等技术来构建原生应用。...

    Air for android 本机扩展,调节亮度示例

    《Air for Android 本机扩展:调节亮度示例详解》 在移动开发领域,Adobe Air 提供了一种跨平台的解决方案,使得开发者可以使用Flash或ActionScript技术开发Android应用。本篇文章将深入探讨如何利用Air for ...

    Android开发的DLNA介绍

    ### Android开发中的DLNA技术详解 #### 一、DLNA简介及原理 **DLNA**,全称为**Digital Living Network Alliance**(数字生活网络联盟),它是一个由多家公司组成的协会,旨在建立一套标准来实现不同电子设备之间...

    安卓12 -高通-OTA-AB升级相关信息.zip

    【安卓12 高通OTA AB升级详解】 在Android操作系统的发展历程中,版本迭代一直扮演着重要的角色。这里我们关注的是“安卓12”,它带来了许多性能优化和新特性,旨在提升用户体验。对于设备制造商和开发者来说,尤其...

    armeabi-v7a与armeabi的区别

    例如,在Adobe AIR这样的平台上打包APK时,调试模式通常会选择`armeabi`模式以保证兼容性,而在发行模式下则倾向于使用`armeabi-v7a`以获得更好的性能表现。 #### NEON技术介绍 除了`armeabi`和`armeabi-v7a`之外...

    Dialog SUOTA软件

    **Dialog SUOTA软件详解** Dialog SUOTA(Software Update Over The Air)是一款专为安卓设备设计的空中升级软件工具。它允许用户通过无线网络对设备进行系统更新,无需连接电脑或其他物理媒介,极大地提高了更新的...

    U3D调用AS3.5.rar

    通过Adobe AIR,我们可以将AS3.5应用打包成Android APK,使得U3D与AS3.5在同一设备上运行。在U3D中,我们可以利用Unity插件系统,如Unity插件“Unity3D-Android-Plugin”,来调用Android原生API,进一步调用运行在...

    dialog 官方提供 DA14580 OTA 升级 APK 和 APP 源码

    OTA(Over-The-Air)升级是针对这类设备的一种无线固件更新技术,使得用户无需通过物理连接即可对设备进行软件更新,极大地提高了便利性和灵活性。在这个特定的压缩包中,Dialog官方提供了针对DA14580芯片的OTA升级...

    AmoBleOad-v1.0.rar

    《CC2541 OTA空中升级技术详解及实践》 在物联网(IoT)领域,无线传感器网络(Wireless Sensor Networks, WSNs)的应用日益广泛,其中BLE(Bluetooth Low Energy)技术因其低功耗特性成为众多设备通信的首选。CC2541是一...

    RBOX SDK编译方法.pdf

    ### RBOX SDK 编译方法详解 #### 一、概览 本文档旨在详细介绍RBOX SDK的编译方法,特别是如何生成完整的升级包。RBOX SDK主要用于Rockchip平台的设备,例如基于RK29系列芯片的产品。升级包的生成对于设备的OTA...

    电脑投电视AirPinPcSetup

    DLNA主要关注媒体文件的共享,而AirPlay是Apple公司开发的专有协议,主要用于苹果设备间的屏幕镜像。AirPin作为跨平台的解决方案,同时支持这两种协议,为非苹果设备用户提供了一种方便的无线投屏方式。 此外,为了...

    FAQ_ 关于BlueNRG-12 OTA的流程与优化v1_41

    【BlueNRG-1/2 OTA 流程与优化详解】 OTA(Over-the-Air)是一种无线更新固件的技术,常用于物联网设备如BlueNRG-1/2芯片的升级。BlueNRG-1/2提供了多种OTA升级方式,包括通过BootLoader的OTA Reset Manager、OTA ...

    AllPushD1产品使用指南miracast.pptx

    对于Android 4.1及以上版本或部分品牌设备,如果未显示图标,可能需要安装UPnP客户端APK。而对于Apple的iPhone和iPad,用户在观看照片、视频或播放音乐时,如果看到相应的推送图标,点击并选择AllPush-xxxx即可开始...

    安卓软件天天投屏 v9.18.rar

    3. **安卓应用APK**:APK是Android Package的缩写,是安卓系统安装应用程序的标准格式,用户可以直接下载APK并安装,但需注意来源安全,以防恶意软件。 4. **软件版本管理**:版本号如v9.18表示软件迭代的历程,...

Global site tag (gtag.js) - Google Analytics