Android Studio基础之生成Apk(六)-学习篇

9 篇文章 0 订阅
8 篇文章 0 订阅

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

常见的使用

点击工具上的Run&Debug

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

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

使用gradle命令生成Apk

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

Gradle Projects面板

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

双击如图中 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, 当然我们也可以再增加新的不同的版本。
Build Types
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配合使用来达到目的。项目中会有一个默认配置,先来看一下:
Flavors
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的编译打包就暂时先到这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值