最近刚找到工作,是手机方案公司,刚接触手机系统预装的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文件的代码

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_PACKAGE_NAME := LavaPAIStub
  4. LOCAL_CERTIFICATE := platform
  5. LOCAL_SDK_VERSION := current
  6. LOCAL_AAPT_FLAGS := -x
  7. LOCAL_MODULE_TAGS := optional
  8. LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
  9. LOCAL_EXPORT_PACKAGE_RESOURCES := true
  10. LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
  11. include $(BUILD_PACKAGE)

AndroidManifest.xml中

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="android.autoinstalls.config.lava.A5s"
  4. android:versionCode="1"
  5. android:versionName="1">//versionCode和versionName一定要一样,并且为1
  6. //后面不变
  7. <application
  8. android:allowBackup="false"
  9. android:label="@string/app_name" >
  10. <receiver
  11. android:name="DummyReceiver"
  12. android:exported="false" >
  13. <intent-filter>
  14. <action android:name="android.autoinstalls.config.action.PLAY_AUTO_INSTALL" />
  15. </intent-filter>
  16. </receiver>
  17. </application>
  18. </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商店中发布的,并且对该地区用户可见
  • 不能定义权限/活动/其他接收者/内容提供者/服务

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_PACKAGE_NAME := LavaPAIConfig
  4. LOCAL_CERTIFICATE := platform
  5. LOCAL_SDK_VERSION := current
  6. LOCAL_AAPT_FLAGS := -x
  7. LOCAL_MODULE_TAGS := optional
  8. LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
  9. LOCAL_EXPORT_PACKAGE_RESOURCES := true
  10. LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
  11. include $(BUILD_PACKAGE)

AndroidManifest.xml中

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="android.autoinstalls.config.lava.A5s"
  4. android:versionCode="1001"
  5. android:versionName="1001">
  6. <application
  7. android:allowBackup="false"
  8. android:label="@string/app_name" >
  9. <receiver
  10. android:name="DummyReceiver"
  11. android:exported="false" >
  12. <intent-filter>
  13. <action android:name="android.autoinstalls.config.action.PLAY_AUTO_INSTALL" />
  14. </intent-filter>
  15. </receiver>
  16. </application>
  17. </manifest>

default_layout.xml 
//选择要安装的apk,把他们的包名拿到,然后在这个文件中配置

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <workspace>
  3. <autoinstall
  4. packageName="com.twitter.android"
  5. className="com.twitter.android.StartActivity"
  6. screen="1"
  7. x="0"
  8. y="0"
  9. groupid="0"
  10. requiredPreload="true"
  11. installByDefault="true" />
  12. <autoinstall
  13. packageName="com.instagram.android"
  14. className="com.instagram.android.activity.MainTabActivity"
  15. screen="1"
  16. x="1"
  17. y="0"
  18. groupid="1"
  19. requiredPreload="true"
  20. installByDefault="true" />
  21. <autoinstall
  22. packageName="com.whatsapp"
  23. className="com.whatsapp.Main"
  24. screen="1"
  25. x="2"
  26. y="0"
  27. groupid="1"
  28. requiredPreload="true"
  29. installByDefault="true" />
  30. </workspace>

auto.install.xml

  1. <install>
  2. <!-- Group Index Mapping -->
  3. <autoinstallgrouplist>
  4. <installgroup groupId="0" type="GOOGLE" />
  5. <installgroup groupId="1" type="OEM" />
  6. </autoinstallgrouplist>
  7. </install>

将配置上传到服务器

下面我将代码上传到CSDN

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

config + stub 里面都没有 JAVA类

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

验证流程

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

Android PAI (PlayAutoInstall)预装APK 功能的更多相关文章

  1. Android系统使用Shell脚本预装apk

    客户需求:需要在Android系统预安装一个或者若干个apk,客户可以选择自行卸载并且卸载后系统再次启动并不会再次自动安装. 考虑到需要批量安装应用,我这里考虑到使用灵活的shell脚本.shell脚 ...

  2. Android动态方式破解apk终极篇(加固apk破解方式)

    一.前言 今天总算迎来了破解系列的最后一篇文章了,之前的两篇文章分别为: 第一篇:如何使用Eclipse动态调试smali源码 第二篇:如何使用IDA动态调试SO文件 现在要说的就是最后一篇了,如何应 ...

  3. android应用分析之apk文件结构

            实际上,一个APK文件就是一个.zip格式的压缩包,我们可以用解压缩工具打开任何一个APK文件,由于代码混淆和加密,通过普通解压缩工具打开里面的文件或目录会看到各种乱码.一个典型的ap ...

  4. 如何给你的Android 安装文件(APK)瘦身

    如何给你的Android 安装文件(APK)瘦身 本文翻译自:Putting Your APKs on Diet           原作者:Cyril Mottier Android的apk文件越来 ...

  5. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  6. Android Studio 中修改Apk名称

    修改生成的apk名称,并且使调试时也可以使用. 在app->build.gradle 中增加以下内容: android.applicationVariants.all { variant-> ...

  7. Android O 正式版新功能

    ref: Android O新特性和行为变更总结zzhttp://www.cnblogs.com/bluestorm/p/7148134.html Android O正式版带来了诸多新功能,如Tens ...

  8. mtk预装apk 方案公司内置预装apk

    mtk预装apk 方案公司内置预装apk 韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha == MTK 预知第三方的APK 流程_yua ...

  9. 怎样给你的Android 安装文件(APK)瘦身

    本文源地址:怎样给你的Android 安装文件(APK)瘦身 Android的apk文件越来越大了这已经是一个不争的事实. 在Android 还是最初版本号的时候,一个app的apk文件大小也还仅仅有 ...

随机推荐

  1. [Swift]LeetCode406. 根据身高重建队列 | Queue Reconstruction by Height

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

  2. linux入门--类UNIX系统详解

    有人说,这个世界上只有两种操作系统: UNIX 和类 UNIX 操作系统: 其它操作系统. 类 UNIX 系统(英文 Unix-like)既包括各种传统的 UNIX 系统,比如 FreeBSD.Ope ...

  3. AES,DES加密JS源文件及其使用方法

    源文件地址:https://github.com/dididi1234/crypto 进入之后直接下载CryptoJS.js,js中直接引用,小程序也一样可以使用 具体使用方法和vue中的Crypto ...

  4. Ubuntu12.04下安装NS3.25

    实验室项目的需求,要使用到NS3做仿真,使用实验室的电脑,Ubuntu12.04,版本比较低,建议大家使用16.04,这样安装依赖文件时不会出现版本过低的问题 (没管最后也安装成功了).下面就安装步骤 ...

  5. webdav 概览

    webdav 概览 WebDav(Web Distributed Authoring and Versioning) 是一个控制远端Web资源的协议,它基于HTTP1.1.它的定义在RFC 4918( ...

  6. 初学Java Web(8)——过滤器和监听器

    什么是过滤器 过滤器就是 Servlet 的高级特性之一,就是一个具有拦截/过滤功能的一个东西,在生活中过滤器可以是香烟滤嘴,滤纸,净水器,空气净化器等,在 Web 中仅仅是一个实现了 Filter ...

  7. 你真的会PHP吗?

    Note: 1) PHP中的数据类型 PHP一共支持八种数据类型, 4种标量类型,boolean(布尔型),integer(整形),float/double(浮点型)和string(字符串类型), 2 ...

  8. [十五]java.math包简介,RoundingMode与MathContext

    java.math包提供了java中的数学类 包括基本的浮点库.复杂运算以及任意精度的数据运算   '可以看得到,主要包括三个类一个枚举 BigDecimal和BigInteger接下来会详细介绍 先 ...

  9. Spring Boot 2.x (十五):Dubbo + Zookeeper + 新版Dubbo Admin

    Dubbo 简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成. 它提供了三大核心能力: 面向接口的远程 ...

  10. Spring基础系列-容器启动流程(1)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9870339.html 概述 ​ 我说的容器启动流程涉及两种情况,SSM开发模式和Spri ...