ADeveloperH Blog

Meet a better self !

Android 周边技术分享


APK 瘦身

1 国内应用市场

那些你不知道的 APK 瘦身,让你的 APK 更小

如何将 APK 大小减少 6M 的

我的Android进阶之旅——>Android APP终极瘦身指南

Android 瘦身之道 —- so文件

【腾讯Bugly干货分享】Redex初探与Interdex:Andorid冷启动优化

压缩代码和资源

2 Google Play Store

2.1 split apk (Build multiple APKs)

Build multiple APKs 官网

ABI 管理

根据 abi 进行分包,最终配置如下:


import com.android.build.OutputFile

android {
    compileSdkVersion project.compileSdkVersion as int
    buildToolsVersion '27.0.3'

    defaultConfig {
        applicationId "com.noxgroup.app.cleaner"
        minSdkVersion 19
        multiDexEnabled true
        targetSdkVersion project.targetSdkVersion as int
        versionCode 5
        versionName "1.5.3"
        
		//注意:这里和 split 冲突,如果配置了 split 了,这里就不用配置 filter 了
//        ndk {
//            abiFilters 'armeabi-v7a','x86'
//        }

    }

    splits {
        abi {
			//如果将此元素设置为true,Gradle将根据您定义的ABI生成多个APK。默认值为false
            enable true
			//清除ABI的默认列表。仅在与include元素组合时使用 才能指定要添加的ABI。以下代码段将ABI列表设置为just,
			//x86并x86_64 通过调用reset()清除列表,然后使用include:
            reset()
			//指定Gradle应为其生成APK的以逗号分隔的ABI列表。仅与组合使用reset()以指定ABI的确切列表。
            include 'armeabi-v7a', 'x86'//'armeabi-v7a', 'x86', 'arm64-v8a'
			//如果true,Gradle除了per-ABI APK之外还会生成通用APK。通用APK包含单个APK中所有ABI的代码和资源。
			//默认值为false。请注意,此选项仅在splits.abi块中可用。在根据屏幕密度构建多个APK时,
			//Gradle始终会生成一个通用APK,其中包含所有屏幕密度的代码和资源。
            universalApk false
        }
    }

	//注意:这个顺序不能改变。兼容性高的版本需要小于兼容性低的,Google play 默认会从高的开始找是否符合
    ext.abiCodes = ['armeabi-v7a':1, 'arm64-v8a':2, x86:3, x86_64:4]
    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def baseAbiVersionCode =
                    project.android.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
            if (baseAbiVersionCode != null) {
                output.versionCodeOverride =
                        baseAbiVersionCode * 10000 + variant.versionCode
            }
            output.outputFileName = "yourappname_" + defaultConfig.versionName + "_" + buildType.name + "_"  + output.versionCodeOverride + "_" + output.getFilter(OutputFile.ABI).replace("-", "") + "_" + new Date().format("yyyyMMddHHmm")+".apk"
        }
    }
}



2.2 Android App Bundles

Android App Bundle探索

Android组件化 Android app Bundle

Android动态化框架App Bundles

Android App Bundle 使用流程(codelabs)

Android App Bundle Demo

使用 Android App Bundle 提供应用和用户所需功能

Android App Bundle 官网

bundletool 使用 官网

About Android App Bundles 官网


常见错误:  
1.<fusing> element is missing the 'include' attribute  
解决方案:https://stackoverflow.com/questions/50869694/android-app-bundle-build-error-fusing-element-is-missing-the-include-attrib  
just add "dist:" 如:dist:include="false"



bundle tool 常用命令(https://developer.android.com/studio/command-line/bundletool):

生成支持所有平台 apks 命令:

java -jar D:/Repositories/bundletool/bundletool-all-0.8.0.jar build-apks --bundle=D:/Repositories/bundletool/app.aab --output=D:/Repositories/bundletool/NoxSecurity.apks --ks=D:/Repositories/NoxSecurity/xxxx.jks --ks-pass=pass:xxxx --ks-key-alias=xxxx --key-pass=pass:xxxx

生成当前连接设备的 APK :
 
java -jar D:/Repositories/bundletool/bundletool-all-0.8.0.jar build-apks --connected-device --bundle=D:/Repositories/bundletool/app.aab --output=D:/Repositories/bundletool/my_app.apks --ks=D:/Repositories/NoxSecurity/xxxx.jks --ks-pass=pass:xxxx --ks-key-alias=xxxx --key-pass=pass:xxxx

根据JSON文件生成对应的 APK :

java -jar D:/Repositories/bundletool/bundletool-all-0.8.0.jar extract-apks --apks=D:/Repositories/bundletool/my_app.apks --output-dir=D:/Repositories/bundletool --device-spec=D:/Repositories/bundletool/test.json

测量APK集中APK的估计下载大小

java -jar bundletool-all-0.8.0.jar get-size total --apks=my_app.apks

安装 apks 命令:

java -jar D:/Repositories/bundletool/bundletool-all-0.8.0.jar install-apks --apks=D:/Repositories/bundletool/NoxSecurity.apks

获取当前手机信息:
adb shell

getprop

获取 abi 信息: getprop |grep abi
获取 screenDensity 信息: getprop |grep dens
获取 sdkVersion 信息: getprop |grep version.sdk


最近的文章

动画相关

1 View 切换之 ViewFlipper 使用ViewFlipper(翻转视图)使用详解Android:ViewFlipper实现的View切换2 View 切换之 ViewSwitcher 使用Android ViewSwitcher简介和使用3 自定义 View 实现动画3.1 自定义控件专家博客:自定义控件集合Android 自定义 View 常见效果集合3.2 贝塞尔曲线妙用动画效果实现三次贝塞尔曲线练习之弹性的圆Android 自定义 View 常见效果集合Android开发...…

继续阅读
更早的文章

常用小知识

1 系统语言切换相关Android 7.0多语言支持开发浅析Android 项目开发填坑记 - 获取系统语言(兼容7.0)Android中监听语言变化的两种方式改变系统语言后,重新进入处于后台的APP,会重走onCreate方法:Android如何去处理运行时配置的改变?1.1 阿拉伯语适配(RTL)双向性Android RTL 及小语种 适配Android阿拉伯适配rtl2 SharedPreference 导致 ANRANR 如下(主要集中在 5.0 和 5.1 三星等手机上):"ma...…

继续阅读