• Android PAI (PlayAutoInstall)预装APK 功能


    最近刚找到工作,是手机方案公司,刚接触手机系统预装的APP,以及解决方案MTK平台下预装APP的bug,也接触到了Launcher的东西。

    然后接触到了第一个需求

    PAI预装APK功能

    下面是我用到的帖子,也很感谢第一个博客主人,加了他QQ,问了很多东西

    https://blog.csdn.net/xct841990555/article/details/80896429#commentsedit

    这个帖子可能配置方面更加详细

    http://wossoneri.github.io/2017/06/19/[Android][Framework]PlayAutoInstall/?tdsourcetag=s_pcqq_aiomsg

    什么是PAI

    PAI(PlayAutoInstall)是一个自动下载安装APK到手机,并且摆放在Launcher对应位置的一个机制。

    因为国内没有大湄公河次区域,所以很多人没接触过这个机制。这个机制其实对于运营商定制来说非常重要,比如美国的运营商,一个运营商有很多地区很多种类的SIM卡,当插上不同地区的SIM卡,运营商定制的手机就会下载不同的APP摆放在界面不同的位置。

    其实主要是要两个APK,一个预装进的Android系统中(stub.apk),一个上传到谷歌的合作伙伴服务器网站上(配置),然后在合作伙伴上进行一些配置就OK了。下面具体介绍这两个APK的制作。

     

    PAI流程

    本地编译一个PlayAutoInstallConfig.apk,签名上传到APFE服务器,APFE会验证配置信息,并提供给Play商店中。当目标设备第一次开机启动并且联网(现在不必要登录谷歌帐号),这些应用就会加入下载队列,自动下载到手机。

    配置菜单

    先聊一下APFE会验证的配置信息。

    需要的配置信息包括:

    • 指纹(必须)
    • 城市(可选)
    • 运营商(可选)
    • 需要下载的应用程序列表
    • 应用在桌面的位置信息

    后两项是编译在PlayAutoInstallConfig.apk中的,前三项是把APK上传到服务器时需要填写的。

    上传服务器配置页面如下:

    配置信息的前三项匹配项如果填写,就必须要完全匹配才能应用到手机。我遇到一个问题是配置上传后PlayAutoInstallConfig.apk会在设定精灵过程中下载到手机,但需要Play商店中下载的应用怎么都不下载。后来发现是在上传APK到服务器时运营商填的不对,导致无法下载。因为尝试填写几种运营商名称都不能正常工作,最后解决方案是只匹配指纹,不匹配城市和运营商(减少过滤项),这样手机就可以和Play商店中信息匹配,然后就可以自动下载了。

    关于其余配置,参考下面表格:

    下面具体放代码:分为2个APK,一个是预装手机的APK(stub.apk)一个是放到服务器的APK(config.apk)

    stub.apk

    手机内必须要先预置一个符合下列条件的stub APK:

    • 为一个系列的设备设置唯一的包名,包名格式为android.autoinstalls.config ..
    • 必须配置一个接收器“android.autoinstalls.config.action.PLAY_AUTO_INSTALL”,并且设置export for flase
    • 在预置的应用程序里只能有一个定义这个接收机
    • 的versionCode必须定义成1
    • APK必须预置在/ system / app(不能定义成特权,即不能放/ priv-app)
    • 必须用私有密钥签名(汞用的TCL签名)
    • 不能定义权限/活动/其他接收者/内容提供者/服务
    •  

    è¿éåå¾çæè¿°

    MK文件的代码

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_PACKAGE_NAME := LavaPAIStub
    LOCAL_CERTIFICATE := platform
    LOCAL_SDK_VERSION := current
    LOCAL_AAPT_FLAGS := -x
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
    LOCAL_EXPORT_PACKAGE_RESOURCES := true
    LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
    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.lava.A5s"
        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>

    config.apk

    这个APK是我们真正配置的APK。

    它和前面的APK的关系是:包名一致因为PAI机制需要本地存在一个这个包名的APK,在开机的设定精灵阶段,(如果联网)它会从服务器下载这个写有对应配置的APK到手机上,替换掉那个Stub APK。

    关于PAIconfig APK的配置:

    • 上传的APK(也就是我们编出来的APK)包名与指纹要和存根一致
    • APK签名要一致
    • 和存根配置同样的接收器
    • 的versionCode必须大于1000
    • APK必须包含启动布局配置的XML文件(即后面会提到的default_layout),不然上传会失败,因为上传前会检查这个XML文件,然后会把要下载的应用程序显示出来。所以也必须要求至少定义一个需要下载的app。最多50个,建议放10~15个。(文档还要求autoinstall的应用必须在launcher上指定摆放位置,目前看来是不需要的,有可能bb launcher做了修改)
    • 界面会有文件夹,文件夹名称字符串在APK本地资源定义,支持国际化。
    • 需要自动下载的APK对设备来讲必须是在Play商店中发布的,并且对该地区用户可见
    • 不能定义权限/活动/其他接收者/内容提供者/服务

    è¿éåå¾çæè¿°

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_PACKAGE_NAME := LavaPAIConfig
    LOCAL_CERTIFICATE := platform
    LOCAL_SDK_VERSION := current
    LOCAL_AAPT_FLAGS := -x
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
    LOCAL_EXPORT_PACKAGE_RESOURCES := true
    LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
    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.lava.A5s"
        android:versionCode="1001"
        android:versionName="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>
        <autoinstall
            packageName="com.twitter.android"
            className="com.twitter.android.StartActivity"
            screen="1"
            x="0"
            y="0"
            groupid="0"
            requiredPreload="true"
            installByDefault="true" />
    
        <autoinstall
            packageName="com.instagram.android"
            className="com.instagram.android.activity.MainTabActivity"
            screen="1"
            x="1"
            y="0"
            groupid="1"
            requiredPreload="true"
            installByDefault="true" />
            
        <autoinstall
            packageName="com.whatsapp"
            className="com.whatsapp.Main"
            screen="1"
            x="2"
            y="0"
            groupid="1"
            requiredPreload="true"
            installByDefault="true" />
    </workspace>

    auto.install.xml

    <install>
        <!-- Group Index Mapping -->
        <autoinstallgrouplist>
            <installgroup groupId="0" type="GOOGLE" />
            <installgroup groupId="1" type="OEM" />
        </autoinstallgrouplist>
    </install>
     

    将配置上传到服务器

    下面我将代码上传到CSDN

    犹豫我是系统预置,所以我是MK文件编译。没有Gradle,如果你们 要用gradle编译,只需要把我的AndroidManifess.xml + res 这2个文件夹考入到你的项目

    config + stub 里面都没有 JAVA类

    https://download.csdn.net/download/yangbin0513/10845496 

    验证流程

    用一台新手机,插入对应的SIM卡,你在服务器段,配置好,对应的运营商,然后把APK烧录到系统里面,恢复出厂设置,重新开始,在过程中联网,登录谷歌帐号,进入后在引导功能的时候,会出现,你点选择安装,它就开始下载了,等到进入启动界面,启动器就会加载这个APK,

  • 相关阅读:
    .net中的正则表达式使用高级技巧 (二)
    经典的LZW算法C语言实现
    .net中的正则表达式使用高级技巧
    Atlas应用程序调试技巧
    从毕业到现在是如何走来的!!!
    关于JS的一些实际问题
    js学习笔记(十四)事件处理模型
    js学习笔记(十一)窗口和框架
    关于css的一些问题
    浏览器布局BUG汇总
  • 原文地址:https://www.cnblogs.com/codeking100/p/10382900.html
Copyright © 2020-2023  润新知