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