Android新技术------Android App Bund

作者: Android架构师丨小熊 | 来源:发表于2019-08-01 21:54 被阅读32次

    背景

    随着应用不断演化,功能越来越复杂,且应用针对不同屏幕设备、不同国家语言资源都打包在同一个App,导致应用包不断增大,据统计自2012年以来应用包大小增长5倍。虽然现在手机的存储空间越来越大,但用户照片、视频等媒体文件品质在逐渐提升,导致设备可用空间逐渐紧缩。

    为此Google在去年Google I/O大会讲述Android引入新的App动态化框架(即Android App Bundle,缩写为AAB)。利用Split Apk完成动态加载,使用AAB动态下发方式,可显著缩小应用体积,减少对存储空间的占用。

    什么是Android APP Bundles

    一个Android应用程序包,包括所有程序的编译代码和资源,但推迟APK的生成。该程序包在安装时可以根据用户设备的屏幕分辨率、cpu架构以及语言为其生成特定的apk,而不用将所有的资源文件包含在apk中,有效减少apk的大小。

    Android App Bundle是扩展名为.abb的文件

    [图片上传中...(image-8e7c85-1564667285377-4)]

    base/:应用程序的基本模块始终包含在base应用程序包的目录中 
    res/,lib/和assets/:这些目录与典型APK中的目录相同。 
    dex/:与APK不同,app bundle 将每个模块的DEX文件存储在这个单独的目录中。 
    root/:应用程序包的目录可能包含应用程序加载的基于Java的资源 Class.getResource(),这些文件稍后会重新定位到应用基础APK的根目录以及Google Play生成的每个多APK。
    resources.pb:描述每个模块中的代码和资源,这在针对不同设备配置优化APK时非常有用。
    BundleConfig.pb:提供有关包本身的信息,例如用于构建应用程序包的构建工具的版本。
    

    如何使用Android APP Bundles

    环境要求:Android Studio 3.2+

    代码配置: 在app中的build.gradle文件中的android闭包中添加如下代码:

    android {
    
        ......
    
        bundle {
            density {
                // Different APKs are generated for devices with different screen densities; true by default.
                enableSplit true
            }
            abi {
                // Different APKs are generated for devices with different CPU architectures; true by default.
                enableSplit true
            }
            language {
                // This is disabled so that the App Bundle does NOT split the APK for each language.
                // We're gonna use the same APK for all languages.
                enableSplit true
            }
        }
    } 
    

    将density、abi、language中的enableSplit设置为true,这样在生成apk时就可以通过屏幕分辨率、cpu架构、语言进行拆分。 修改完毕之后,进行同步,现在,您可以构建App Bundle。转到Build> Build Bundle(s)/ APK(s)并选择Build Bundle(s)

    构建之后会在app> build> outputs> bundle> debug中生成.abb文件。

    使用bundletool生成apk

    得到Android应用程序包后,有两种方法可以生成特定设备的apk:在本地使用 bundletool命令行工具或者上传到Google Play,由于无法使用Google Play,所以使用bundletool进行apk生成。

    bundletool

    常用命令:

    1.通过应用包生成apk集

    java -jar bundletool-all-0.9.0.jar build-apks
    --bundle=app.aab 
    --output=app.apks
    

    2.通过应用包生成一组带签名的apk集

    java -jar bundletool-all-0.9.0.jar build-apks 
    --bundle=app.aab
    --output=app.apks
    --ks=5658.keystore 
    --ks-pass=pass:android
    --ks-key-alias=androiddebugkey
    --key-pass=pass:android 
    
    

    3.将apk部署到设备上(需要连接设备,根据设备信息自动提取对应资源并安装)

    java -jar bundletool-all-0.9.0.jar install-apks 
    --apks=app.apks
    

    4.为已连接的设备生成apk

    java -jar bundletool-all-0.9.0.jar build-apks 
    --connected-device
    --bundle=app.aab
    --output=my_app.apks 
    
    
    

    通过json文件生成对应的apk

    java -jar bundletool-all-0.9.0.jar build-apks 
    --device-spec=config.json 
    --bundle=app.aab 
    --output=my_app.apks 
    
    

    获取已连接设备的json配置文件

     java -jar bundletool-all-0.9.0.jar get-device-spec 
    --output=config.json 
    

    从apk集中提取对应设备apk到app文件夹

    java -jar bundletool-all-0.9.0.jar extract-apks 
    --apks=keyhelp.apks  
        --output-dir=app 
    --device-spec=temp.json 
    
    

    json文件格式:

     {
        "supportedAbis": ["arm64-v8a", "armeabi-v7a"],
        "supportedLocales": ["en", "fr"],
        "screenDensity": 640,
        "sdkVersion": 27
    } 
    

    如果应用支持多种语言需要将支持的语言添加到supportedLocales中去。

    由程序包生成的apk集内容:

    [图片上传中...(image-be7cf3-1564667285374-2)]

    特定设备的apk集内容:

    优缺点分析 优点: 有效减小apk大小

    缺点:因其生成的apk集的后缀为apks,只能通过bundletool进行apk安装,无法通过adb install 进行安装。

    最后

    最后我准备了一些面试的知识汇总,数据结构,计算机网络等等都有。自己整理和分类的,还请尊重知识产出。
    分享给大家的资料包括高级架构技术进阶脑图、Android开发面试专题资料,还有高级进阶架构资料包括但不限于【高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术】希望能帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也是可以分享给身边好友一起学习的!

    资料免费领取方式:加群797404811

    image

    相关文章

      网友评论

        本文标题:Android新技术------Android App Bund

        本文链接:https://www.haomeiwen.com/subject/girhdctx.html