Android studio 自定义打包apk

1.自定义名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}


android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//这里修改apk文件名
def fileName = "${variant.productFlavors[0].name}-${defaultConfig.versionCode}-${defaultConfig.versionName}-${releaseTime() }.apk"
//def fileName = outputFile.name.replace("app", "${rootProject.ext.appName}-${releaseTime()}-${defaultConfig.versionCode}-${defaultConfig.versionName}")

output.outputFile = new File(outputFile.parent, fileName)
}
}
}

可以打包出如下版本号时间戳的apk包名:

模块名-渠道名-版本号-版本名称-包名-编译时间.apk

2.自定义字符串

1
resValue "string", "app_name", "我是应用显示在主屏幕的名称"

上面的语句可以在编译时把这个string键值自动添加到strings.xml中(不是覆盖哦,所以stings.xml中存在这个键值的话编译会报错,解决方法就是粗暴的把strings.xml中存在的去掉).

3.自定义Mainfest.xml中的值

1
manifestPlaceholders = [PROVIDOR_NAME: "**.emt.devapp.fileProvider"]
1
2
3
4
5
6
7
8
        <provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${PROVIDOR_NAME}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>

在编译时,AndroidMainfest.xml中的${PROVIDOR_NAME}值会自动写成”**.emt.devapp.fileProvider”,这样我们就可以根据不同的包名来生成不同的字符串了。

4.自定义基本类型

1
2
3
4
5
buildConfigField "String", "EXAMPLE_IP", "\"http://www.wangjiechao.com/\""

buildConfigField "boolean", "KEEP_CODING", true

buildConfigField "int", "DatabaseVersion", globalVersionCode
1
2
3
4
public static final int DB_VERSION = BuildConfig.DatabaseVersion;

String exampleurl=BuildConfig.EXAMPLE_IP;
val data=getDataFromUrl(exampleurl);

我们在gradle代码中声明完这些变量后,使用gradle预编译一下,就可以在生成的 应用包名.BuildConfig.java文件中看到这些变量了,然后就可以在应用中愉快的使用这些变量了,
在打包的时候,打包不同的版本和渠道都会自动进行相应的替换。