第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

【備戰(zhàn)春招】第2天 AppBundle動(dòng)態(tài)交付原理

標(biāo)簽:
Java Android Kotlin

程名称:移动端架构师

课程章节:新一代组件化动态化方案App Bundle

课程讲师:CrazyCodeBoy LovelyChubby

课程内容:

与Instant App不同,AppBundle是借助android 5.0的Split Apk能力完成动态加载的

App Bundles 将一个 apk 拆分成多个 apk,我们的 apk 一般会被拆分为如下几个部分:

  • Base Apk(基本apk): 包含了所有其他拆分APK都可以访问的公共代码和资源,所以其他的模块都基于Base,并提供应用的基本功能 。当用户请求下载您的应用时,会首先下载并安装该APK

  • Configuration APKs:(配置apk) native libraries 和适配当前手机屏幕分辨率的资源

  • Dynamic feature APKs(动态下发apk) 

       每个动态功能 APK 包含应用中的某项功能的代码和资源,可以理解为模块化

这个是在后面按需的时候才会下载安装,第一次下载不会

比如一些模块功能如拍照,第一次安装不会安装这个apk,后面唤起拍照页的时候才去下载

Split Apks的运作原理有点类似于Android的组件化,安装应用程序时,首先安装base apk,然后安装split apks。

打开ApplicationInfo类中,可以看到如下信息:


     /**
     * Full paths to zero or more split APKs that, when combined with the base
     * APK defined in {@link #sourceDir}, form a complete application.
     */
    public String[] splitSourceDirs;

    /**
     * Full path to the publicly available parts of {@link #splitSourceDirs},
     * including resources and manifest. This may be different from
     * {@link #splitSourceDirs} if an application is forward locked.
     */
    public String[] splitPublicSourceDirs;

LoadeApk中有PathClassLoaderResources创建过程。

LoadedApk#mClassLoader是PathClassLoader实例引用,接着看PathClassLoader的创建过程。

public ClassLoader getClassLoader() {
        synchronized (this) {
            if (mClassLoader != null) {
                return mClassLoader;
            }
            if (mIncludeCode && !mPackageName.equals("android")) {
                ......
                final ArrayList<String> zipPaths = new ArrayList<>();
                final ArrayList<String> libPaths = new ArrayList<>();
                .......

                zipPaths.add(mAppDir);
                //将split apk路径追加到zipPaths中
                if (mSplitAppDirs != null) {
                    Collections.addAll(zipPaths, mSplitAppDirs);
                }

                libPaths.add(mLibDir);
                final String zip = TextUtils.join(File.pathSeparator, zipPaths);
                final String lib = TextUtils.join(File.pathSeparator, libPaths);

                ......
                //如果mSplitAppDirs不为空,则zip将包含base app和split apps所有路径。split apps路径,
                mClassLoader = ApplicationLoaders.getDefault().getClassLoader(zip, lib,
                        mBaseClassLoader);
            } 
            return mClassLoader;
        }
    }

LoadedApk#mResources是Resources实例引用,Resources的源码如下:

可以发现:split apks资源路径(LoadedApk#mSplitResDirs)也会被增加至Resources中

public Resources getResources(ActivityThread mainThread) {
        if (mResources == null) {
            mResources = mainThread.getTopLevelResources(mResDir, mSplitResDirs, mOverlayDirs,
                    mApplicationInfo.sharedLibraryFiles, Display.DEFAULT_DISPLAY, null, this);
        }
        return mResources;
    }

课程收获:

谢谢老师,讲的非常细致,通俗易懂。这一节学的是AppBundle的动态加载原理,通过学习我了解AppBundle的Split Apk原理,给以后的学习打下了基础。
期待后边的学习




https://img1.sycdn.imooc.com/63e3acad000184a909300523.jpg

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
移動(dòng)開發(fā)工程師
手記
粉絲
0
獲贊與收藏
4

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消