一、下载并配置gradle的环境变量
第一种方式:(1)下载gradle,在系统变量的Path里面添加gradle下的bin路径,例如D:\Program Files\Android\AndroidStudio\gradle\gradle-2.14.1\bin。
第二种方式:(1)下载gradle,在系统变量中新建一个GRADLE_HOME,填入gradle的路径D:\Program Files\Android\AndroidStudio\gradle\gradle-2.14.1,并在Path里面添加一个%GRADLE_HOME%\bin。
如上所示,我下载的是2.14.1版本的gradle,不过现在最新的Gradle版本都到4.4了,所以看自己个人需要去下载Gradle就好了,但是要注意的是,如果您更新了Gradle版本,那环境变量的配置也要修改。
2、测试配置是否成功
进入要打包的源码项目路径下,然后输入gradle,如果显示Successful说明配置成功。
cd E:\MusicRudiment-->E:MusicRudiment>gradle
二、在项目的build.gradle中进行签名文件的代码配置(已经配置好build.gradle中签名文件的可以略过)
1、在项目的build.gradle的android{}中添加如下代码,其实也就是签名文件的别名,密码以及在本地的地址路径名称等等:
signingConfigs {
config {
keyAlias 'sherry'
keyPassword '123456'
storeFile file(projectDir.parent +'/sherry.jks')
storePassword '123456'
}
}
上面这部分是签名文件的相关值,一定要和我们打包时用到的签名文件中的参数值一一对应,否则会报错。如果是第一次打包,没有签名文件,可以先利用jdk中的keytool工具生成一个签名文件,有的话直接忽略即可。具体命令行如下(其中D:\jdk1.8.0_131是我的电脑中jdk的路径位置,至于jdk的环境变量网上一抓一大把,我就不说了。接着介绍,E:\MusicRudiment是我要打包的源码路径,最后生成的签名文件位置也在这个路径下面,方便在build.gradle文件中进行配置):
先cmd,然后输入命令
D:\jdk1.8.0_131\jre\bin>keytool -genkey -alias sherry -keypass 123456 -keyalg RSA -keysize 1024 -validity 3650 -keystore E:\MusicRudiment\sherry.jks -storepass 123456 -dname "CN=sherry, OU=xx, O=xx, L=xx, ST=xx, C=xx"
根据上面的命令行,其实大家就可以看到我签名文件的全部内容了,主要包括:别名 -alias 后面的 sherry ,密码 -keypass 后面的 123456等等,如此便会生成一个叫做 sherry.jks的签名文件了。
2、在build.gradle文件中一般还有一个buildTypes{}的代码块,一般是放在签名文件配置的代码后面,如下所示:
buildTypes {
release {
minifyEnabled true
proguardFilesgetDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
它只有正式安装包的配置,minifyEnable也就是是否最小化安装包,以及后面的混淆文件名称等。可是对于开发人员来说,我们不仅要有正式包,还有测试包,这样也便于我们和测试人员进行区分,所以呢,要把上面这段代码改成下面的样式:
buildTypes {
release {
minifyEnabled true
proguardFilesgetDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
debug {
minifyEnabledfalse
proguardFilesgetDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
3、最后再添加后面这两段代码,其中第一段代码是指在E:\MusicRudiment\app\build\outputs\apk路径下生成app-release.apk并重命名为sherry-...,而后面那段代码则表示在任务的最后执行一个复制的操作,把最终生成的apk复制到项目下的apks文件夹下面。
android.applicationVariants.all {variant ->
def file =variant.outputs[0].outputFile
variant.outputs[0].outputFile = newFile(file.parent, file.name.replace("app-release.apk","sherry_" + defaultConfig.versionName + ".apk"))
}
tasks.getByName("build")<<{
copy {
from"build/outputs/apk/"+"sherry_" + defaultConfig.versionName+ ".apk"
intoprojectDir.parent+"/apks"
}
}
三、使用命令行打包生成普通安装包
cmd命令进入项目路径中,执行gradle build命令行,例如E:\MusicRudiment\app>gradle build,如果出现BUILD SUCCESSSFUL就表示打包成功了。
四、使用命令行打包生成热更新补丁包
1、首先按照前面三个步骤执行,如果接入了热更新tinker(第二步添加的代码会有些差别),那么在项目的build下会有一个bakApk的文件夹,执行gradle assembleRelease或者gradle assembleDebug命令,会出现一个基准包和一个对应的R文件,例如:app-release-0225-16-21-23.apk和app-release-0225-16-21-23-R.txt。
2、在build.gradle文件中,修改如下一段代码
tinkerOldApkPath = "${bakPath}/app-release-0613-12-03-04.apk"
tinkerApplyMappingPath ="${bakPath}/app-release-0613-12-03-04-mapping.txt"
tinkerApplyResourcePath ="${bakPath}/app-release-0613-12-03-04-R.txt"
tinkerBuildFlavorDirectory= "${bakPath}/app-0613-12-03-04"
把对应的日期填进去,需要注意的是release还是debug。
3、修改完成后同样进入项目路径下,执行gradletinkerPatchRelease命令,在项目根路径\app\build\outputs文件夹中会出现一个tinkerPatch的文件夹,该文件夹中的patch_signed_7zip.apk就是我们要得到的补丁包。需要注意的是,每次打补丁包都必须是拿最原始的那个基准包进行打包,而不是我们后来打包生成的apk去打包,因为每次打补丁包的时候同样会生成对应时间的安装包。
遇到的问题:
问题一:在进入项目路径下后,输入命令行gradle build,出现了如下报错:
NDK is missing a "platforms" directory.
If you are using NDK, verify the ndk.dir is set to a valid NDK directory. It is currently set to C:\MySpace\Working\SDK
\android-sdk\android-sdk\ndk-bundle.
If you are not using NDK, unset the NDK variable from ANDROID_NDK_HOME or local.properties to remove this warning.
这个是因为sdk的路径不对,并且没有NDK路径,解决方法是:
(1)找到项目子目录下的“local.properties”文件,打开后把原来的
sdk.dir=C\:\\MySpace\\Working\\SDK\\android-sdk\\android-sdk
改成自己的即可,例如我的是
sdk.dir=D\:\\Android\\sdk
(2)加上自己的NDK路径,同样改成我自己的
ndk.dir=D\:\\Android\\sdk\\ndk-bundle
问题二、同样是运行gradle build,报错如下:
* What went wrong:
Execution failed for task ':multi-image-selector:lint'.
> Lint found errors in the project; aborting build.
Fix the issues identified by lint, or add the following to your build script to proceed with errors:
...
android {
lintOptions {
abortOnError false
}
}
从上面的字面意思其实就看出来解决方法了,我们只需要到这个对应的项目或库文件中加上下面这一段:
android {
lintOptions {
abortOnError false
}
}
ndk.dir=D\:\\Android\\sdk\\ndk-bundle