这里介绍下签名及生成APK的一些方法。

常见的使用

点击工具上的Run&Debug

选择你想要的module,点击工具Run或者Debug,这里Studio会自动编译当下最新的代码并生成和运行APK到手机或者模拟器上。这时会使用Studio中默认的签名key.

Android stdio生成桌面 android studio生成apk教程_android

Build->Generate signed APK

选择你想要的module,点击导航栏的Build选项,选择Generate signed APK,这里我们可以新建或者使用已有的key,来编译并生成apk。

Android stdio生成桌面 android studio生成apk教程_android studio_02

使用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表明编译成功。

Android stdio生成桌面 android studio生成apk教程_android studio_03

使用gradle命令生成Apk

当你配置了gradle的环境(配置GRADLE_HOME,并把GRADLE_HOME/bin加到path里),你可以直接使用gradle命令来生成apk,使用方式和之前介绍的gradlew一样。

Gradle Projects面板

打开主界面右边栏中的Gradle Projects,点击刷新按钮。会在界面中显示出项目中所有的Gradle任务,选择你想要执行的任务,双击就会开始执行。

Android stdio生成桌面 android studio生成apk教程_签名_04

双击如图中 assembleDebug或者assembleRelease就会编译出Debug或者Release版本的Apk。

和在Terminal中执行gradlew assmbleDebug命令一样。

Android stdio生成桌面 android studio生成apk教程_打包_05

签名配置

在Project Structure中可以预先配置签名Key,在后面的编译打包中直接使用。如图中箭头所示,你可以增加一个新的配置,选择你想要的Key。如何使用这个配置,将会在下面接着介绍。

Android stdio生成桌面 android studio生成apk教程_打包_06

然后我们来看下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, 当然我们也可以再增加新的不同的版本。

Android stdio生成桌面 android studio生成apk教程_android studio_07


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: 是否支持本地化整理, 默认为空

关于本地化整理介绍:

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配合使用来达到目的。项目中会有一个默认配置,先来看一下:

Android stdio生成桌面 android studio生成apk教程_Android stdio生成桌面_08


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中不能有相同包名的文件存在,否则会有编译错误。

Android stdio生成桌面 android studio生成apk教程_Android stdio生成桌面_09

采用如上的方法,基本已经能够解决不同的需求了。Gradle的编译打包就暂时先到这里。