关于Android多渠道打包

試著忘記壹切 提交于 2019-11-26 22:58:55

如果你还不会的话,为什么不用walle呢?
github地址:https://github.com/Meituan-Dianping/walle
美团点评开源的一个项目,教程很详细,一看就会,可以说是非常方便了。

如果还是不会的话,如果想自己实现也不难,只需要在build.gradle中简单配置一下就可以了。

Manifest中添加渠道标识(名字可以自定义):
<meta-data android:value="${UMENG_CHANNEL}" android:name="CUSTOM_NAME" />
//Android Studio3.0 要求每个flavor必须有dimension
flavorDimensions "xiaomi" "huawei"

//声明你所有的渠道,名字对应Manifest中的
productFlavors {
    xiaomi {
        dimension "xiaomi"
        //渠道标识
        manifestPlaceholders = [UMENG_CHANNEL: "702003"]
        //渠道包名不一致时可以单独设置每个包的包名
        applicationId = "xx.xx.xx"
    }
    huawei {
        dimension "huawei"
        //渠道标识
        manifestPlaceholders = [UMENG_CHANNEL: "702002"]
        //渠道包名不一致时可以单独设置每个包的包名
        applicationId = "xx.xx.xx"
    }
}

更多Android Studio3.0的规范详见:
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html

此外,还需要把我们的签名信息配置到build.gradle中,在android下新建一个signingConfigs

signingConfigs{
        custom{
            keyAlias "xxxxx"
            keyPassword "xxxxx"
            storePassword "xxxxx"
            storeFile "xxxxx"
        }
    }

如果不想直接把签名信息写在build.gradle中,也可以自己新建一个文件,然后把信息写进去,在build.gradle中直接调用就可以,我个人不想写在build.gradle中是因为只要稍微一动这个文件,就得sync一次,有点麻烦。

比如我是项目里新建了一个keystore.properties来存储项目的签名信息。然后在build.gradle中调用的时候就是这样的:

//调用keystore.properties,传入你keystore的路径  Grovvy语法,其实和java还是有点相似的
def keystorePropertiesFile = rootProject.file(".../keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

keystore.properties中是这样的:

keyAlias=xxxx
keyPassword=xxxx
storePassword=xxxx
storeFile=xxxx

配置好之后,在build.gralde中的配置就是这样的

signingConfigs{
        custom{
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storePassword keystoreProperties['storePassword']
            storeFile file(keystoreProperties['storeFile'])
        }
    }

在android 下的 buildTypes 的 release 下添加:

    applicationVariants.all { variant ->

        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为apkname_{version}_{productFlavorName}_{releaseTime}.apk
                def fileName = "apkname${getVersionName()}_${variant.productFlavors[0].name}_${releaseTime()}.apk"
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }
    signingConfig signingConfigs.custom

//releaseTime方法,Grovvy语法
def releaseTime() {
    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}

applicationVariants是系统提供的一个属性,只适用于application module,我们这里用到的variant也是自带的,variant也提供了好多属性,这里用到了outputFile,如果想详细了解:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Advanced-Build-Customization

如果不同渠道代码会有差异的话,只需要在src下声明你对应渠道的package,然后把对应渠道的文件放到对应目录下就可以了,
比如xiaomi渠道需要替换一个drawable-xhdpi下名字为logo.png的图片,直接在src下新建xiaomi->res->drawable-xhdpi->logo.png(新的图片),打出来的xiaomi渠道包logo.png就是和别的不同的。替换别的文件也是同理。

配置完成后只需要运行 assembleRelease Tasks就可以自动编译了,或者Ter输入./gradlew assembleRelease,或者选择Build->Generate Signed APK,就可以了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!