最近项目中要实现google 提供的接口功能,即PAI(play auto install)
PAI是一种自带下载安装APK到android系统上的一种机制。这种机制对于OEM定制是非常重要的。
我了解到的一般有两种,即android手机和androidTV。前者据说在外国比较常用,如外国有很多的运营商,一个运营商有很多地区很多种类的SIM卡,当用户插上不同地区的卡后,第一次开机,运营商则可以从后台为用户安装一些APK。还有就是Android TV,也是我这篇文章要说的,也类似与手机,只是没有SIM卡,也是针对不同区域的用户,去给用户在执行开机导航的过程总去推荐一些apk供用户选择安装。
其实主要是要两个apk,一个预装进android系统中(stub.apk),一个上传到谷歌的partner服务器网站上(config),然后在partner上进行一些配置就ok了。下面具体介绍这两个apk的制作。
其实,刚开始拿到谷歌的例子代码时,发现它就写了一个mk文件,可以直接编译两个,但是那会我对mk文件还不是太熟,一些变量还不是太了解,导致一直编译不过。最后通过各种手段终于变成功了。当然我也是在android源码中编译的。这样不但可以直接签名,还方便。
####### 预制进android中的stub.apk
先看看这个apk的目录结构,很简单,其实有用的就只有一个AndroidManifest.xml文件。
Android.mk文件(参考android源码中framework-res.apk的mk文件)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := stub-res
LOCAL_CERTIFICATE := platform(平台签名)
LOCAL_AAPT_FLAGS := -x
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
LOCAL_EXPORT_PACKAGE_RESOURCES := true
include $(BUILD_PACKAGE)
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.autoinstalls.config.OEM名.设备名"
android:versionCode="1"
android:versionName="1" >//versionCode和versionName一定要一样,并且为1
//后面不变
<application
android:allowBackup="false"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.autoinstalls.config.action.PLAY_AUTO_INSTALL" />
intent-filter>
receiver>
application>
manifest>
strings.xml
这个不用看吧,
<resources>
<string name="app_name">Device configurationstring>
resources>
####### 要上传服务器的config.apk
同样先看目录结构
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := config-res
LOCAL_CERTIFICATE := platform
LOCAL_AAPT_FLAGS := -x
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
LOCAL_EXPORT_PACKAGE_RESOURCES := true
include $(BUILD_PACKAGE)
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.autoinstalls.config.OEM名.设备名"
android:versionCode="1001"
android:versionName="1001" >
//一样为1001
<application
android:allowBackup="false"
android:label="@string/app_name" >
<receiver
android:name="DummyReceiver"
android:exported="false" >
<intent-filter>
<action android:name="android.autoinstalls.config.action.PLAY_AUTO_INSTALL" />
intent-filter>
receiver>
application>
manifest>
default_layout.xml
//选择要安装的apk,把他们的包名拿到,然后在这个文件中配置
<workspace>
<autoinstall
className="com.movenetworks.StartupActivity"
packageName="com.sling"
container="hotseat"
rank="1"
groupid="0"
requiredPreload="False"
installByDefault="true"
/>
<autoinstall
className="com.hulu.livingroomplus.MainActivity"
packageName="com.hulu.livingroomplus"
container="hotseat"
rank="0"
groupid="1"
requiredPreload="true" />
workspace>
auto.install.xml
<install>
<autoinstallgrouplist>
<installgroup groupId="0" type="GOOGLE" />
<installgroup groupId="1" type="OEM" />
autoinstallgrouplist>
install>
这个自己看谷歌的文档吧。