Android PAI (PlayAutoInstall)预装APK 功能
最近剛找到工作,是手機(jī)方案公司,剛接觸手機(jī)系統(tǒng)預(yù)裝的APP,以及解決方案MTK平臺(tái)下預(yù)裝APP的bug,也接觸到了Launcher的東西。
然后接觸到了第一個(gè)需求
PAI預(yù)裝APK功能
下面是我用到的帖子,也很感謝第一個(gè)博客主人,加了他QQ,問(wèn)了很多東西
https://blog.csdn.net/xct841990555/article/details/80896429
這個(gè)帖子可能配置方面更加詳細(xì)
http://wossoneri.github.io/2017/06/19/[Android][Framework]PlayAutoInstall/?tdsourcetag=s_pcqq_aiomsg
什么是PAI
PAI(PlayAutoInstall)是一個(gè)自動(dòng)下載安裝APK到手機(jī),并且擺放在Launcher對(duì)應(yīng)位置的一個(gè)機(jī)制。
因?yàn)閲?guó)內(nèi)沒(méi)有大湄公河次區(qū)域,所以很多人沒(méi)接觸過(guò)這個(gè)機(jī)制。這個(gè)機(jī)制其實(shí)對(duì)于運(yùn)營(yíng)商定制來(lái)說(shuō)非常重要,比如美國(guó)的運(yùn)營(yíng)商,一個(gè)運(yùn)營(yíng)商有很多地區(qū)很多種類的SIM卡,當(dāng)插上不同地區(qū)的SIM卡,運(yùn)營(yíng)商定制的手機(jī)就會(huì)下載不同的APP擺放在界面不同的位置。
其實(shí)主要是要兩個(gè)APK,一個(gè)預(yù)裝進(jìn)的Android系統(tǒng)中(stub.apk),一個(gè)上傳到谷歌的合作伙伴服務(wù)器網(wǎng)站上(配置),然后在合作伙伴上進(jìn)行一些配置就OK了。下面具體介紹這兩個(gè)APK的制作。
PAI流程
本地編譯一個(gè)PlayAutoInstallConfig.apk,簽名上傳到APFE服務(wù)器,APFE會(huì)驗(yàn)證配置信息,并提供給Play商店中。當(dāng)目標(biāo)設(shè)備第一次開(kāi)機(jī)啟動(dòng)并且聯(lián)網(wǎng)(現(xiàn)在不必要登錄谷歌帳號(hào)),這些應(yīng)用就會(huì)加入下載隊(duì)列,自動(dòng)下載到手機(jī)。
配置菜單
先聊一下APFE會(huì)驗(yàn)證的配置信息。
需要的配置信息包括:
指紋(必須)
城市(可選)
運(yùn)營(yíng)商(可選)
需要下載的應(yīng)用程序列表
應(yīng)用在桌面的位置信息
后兩項(xiàng)是編譯在PlayAutoInstallConfig.apk中的,前三項(xiàng)是把APK上傳到服務(wù)器時(shí)需要填寫(xiě)的。
上傳服務(wù)器配置頁(yè)面如下:
配置信息的前三項(xiàng)匹配項(xiàng)如果填寫(xiě),就必須要完全匹配才能應(yīng)用到手機(jī)。我遇到一個(gè)問(wèn)題是配置上傳后PlayAutoInstallConfig.apk會(huì)在設(shè)定精靈過(guò)程中下載到手機(jī),但需要Play商店中下載的應(yīng)用怎么都不下載。后來(lái)發(fā)現(xiàn)是在上傳APK到服務(wù)器時(shí)運(yùn)營(yíng)商填的不對(duì),導(dǎo)致無(wú)法下載。因?yàn)閲L試填寫(xiě)幾種運(yùn)營(yíng)商名稱都不能正常工作,最后解決方案是只匹配指紋,不匹配城市和運(yùn)營(yíng)商(減少過(guò)濾項(xiàng)),這樣手機(jī)就可以和Play商店中信息匹配,然后就可以自動(dòng)下載了。
關(guān)于其余配置,參考下面表格:
下面具體放代碼:分為2個(gè)APK,一個(gè)是預(yù)裝手機(jī)的APK(stub.apk)一個(gè)是放到服務(wù)器的APK(config.apk)
stub.apk
手機(jī)內(nèi)必須要先預(yù)置一個(gè)符合下列條件的stub APK:
為一個(gè)系列的設(shè)備設(shè)置唯一的包名,包名格式為android.autoinstalls.config ..
必須配置一個(gè)接收器“android.autoinstalls.config.action.PLAY_AUTO_INSTALL”,并且設(shè)置export for flase
在預(yù)置的應(yīng)用程序里只能有一個(gè)定義這個(gè)接收機(jī)
的versionCode必須定義成1
APK必須預(yù)置在/ system / app(不能定義成特權(quán),即不能放/ priv-app)
必須用私有密鑰簽名(汞用的TCL簽名)
不能定義權(quán)限/活動(dòng)/其他接收者/內(nèi)容提供者/服務(wù)
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
這個(gè)APK是我們真正配置的APK。
它和前面的APK的關(guān)系是:包名一致因?yàn)镻AI機(jī)制需要本地存在一個(gè)這個(gè)包名的APK,在開(kāi)機(jī)的設(shè)定精靈階段,(如果聯(lián)網(wǎng))它會(huì)從服務(wù)器下載這個(gè)寫(xiě)有對(duì)應(yīng)配置的APK到手機(jī)上,替換掉那個(gè)Stub APK。
關(guān)于PAIconfig APK的配置:
上傳的APK(也就是我們編出來(lái)的APK)包名與指紋要和存根一致
APK簽名要一致
和存根配置同樣的接收器
的versionCode必須大于1000
APK必須包含啟動(dòng)布局配置的XML文件(即后面會(huì)提到的default_layout),不然上傳會(huì)失敗,因?yàn)樯蟼髑皶?huì)檢查這個(gè)XML文件,然后會(huì)把要下載的應(yīng)用程序顯示出來(lái)。所以也必須要求至少定義一個(gè)需要下載的app。最多50個(gè),建議放10~15個(gè)。(文檔還要求autoinstall的應(yīng)用必須在launcher上指定擺放位置,目前看來(lái)是不需要的,有可能bb launcher做了修改)
界面會(huì)有文件夾,文件夾名稱字符串在APK本地資源定義,支持國(guó)際化。
需要自動(dòng)下載的APK對(duì)設(shè)備來(lái)講必須是在Play商店中發(fā)布的,并且對(duì)該地區(qū)用戶可見(jiàn)
不能定義權(quán)限/活動(dòng)/其他接收者/內(nèi)容提供者/服務(wù)
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,把他們的包名拿到,然后在這個(gè)文件中配置
<?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>
將配置上傳到服務(wù)器
下面我將代碼上傳到CSDN
猶豫我是系統(tǒng)預(yù)置,所以我是MK文件編譯。沒(méi)有Gradle,如果你們 要用gradle編譯,只需要把我的AndroidManifess.xml + res 這2個(gè)文件夾考入到你的項(xiàng)目
config + stub 里面都沒(méi)有 JAVA類
https://download.csdn.net/download/yangbin0513/10845496
驗(yàn)證流程
用一臺(tái)新手機(jī),插入對(duì)應(yīng)的SIM卡,你在服務(wù)器段,配置好,對(duì)應(yīng)的運(yùn)營(yíng)商,然后把APK燒錄到系統(tǒng)里面,恢復(fù)出廠設(shè)置,重新開(kāi)始,在過(guò)程中聯(lián)網(wǎng),登錄谷歌帳號(hào),進(jìn)入后在引導(dǎo)功能的時(shí)候,會(huì)出現(xiàn),你點(diǎn)選擇安裝,它就開(kāi)始下載了,等到進(jìn)入啟動(dòng)界面,啟動(dòng)器就會(huì)加載這個(gè)APK,
總結(jié)
以上是生活随笔為你收集整理的Android PAI (PlayAutoInstall)预装APK 功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: new函数
- 下一篇: 开通微众银行要收费吗?看完你就清楚了!