AppBundle

作者: ByeNevermore | 来源:发表于2019-05-27 23:05 被阅读0次

    AppBundle

    Android App Bundle是一种Google官方新推出的应用资源包. 可以有效的减少包体大小,提升启动速度.

    Bundle原理

    APK的方式:

    传统APK,开发者因为不清楚用户的CPU架构,机器分辨率,当前语言环境,采用直接把所有资源放到APK里面. 而实际上一个X86平板(一般是64位)的xxhdpi的中国用户,他并不需要下载arm架构的so文件,mdpi的资源文件,以及日语语言资源包. 但是GP清楚用户的信息,所以GP就可以有针对性的去下发这些APK资源文件,从而达到减少包体大小的目的. 因为包体资源减少了,对应的启动速度也变快了. 这就是AppBundle技术

    image

    Bundle会把所有资源都生成出来,但是用户下载的时候仅会取到他需要的部分.

    如上图: Base.apk + feature2-xhdpi.apk + feature2-armabi.apk + feature2-en.apk 来组合形成的一个APK提供给这种手机配置的用户下载. 如果用户需要feature1和feature3的时候再下发给用户.

    集成

    升级AndroidStudio & Gradle

    AS必须在3.2以上,同时因为使用Gradle构造Bundle文件,必须保证Gradle升级到可以支持Bundle的版本,测试Gradle-5.1.1-all版本没有问题.

    动态配置资源APK

    
        buildTypes {
    
            release {
    
                minifyEnabled true
    
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    
                signingConfig signingConfigs.releaseConfig
    
            }
    
            debug {
    
                minifyEnabled false
    
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    
                signingConfig signingConfigs.releaseConfig
    
            }
    
        }
    
        bundle {
    
            density {
    
                // Different APKs are generated for devices with different screen densities; true by default.
    
                enableSplit false
    
            }
    
            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 false
    
            }
    
        }
    
    

    新增bundle配置方式,density/abi/language顾名思义,对应dpi/cpu平台/语言包. 默认为true.

    构建App Bundle

    使用命令行构建: ./gradlew bundleDebug,生成debug版的bundle文件.

    当然也可以使用IDE. 路径:

    1. Build

    2. Generata Signed APK

    3. 选择对应密钥,填入密匙

    4. 生成

    最终生成一个aab文件

    BuildTool测试

    手动安装: https://github.com/google/bundletool,下载下载是一个jar文件,然后使用这个jar文件打包

    
    java -jar bundletool-all-0.9.0.jar build-apks
    
    --bundle=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.aab
    
    --output=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.apks
    
    --ks=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/adamrocker.keystore
    
    --ks-pass=pass:xxxxxx
    
    --ks-key-alias=xxxxxx
    
    --key-pass=pass:xxxxxx
    
    

    [推荐]使用brew

    
    brew install bundletool
    
    

    然后就可以愉快的使用bundletool命令了

    
    bundletool build-apks
    
    --bundle=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.aab
    
    --output=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.apks
    
    --ks=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/adamrocker.keystore
    
    --ks-pass=pass:xxxxxx
    
    --ks-key-alias=xxxxxx
    
    --key-pass=pass:xxxxxx
    
    

    打包完成后生成的是一个apks文件. 我们把这个文件后缀改为zip,解压缩出来看到

    上传AppBundle

    上传签名

    动态资源下发

    例如一个游戏apk设置免费只能玩到第三关,从第4关开始需要收费. 那么对于初始APK资源就没必要把第4关之后的资源放到基础模块里面,等用户付费了再去下载对应的模块即可.

    而这里面的下载应用逻辑GP已经帮我们做好了,仅需要简单的代码即可:

    例如我申明了一个feature1的module,那么我需要在gradle文件中申明

    
    android{
    
        bundle {
    
            density {
    
                enableSplit true
    
            }
    
            abi {
    
                enableSplit true
    
            }
    
            language {
    
                enableSplit false
    
            }
    
        }
    
        // Dynamic feature modules
    
        dynamicFeatures = [":feature1"]
    
      }
    
    

    同时在主模块代码中如下调用即可:

    
        public void loadFeatureOne() {
    
            SplitInstallRequest request =
    
                    SplitInstallRequest
    
                            .newBuilder()
    
                            .addModule("feature1")
    
                            .build();
    
            SplitInstallManagerFactory.create(getApplicationContext())
    
                    .startInstall(request)
    
                    .addOnSuccessListener(new OnSuccessListener<Integer>() {
    
                        @Override
    
                        public void onSuccess(Integer integer) {
    
                            Intent intent = new Intent().setClassName(getPackageName(), "com.bapspatil.feature1.FeatureOneActivity");
    
                            startActivity(intent);
    
                        }
    
                    })
    
                    .addOnFailureListener(new OnFailureListener() {
    
                        @Override
    
                        public void onFailure(Exception e) {
    
                            Toast.makeText(getApplicationContext(), "Couldn't download feature1: " + e.getMessage(), Toast.LENGTH_LONG).show();
    
                        }
    
                    });
    
        }
    
    

    相关文章

      网友评论

          本文标题:AppBundle

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