1.1.1 实验原理 Android应用可以安装在开发板自带emmc中,同时也可以安装到外部存储器,如SD卡上。自从API 8后也就是Android2.2后,我们就能将APK安装到外部存储上。这是一个可选的特性,在工程的AndroidManifest.xml文件中可以进行配置。我们需要添加android:installLocation的属性,它可以被设置为preferExternal,auto或internalOnly三种方式。 auto:程序可能被安装在外部存储介质上(例如:SD Card),但是默认会被安装到开发板内部存储器中。当开发板内部存储器为空时,程序将被安装到外部存储介质上。 internalOnly:默认值。当设置为该值时,程序只能被安装在内部存储介质中。如果内部存储器空间已满,则程序将不能成功安装。 preferExternal:将程序安装在外部存储介质上。但是系统不保证程序一定会被安装到外部存储介质上。当外部存储介质已满或空时,程序将被安装到内存中。程序使用了for ward-locking机制时也将被安装到内部存储介质中,因为外部存储不支持此机制。程序安装后,用户可以自由切换程序应该在外部还是内部存储介质上。 注意:当程序使用了Google Play的Copy Protection特性时,只能安装到内部存储介质中。 当程序被安装到外部存储介质时,存在如下特性: l .apk文件将被移动到外部存储介质上,但是程序的数据仍然会在内存中; l 保存.apk文件的容器将会使用一个随机生成的密钥进行加密,这样只有安装该程序的设备可以使用存在外部存储介质上的数据; l 当外部存储介质被卸载时,安装在该外部存储介质上的程序将立刻被终止掉。 当我们的程序具有如下行为时不应该将程序安装到外部存储介质上: ① Service 正在运行的服务将被终止,当外部存储介质被重新加载时服务不会被重启。 ② Alarm Service 闹钟服务将被取消,开发者必须在外部存储介质重新加载后重新注册闹钟服务。 ③ Input Method Engines 输入法将被换成系统输入法。当外部存储介质被重新加载后用户可以通过系统设置来启动我们的输入法。 ④ Live Wallpapers 动态壁纸将被替换为默认的动态壁纸。外部存储介质重载后,用户可以更换回来。 ⑤ Live Folders 动态文件夹将被移出。 ⑥ App Widgets 小部件将被移出,通常只有系统重启后我们的小部件才可用。 ⑦ Account Managers 使用AccountManager创建的账户将会消失,直至存储介质被重新加载。 ⑧ Sync Adapters 只有外部存储介质被重新加载时,同步功能才可用 ⑨ Device Administrators DeviceAdminReceiver将会失效。 ⑩ 监听开机结束事件 系统会在加载外部存储介质之前发送ACTION_BOOT_COMPLETED广播。因此安装在外部存储介质的程序将不能接受开机广播。 通常,只要我们没有使用上述的特性,就可以将程序安装到外部存储介质上。例如大的游戏程序。当APK文件有几M大时我们应该认真的考虑是否要将程序移动到外部存储介质上以帮助用户节省内存。 1.1.2 实验目的将上一实战的X210LogDemo.apk应用程序安装到x210开发板的外部SD卡上运行。 1.1.3 实验步骤1. 修改AndroidManifest.xml文件使用eclipse打开X210LogDemo工程,双击左侧的AndroidManifest.xml文件,弹出如下界面:
可以看到,在ManifestGeneral Attributes一栏,有一个Install location属性。点击下拉箭头,会有auto,internalOnly以及preferExternal三个选项。这里我们选择preferExternal,点击下面的AndroidManifest.xml栏,进入源码编辑界面,可以看到,源码中已经添加了android:installLocation的属性,如下: - <p class="a"><span lang="EN-US"><manifest
- xmlns:android="http://schemas.android.com/apk/res/android"</span></p>
- <p class="a"><span lang="EN-US">
- package="com.x210.x210logdemo"</span></p>
- <p class="a"><span lang="EN-US">
- android:versionCode="1"</span></p>
- <p class="a"><span lang="EN-US">android:versionName="1.0"
- android:installLocation="preferExternal"></span></p>
复制代码1. 添加内核必要的驱动 编辑x210 android4.0的内核配置文件x210_android_inand_defconfig,确保以下配置被设置为真: - <p class="a"><span lang="EN-US">CONFIG_MD=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_BLK_DEV_DM=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_DM_DEBUG=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_DM_CRYPT=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_DM_UEVENT=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_AEAD=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_AUTHENC=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_CBC=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_PCBC=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_HMAC=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_MD5=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_DES=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_TWOFISH=y</span></p>
- <p class="a"><span lang="EN-US">CONFIG_CRYPTO_TWOFISH_COMMON=y</span></p>
复制代码 也可以直接替换成以下配置文件:
重新编译内核,更新内核到开发板,查看新增加的dm驱动设备节点,如下图所示:
这时该设备节点是没有权限访问的,我们需要在init.rc脚本里面修改它的权限。脚本路径: device/samsung/x210/init.rc 添加内容: chmod 0666 /dev/device-mapper 再重新编译文件系统和内核,更新开发板的内核即可。这里涉及如何更新init.rc的技巧,如果本章节无法理解,下一章节我们将详细描述修改原理和步骤。 1. 将APK文件下载到开发板的外部SD卡运行在eclipse下选中X210LogDemo工程,点击run->run as->androidapplication,选择开发板,程序就在开发板上运行起来了。为了确认应用程序的存储位置,点击设置->应用程序,可以看到如下界面:
再点击“SD卡中”一栏,
可以看到,应用程序确实已经被放在SD卡中了。我们可以点击上面的X210LogDemo图标,进一步确认:
这里有一个“移至平板电脑”的图标,说明目前应用程序存在SD卡中,同时,也说明当我们将应用程序安装到SD卡中之后,我们可以在这里点击“移至平板电脑”,将APK应用程序移至开发板的内部存储介质上。
|