这里介绍下签名及生成APK的一些方法。
常见的使用
点击工具上的Run&Debug
选择你想要的module,点击工具Run或者Debug,这里Studio会自动编译当下最新的代码并生成和运行APK到手机或者模拟器上。这时会使用Studio中默认的签名key.
Build->Generate signed APK
选择你想要的module,点击导航栏的Build选项,选择Generate signed APK,这里我们可以新建或者使用已有的key,来编译并生成apk。
使用Gradle的命令生成APK
使用gradlew命令生成Apk
Android Studio中提供了gradle wapper来使用gradle,让你可以在没有配置gradle环境时使用,gradle wapper我们可以理解为对gradle的封装,在项目目录/gradle/wrapper/gralde-wrapper.properties文件中声明了它指向的目录和版本。只要下载成功即可用grdlew wrapper的命令代替全局的gradle命令。更多内容你可以查看项目根目录下的gradlew或gradlew.bat文件。
一些常命令:
- gradlew -v 版本号
- gradlew clean 清除build目录下的文件
- gradlew build 检查依赖并编译打包
- gradlew XXX XXX为Gradle任务
我们可以在Android Studio的Terminal中使用,显示BUILD SUCCESSFUL表明编译成功。
使用gradle命令生成Apk
当你配置了gradle的环境(配置GRADLE_HOME,并把GRADLE_HOME/bin加到path里),你可以直接使用gradle命令来生成apk,使用方式和之前介绍的gradlew一样。
Gradle Projects面板
打开主界面右边栏中的Gradle Projects,点击刷新按钮。会在界面中显示出项目中所有的Gradle任务,选择你想要执行的任务,双击就会开始执行。
双击如图中 assembleDebug或者assembleRelease就会编译出Debug或者Release版本的Apk。
和在Terminal中执行gradlew assmbleDebug命令一样。
签名配置
在Project Structure中可以预先配置签名Key,在后面的编译打包中直接使用。如图中箭头所示,你可以增加一个新的配置,选择你想要的Key。如何使用这个配置,将会在下面接着介绍。
然后我们来看下Module中的build.gradle文件,里面增加了如下内容,可以看到刚才的修改都保存到了这里。
signingConfigs {
DebugSign {
keyAlias 'test'
keyPassword '111111'
storeFile file('F:/AndroidStudioProjects/Test/test_key_release.jks')
storePassword '111111'
}
ReleaseSign {
keyAlias 'test'
keyPassword '111111'
storeFile file('F:/AndroidStudioProjects/Test/test_key_release.jks')
storePassword '111111'
}
}
可以看到密码是以明文的方式保存的,如果不希望如此,可以做如下修改, 这样在编译打包的时候可以动态去输入密码。不过这个方式只适用于以命令的方式,使用UI界面的方式并不能提示输入密码,而且还会提示编译成功。
def password = null
def console = System.console()
if (console != null) {
password = console.readLine("\nEnter Key password: ")
}
keyPassword password
Build Types配置
一般情况下Android Studio中会默认生成Debug和Release两个版本的Apk, 当然我们也可以再增加新的不同的版本。
Name: Build Type名称,可任意取名
Debugable: 是否可以调试,debug中为true
Jni Debuggable: 是否可以调试JNI,默认为false。
Signing Config: 签名信息, 这里我们可以选择之前配置的签名,这样之后编译打包该版本就会使用指定的签名key了。默认为空。
Renderscript Debuggale: 是否使用RenderScript(RenderScript 是Android 平台上的一种类C脚本语言,是一种低级的高性能编程语言,用于3D渲染和处理密集型计算),默认为false。
Renderscript Optim Level: Rendescript版本.
Minify Enabled: 是否去除无用的资源, 默认为false.
Pseudo Locales Enaled: 是否支持本地化整理, 默认为空
关于本地化整理介绍: http://blog.csdn.net/kieven2008/article/details/6873610
Proguard File: 混淆配置文件,可
Application Id Suffix: App id后缀
另外多说下,所有的 Android 应用程序都有1个包名,这是唯一的。在此前我们的的包名都由manifest文件的根元素里的package属性决定。而在 Gradle构建系统,我们可以轻松构建多个不同版本的程序,使用applicationId + applicationIdSuffix的方式,就可以得到不同的包名。
Version Name Suffix: 版本名称后缀
Zip Align Enabled: 是否支持Zip Align
在来看下Module中的build.gradle,多了一些改变,默认值的在这里不会出现。
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
applicationIdSuffix '.release'
versionNameSuffix '.release'
signingConfig signingConfigs.ReleaseSign
}
debug {
signingConfig signingConfigs.ReleaseSign
}
}
Flavors配置
在实际的发布中,我们会因为不同的目的,需要不同的一些特性,像是不同包名,服务器地址等等,来生成不同的APK。我们就可以通过Flavors和Build Types配合使用来达到目的。项目中会有一个默认配置,先来看一下:
Name: Flaveor的名字,我们可以新增加别的配置
Min Sdk Version: 目标最少的SDK版本
Application Id: 包名,不同Flavors可以使用不同的包名
Proguard File: 混淆文件
Signig Config: 签名文件名.
Target Sdk Version:目标的SDK版本
Test Instrumentation Runner: 自动化测试
Test Application Id:测试时的ID
Version Code: Module版本
Version Name: Module版本名称
同样来看下Module中的build.gradle
defaultConfig {
applicationId "eric.test"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
新增加Flavors,添加了如下的内容:
productFlavors {
pro {
// 包名
applicationId "eric.test.pro"
// 方法一:
manifestPlaceholders = [META_DATA_VALUE: "pro_XXXXXXXXXXXX"]
// 方法二:
resValue("string", "flavors_str", "pro_XXXXXXXXX")
// file 'eric.test.pro'
}
full {
// 包名
applicationId 'eric.test.full'
// 方法一:
manifestPlaceholders = [META_DATA_VALUE: "full_XXXXXXXXXX"]
// 方法二:
resValue("string", "flavors_str", "full_XXXXXXXXX")
}
sourceSets {
// 方法三:
pro {
java.srcDirs = ['src/pro', 'src/pro/java', 'src/pro/java/']
}
// 方法三:
full {
java.srcDirs = ['src/full', 'src/full/java', 'src/full/java/']
}
}
方法一:
在AndroidManifest.xml中添加,这样在编译的时候AndroidManifest中META_DATA_VALUE的值就会被替换为flavors中定义的值。
<meta-data android:name="metaDataName" android:value="${META_DATA_VALUE}" />
方法二:
java代码中使用,可获得对应的值。
String flavorsStr = getResources().getString(R.string.flavors_str);
方法三:
编译时使用不同的文件。注意sourceSets中使用和Flavors中同样的名字,在src对应的文件夹full和pro,并添加相应的文件。它会和main中的文件混合编译。注意在main中不能有相同包名的文件存在,否则会有编译错误。
采用如上的方法,基本已经能够解决不同的需求了。Gradle的编译打包就暂时先到这里。