Android TV PAI功能的接口实现

最近项目中要实现google 提供的接口功能,即PAI(play auto install)

什么是PAI

PAI是一种自带下载安装APK到android系统上的一种机制。这种机制对于OEM定制是非常重要的。
我了解到的一般有两种,即android手机和androidTV。前者据说在外国比较常用,如外国有很多的运营商,一个运营商有很多地区很多种类的SIM卡,当用户插上不同地区的卡后,第一次开机,运营商则可以从后台为用户安装一些APK。还有就是Android TV,也是我这篇文章要说的,也类似与手机,只是没有SIM卡,也是针对不同区域的用户,去给用户在执行开机导航的过程总去推荐一些apk供用户选择安装。

谷歌的PAI流程

这里写图片描述
这里写图片描述

其实主要是要两个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

<?xml version="1.0" encoding="utf-8"?>
<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" >
        <receiver
            android:name="DummyReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.autoinstalls.config.action.PLAY_AUTO_INSTALL" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

strings.xml
这个不用看吧,

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Device configuration</string>
</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

<?xml version="1.0" encoding="utf-8"?>
<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,把他们的包名拿到,然后在这个文件中配置

<?xml version="1.0" encoding="utf-8"?>
<workspace>
    <!-- Apps -->
    <!-- Sling Television -->
    <autoinstall
        className="com.movenetworks.StartupActivity"
        packageName="com.sling"
        container="hotseat"
        rank="1"
        groupid="0"
        requiredPreload="False"
        installByDefault="true"
    />
    <!-- Hulu Plus -->
    <autoinstall
        className="com.hulu.livingroomplus.MainActivity"
        packageName="com.hulu.livingroomplus"
        container="hotseat"
        rank="0"
        groupid="1"
        requiredPreload="true" />
</workspace>

auto.install.xml

<install>
    <!-- Group Index Mapping -->
    <autoinstallgrouplist>
        <installgroup groupId="0" type="GOOGLE" />
        <installgroup groupId="1" type="OEM" />
    </autoinstallgrouplist>
</install>
将config上传到服务器

这个自己看谷歌的文档吧。

猜你喜欢

转载自blog.csdn.net/xct841990555/article/details/80896429