日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

Android PAI (PlayAutoInstall)预装APK 功能

發(fā)布時(shí)間:2023/12/13 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android PAI (PlayAutoInstall)预装APK 功能 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近剛找到工作,是手機(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。