守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1220|回复: 0

[移动平台] AIR Android开发--APK结构详解

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51784
    钢镚
    1422

    开源英雄守望者

    发表于 2015-4-11 15:54:18 | 显示全部楼层 |阅读模式

    转自: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是程序描述文件,包含了程序的重要信息:

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <manifest android:versionCode="1000" android:versionName="@string/app_version" android:installLocation="auto" package="air.org.fluidea.FlipIt"
    3.   xmlns:android="http://schemas.android.com/apk/res/android">
    4.     <application android:label="@string/app_name" android:icon="@drawable/icon" android:hardwareAccelerated="true">
    5.         <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">
    6.             <intent-filter>
    7.                 <action android:name="android.intent.action.MAIN" />
    8.                 <category android:name="android.intent.category.LAUNCHER" />
    9.             </intent-filter>
    10.             <meta-data android:name="fullScreen" android:value="true" />
    11.             <meta-data android:name="uniqueappversionid" android:value="93897e31-13cd-4501-8f60-cc80412af678" />
    12.             <meta-data android:name="initialcontent" android:value="FlipIt.swf" />
    13.         </activity>
    14.     </application>
    15.     <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="14" />
    16.     <uses-permission android:name="android.permission.INTERNET" />
    17. </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文件中的一段程序入口代码:
    1. public void onCreate(Bundle paramBundle)
    2.   {
    3.     super.onCreate(paramBundle);
    4.     long l = new Date().getTime();
    5.     Log.i("StartupTime1", ":" + l);
    6.     boolean bool = loadCaptiveRuntimeClasses();
    7.     if (!bool)
    8.       if ((!sRuntimeClassesLoaded) && (!isRuntimeInstalled()))
    9.         if (isRuntimeOnExternalStorage())
    10.           showRuntimeOnExternalStorageDialog();
    11.     while (true)
    12.     {
    13.       return;
    14.       showRuntimeNotInstalledDialog();
    15.       continue;
    16.       loadSharedRuntimeDex();
    17.       if (sRuntimeClassesLoaded)
    18.       {
    19.         createActivityWrapper(bool);
    20.         InvokeWrapperOnCreate();
    21.       }
    22.       else if (bool)
    23.       {
    24.         KillSelf();
    25.       }
    26.       else
    27.       {
    28.         launchAIRService();
    29.       }
    30.     }
    31.   }
    复制代码
    虽然反编译不能得到完全准确的代码,但我们已经足以看清整个程序的运行流程。首先,程序启动后会去检测是否安装了AIR Runtime,如果捆绑了AIR Runtime则使用自带的库,反之,提醒用户安装AIR Runtime;如果安装了AIR Runtime,就去加载共享库,也就是lib目录下的libNativeABI.so库,然后创建相关的服务,加载运行主SWF。Ok,到这里为止,我们对AIR Android程序有了更深入的了解。知道这些,对AIR开发还是有很多帮助的,比如,如何实现AIR程序和外部程序的交互,如何从外部启动AIR程序?AIR程序有怎么启动其他程序?


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-15 23:24 , Processed in 0.064254 second(s), 36 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表