/ApkPublishDemo

最强Android 打包插件,支持fir,蒲公英上传, 360加固 ,自动生成二维码

Primary LanguageJava

ApkPublishDemo

序言

由于公司的项目具有多个环境。每次打包都要手动选择编译类型,打包还得上传fir,和蒲公英。最后截二维码给测试。为了偷懒写了一个gradle 脚本。实现以下功能

  1. 自定义打包类型,可以指定buildType和flavor
  2. 支持定义多种,多个服务器,fir和蒲公英都支持,每种服务都可以配置多个。
  3. 支持自动打包上传,上传使用curl具有上传进度
  4. 支持360加固。只需要简单配置即可实现360自动加固
  5. 支持自动获取git日志作为更新日志
  6. 支持配置邮箱,实现打包完成自动提醒。

说明

目前支持的Android gradle插件版本有 3.4.1 ,4.0.1 ,4.1.0

在项目根目录的build.gradle文件中可以查看插件版本。4.1.0以上是否支持还没测试,可自行测试。

     buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
    	//gradle Android插件版本
        classpath "com.android.tools.build:gradle:4.1.0"
    }
}

效果

口说无凭直接看效果。

功能 截图
自定义打包类型,可以指定buildType和flavor 在这里插入图片描述
通过简单配置,自动生成相关任务双击即可执行。 在这里插入图片描述
发布到相关服务器显示进度信息 在这里插入图片描述
上传成功自动生成二维码弹出提示框 在这里插入图片描述
支持360加固 在这里插入图片描述
配置邮箱,发布成功自动提醒 在这里插入图片描述

使用

下载demo

相关的脚本和使用的demo已经上传至github。需要先下载demo。

Publish-GitHub地址

在这里插入图片描述

导入文件

将其中的publish文件夹引入到你的app module中 在这里插入图片描述

文件内容说明

在这里插入图片描述

文件 功能
icon/app_logo.png 存放应用的图标,使用的时候,直接覆盖即可。建议尺寸150px*150px 太大的话还得压缩没必要。也可以不使用这个图片,自行配置logo路径既可
lib/AppPublish-1.0-SNAPSHOT.jar 提供了弹窗功能,二维码生成功能,发送邮件功能
log 主要是存放curl访问接口时产生的临时文件,访问结束后会自动删除。这个文件夹不要动它
publish.gradle 所有功能的脚本,生成打包,发布,加固任务

配置gradle

配置gradle.properties

为了能在多个项目共享配置,建议在gradle的安装目录,配置一个gradle.properties文件。也便于一个部门内统一使用这个打包插件。更多内容可以参考【Gradle深入浅出】——Gradle配置(一)

文件位置

在这里插入图片描述

内容

#-------------------------App发布助手需要的变量---start---------------------------

#注意配置的路径的时候需要使用转义符,:要加转义符,\也要。

#比如地址是E:\abc 需要写成 E\:\\abc

#360加固配置

#360jar包地址,不能包含中文
TRSJiaGuJirPath=E\:\\WORK\\JiaGu\\360jiagubao_windows_64\\jiagu\\jiagu.jar
#360用户名
TRSJiaGuUserName=xxx
#360密码
TRSJiaGuPassword=yyy
#打包输出路径,不能包含中文
TRSJiaGuOutPath=C\:\\Users\\Administrator\\Desktop\\360JiaGuOut\\

#Email配置

#Email的Smtp服务器地址
TRSPublishEmailServer=smtp.qq.com
#Email地址
TRSPublishEmailAddress=123123123@qq.com
#Email的密码,或者token
TRSPublishEmailPassword=abcdabcd
#Email功能是否启用,true或fasle
TRSPublishEmailEnable=true

#公司的FIR

#api_token

TRSFirApiToken=abc123456789

#公司的蒲公英配置

#ukey
TRSPgyUKey=abc123456789
#api_key
TRSPgyApiKey=abc123456789
#安装的时候使用密码 true 或false
TRSPgyUsePasswordOnInstall=false
#安装密码
TRSPgyInstallPassword=123456
#-------------------------App发布助手需要的变量---end---------------------------

补充: 这个properties文件最后解析成一个Map<String,String> 所以如果是路径包含了斜杠等符号,需要使用转义。注释中有说明。

定义在该文件中的变量可以在build.gradle中直接使用。但是如果要让其转换成其他值,比如String转Boolean需要这样写。

 email {
        smtpServer TRSPublishEmailServer
        emailAddress TRSPublishEmailAddress
        emailPassWord TRSPublishEmailPassword
  		//string转bool
        enable TRSPublishEmailEnable.toBoolean()
    }

因为360加固包不支持中文,所以生成的apk的名字和存放的路径都不能含有中文

项目中配置

这是demo中的完整build.gradle文件。方便大家查看 。相关的说明我都写在注释里了。

plugins {
    id 'com.android.application'
}
//引用打包插件
apply from: "publish/publish.gradle"

//配置打包插件
ApkPublish {
	//配置加固信息	
    jiaGu{
        jarPath TRSJiaGuJirPath
        userName TRSJiaGuUserName
        password  TRSJiaGuPassword
        //outPutPath路径中不能包含中文
        outPutPath TRSJiaGuOutPath
    }
	//配置应用信息,在弹窗和而成二维码的时候需要使用
    apkInfo {
        appName "昨日头条"
        appLogo file("/publish/icon/app_logo.png")
    }

	//配置Email,如果不需使用,可以将enable设置为false
    email {
        smtpServer TRSPublishEmailServer
        emailAddress TRSPublishEmailAddress
        emailPassWord TRSPublishEmailPassword
        enable TRSPublishEmailEnable.toBoolean()
    }
	
	//fir服务器,下面可以配置多个
    fir {
    	//一个fir服务器,"公司fir"是他的名字,只有一个属性apiToken
    	//可以配置多个,只有名字唯一就行。该名字只需要配置为apk中的serverName属性
    	//即可实现自动选择该服务器作为上传服务器
        公司fir {
            apiToken TRSFirApiToken
        }
    }
    //蒲公英服务器,下面可以配置多个
    pgy{
    	//一个蒲公英服务器,"公司pgy"是他的名字,需要两个属性
    	//uKey和apiKey
    	//usePasswordOnInstall 表示安装的时候是否需要密码 值是bool
    	//password  安装需要的密码,值是String
    	//可以配置多个,只有名字唯一就行。该名字只需要配置为apk中的serverName属性
    	//即可实现自动选择该服务器作为上传服务器
        公司pgy{
            uKey TRSPgyUKey
            apiKey TRSPgyApiKey
            usePasswordOnInstall TRSPgyUsePasswordOnInstall.toBoolean()
            password TRSPgyInstallPassword
        }
    }
	//配置需要生成的apk文件
    apk {
    	//配置一个apk文件
    	//“正式版”是它的名字,根据这个名字会生成3个任务
    	//打包正式版,发布正式版,加固正式版
    	//buildType 值是String类型,必须是Android配置下的的buildType中的某给值
    	//flavor  值是flavor ,必须是Android配置下的productFlavors中的某个值,没有的话可以自己建一个
    	//serverName 上传的服务器名称,必须是fir配置下,或pgy配置下 某项的名字
    	//useGitLog 是否使用git日志作为更新日志。true的话会提取最近的五条日志作为更新日志
    	//否则更新日志会显示upload by 打包助手
        正式版 {
            buildType "release"
            flavor "official"
            serverName "公司fir"
            useGitLog true
        }

        测试版 {
            buildType "release"
            flavor "BJTest"
            serverName "公司pgy"
            useGitLog true
        }

    }

}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.zgh.apkpublish"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    //需要配置签名,这样才可以实现全过程的自动化
    signingConfigs {
        release {
            storeFile file('../key/apk_publish.jks')
            storePassword 'admin123'
            keyPassword 'admin123'
            keyAlias = 'publish'
        }
    }

    buildTypes{
        release{
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            	//设置需要使用的签名配置
            signingConfig signingConfigs.release
        }
        debug{
        	//设置需要使用的签名配置
            signingConfig signingConfigs.release
        }
    }
	
	//不同的产品风味
    productFlavors {
        flavorDimensions "api"
        official {
            buildConfigField "String", "BASE_URL", "\"正式环境\""
        }
        BJTest{
            buildConfigField "String", "BASE_URL", "\"测试环境\""
        }
    }
}


dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

补充说明

1.360加固配置

360加固下载地址 安装成功以后它的安装地址是在这里插入图片描述 jar包就在这个位置 在这里插入图片描述

2.curl乱码

win10 自带了curl。但是上传的时候如果包含了中文会出现乱码。比较简单的解决办法就是修改系统的编码。

小编教你把win10系统默认编码为utf8

在这里插入图片描述

3.邮箱配置

建议使用QQ邮箱,手机上安装QQ邮箱可以实时收到提醒。 进入QQ邮箱->设置->账户

在这里插入图片描述 往下翻 在这里插入图片描述

4.Fir Token 获取

fir官网 在这里插入图片描述

5.蒲公英 uKey,api key获取

蒲公英首页 点击API信息 在这里插入图片描述

在这里插入图片描述

功能拓展

GUI扩展

我的GUI是自己编写的库也上传到github了,需要修改的可以自行fork。 GUI

gradle扩展

所有功能实现都在publish.gradle中。可以自行阅读,扩展功能。

也可以参考以下内容实现扩展

Android Gradle学习(五):Extension详解 这是一个系列,值得学习

【Gradle Task】FIR上传脚本(cURL方式、关联git提交次数、更新日志)

curl 的用法指南 Android Gradle 插件版本说明

下载Android gradle 插件

分享一个下载gradle插件源码的小技巧,只需要将你需要的gradle插件作为依赖配置在你的项目中在这里插入图片描述 然后gradle就会下载代码,可以通过反编译查看一些Android gradle不同版本间实现的差异。这样可以提高脚本的兼容性。 在这里插入图片描述

在这里插入图片描述