Android - 构建和签名

闷骚的程序员

构建相关问题

65K 方法数限制

简而言之:

编译器生成 classes.dex 文件时会给一个 dex 文件里的所有方法分配一个唯一 ID,而这个 ID 限于 Dalvik bytecode 操作数 16 bits 的限制,范围为 [0, 0xffff]。

在代码里区分 Debug 和 Release

使用 BuildConfig.DEBUG 并不总是准确,有几种方法来较为准确地区分当前是 Debug 版还是 Release 版,都是需要用 Gradle 脚本做一些配置。

方法一:

在 App 或者 Module 的 build.gradle 里添加配置:

gradle.startParameter.getTaskNames().each { task ->
    println("task: " + task)
    // library里 BuildConfig.DEBUG 默认一直是 flase 所以需要自定义
    if (task.contains("Debug")) {
        android {
            defaultPublishConfig "debug"
        }

    } else if (task.contains("Release")) {
        android {
            defaultPublishConfig "release"
        }
    }
}

然后在代码里使用 BuildConfig.DEBUG 就准确了。

方法二:

buildTypes {
    debug {
        resValue "string", "build_config_type", "debug"
    }
    release {
        resValue "string", "build_config_type", "release"
    }
}

然后在代码里使用 context.getString(R.string.build_config_type) 值是否为 debug 来判断。

打包时分开生成 32 位和 64 位包

通过 splits.abi 配置来实现。

配置了 split.abi 后,defaultConfig.ndk.apiFilters 需要注释掉。

android {
    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

详细配置可参考官方文档:https://developer.android.google.cn/studio/build/configure-apk-splits.html#configure-abi-split

签名

命令行给 apk 签名

使用 jarsigner,具体的参数含义可以参考 jarsigner 命令的帮助提示。

jarsigner -verbose -keystore xxx.jks -signedjar signed.apk unsigned.apk [别名]

参考

文档信息

Search

    Table of Contents