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

AIR Android开发--APK结构详解相关推荐

  1. Android开发图标尺寸详解

    一.开发中的实际情况(促进理解): Android开发中一个很重要的组成,就是开发者和UI设计师的配合,这关乎到APP界面部分--吸引用户的直接手段,那么在实际开发中,开发者和设计师是如何配合的呢?第 ...

  2. Android开发之输入法详解

    输入法的例子和源代码看了不少时间了,看得头很晕,很郁闷.静下心来把整个代码想了一遍,其实大部分代码都在处理绘制界面,以及事件的处理,核心代码很少,都被底层封装得很完美了. 先看看一般输入法的界面: 分 ...

  3. Android开发 VideoView视频播放详解

    前言 VideoView是Android主要的视频播放View,它其实是对MediaPlayer的再次封装.如果你已经了解过MediaPlayer在使用VideoView是十分简单的.如果你想先了解M ...

  4. Android开发——Snackbar使用详解

    Snackbar是Android支持库中用于显示简单消息并且提供和用户的一个简单操作的一种弹出式提醒.当使用Snackbar时,提示会出现在消息最底部,通常含有一段信息和一个可点击的按钮.下图是Gma ...

  5. Android系统目录结构详解

    Android系统基于linux内核.JAVA应用,算是一个小巧精致的系统.虽是开源,但不像Linux一般庞大,娇小可亲,于是国内厂商纷纷开发出自己基于Android的操作系统.在此呼吁各大厂商眼光放 ...

  6. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  7. Android网络开发技术实战详解

    <Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...

  8. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  9. android应用市场点击下载APK安装详解

    Android系统启动篇 1,<android系统启动流程简介> 2,<android init进程启动流程> 3,<android zygote进程启动流程> 4 ...

最新文章

  1. 为放大器模拟输入模块提供可靠的输入过电压保护
  2. iOS-UIViewController视图控制器跳转界面的几种常用方法
  3. VTK:可视化之QuadricVisualization
  4. 5.由键盘任意输入1个整形数据(小于10亿,位数不限),将其倒置,如:输入12345,则输出54321。
  5. java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2
  6. 【转】Linux的五个查找命令:find,locate,whereis,which,type
  7. 【图像处理基础知识】-傅里叶变换
  8. Humble Numbers(丑数) 超详解!
  9. Python使用combinations实现排列组合
  10. 【Android Jetpack】Room——基本使用篇
  11. 欢迎大家加入我的Q群
  12. html中的字体样式
  13. 实现Linux与windows文件互传
  14. 为何moov头在尾部的mp4可以快速播放、拖动
  15. 为什么有些人说单片机简单,我学起来这么吃力?
  16. 【SpringBoot】50、SpringBoot为Redis的key加上前缀
  17. 将java文件打成jar包
  18. 基于Java毕业设计新城街道社区的健康档案管理平台源码+系统+mysql+lw文档+部署软件
  19. mysql ansi nulls_sql server 的ANSI_NULLS设置
  20. myplay.pif、winsys16.dll、scrsys16.dll和AlxRes.exe的分析与解决

热门文章

  1. 洛谷——P1427 小鱼的数字游戏
  2. 定位叠放次序z-index(HTML、CSS)
  3. html2canvas在iphone7 iphonex都生成不了
  4. 四个数据欧几里得距离_从单词嵌入到文档距离 :WMD一种有效的文档分类方法...
  5. 在计算机中 ascii码是几位二进制编码,ASCII码采用多少位二进制编码
  6. sql同时修改两个表的数据_如何用SQL做数据透视表?
  7. 整理Java基础知识--Date Time2
  8. 计算机主机安装,解决方案:说明的计算机主机安装过程_IT /计算机_信息
  9. mysql查询重复用户名_mysql取出以上用户名(去除重复),score值最高的所有记录,查出重复记录...
  10. 【编译原理笔记17】代码优化:数据流分析,到达定值分析,到达定值方程的计算