Android 开发技巧-以友盟为例在Android Studio利用gradle进行多渠道打包和apk签名发布

来源:互联网 发布:js application对象 编辑:程序博客网 时间:2024/05/21 06:26

自谷歌放弃对eclipse的维护,力推android studio时,其版本的更新迭代速度也是非常快的,而且开发的工程中经常需要用到gradle的相关操作。同时,gradle这款依赖管理工具也随之被大家广泛使用。可gradle它究竟是什么呢?到底有什么作用呢?

另外,每当项目开发完成准备发布到各大安卓应用市场时,相信此时作为项目开发人员来说简直头大,如果发布的应用市场数量小的话,可能多操作几次就完事了的,倘若是几十个应用市场的话,事实上apk的打包速度本身就慢,这样即浪费人力物力,同时也是非常没有效率的。

自从有了友盟统计SDK的发布,给大家带来不少便捷,除了平时对用户统计、错误分析等功能之外,友盟SDK同时还提供了多渠道快速打包的功能。废话说得有些多,下面将为大家介绍其常用用法、友盟多渠道打包以及apk的签名发布操作。

定义

Gradle是Android Studio默认的build工具,是基于一种JVM语言— Groovy,再加上DSL组成的。说白了一种依赖管理工具,它抛弃了基于XML的各种繁琐配置,使用起来也简单,语法也相对简洁很多。

功能

项目创建完成之后,默认生成两个build.gradle文件,一个位于工程根目录下,另一个位于app目录下。工程根目录下的build.gradle文件是针对全局的配置,里面包括仓库地址和gradle的版本,这里不做过多讨论。这里主要说下app目录下的build.gradle文件。常用的功能共包括了以下几点:

1)声明构建的项目类型

apply plugin: 'android'

2)设置编译android项目的参数

android {    //编译SDK的版本    compileSdkVersion 23    //编译的tools版本    buildToolsVersion "23.0.3"   defaultConfig {        //当前应用包名        applicationId "com.chenyk.androidkits"        //支持的最低版本        minSdkVersion 9        //支持的目标版本        targetSdkVersion 22        //版本号        versionCode 1        //版本名        versionName "1.0"        // dex突破65535的限制        multiDexEnabled true    }  }

3)签名配置

    signingConfigs {        debug {            keyAlias 'kits'            keyPassword '888888'            storeFile file("kitskeystore.jks")            storePassword '888888'        }        release {            //key别名            keyAlias 'kits'            //key密码            keyPassword '888888'            //密钥文件路径            storeFile file("kitskeystore.jks")            //密钥文件密码            storePassword '888888'        }    }

4)混淆设置

buildTypes {    release {        minifyEnabled true         //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,指定混淆规则文件        proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'                    signingConfig signingConfigs.release    }}

5)多渠道打包

 productFlavors {        googleplay {}        huawei {}        xiaomi {}        wandoujia {}        baidu {}        yingyongbao {}        android360 {}        uc {}        umeng {}        meizu{}        //批量配置        productFlavors.all { flavor ->            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]        }    }

6).so文件的导入

task copyNativeLibs(type: Copy) {    from fileTree(dir: 'libs', include: 'armeabi/*.so') into 'build/lib'}tasks.withType(Compile) {    options.encoding = "UTF-8"}tasks.withType(Compile) {    compileTask -> compileTask.dependsOn copyNativeLibs}clean.dependsOn 'cleanCopyNativeLibs'tasks.withType(com.android.build.gradle.tasks.PackageApplication) {     pkgTask ->pkgTask.jniFolders = [new File(buildDir, 'lib')]}

7)依赖库

dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])}

8)依赖包的定义

dependencies {    classpath 'com.android.tools.build:gradle:0.4'}

多渠道打包

1、友盟账号注册登录

友盟账号注册,按照步骤完成注册流程,方法简单,请自行完成。

2、SDK的下载

1)jar包下载:http://dev.umeng.com/analytics/android-doc/sdk-download ,下载完成后解压缩,并将jar包添加到libs目录下
2)gradle依赖配置:在build.gradle文件中添加以下配置

dependencies {     compile 'com.umeng.analytics:analytics:latest.integration'}

3、获取友盟appkey

1)进入友盟首页,选择应用统计,点击立即使用,进入到我的产品页面

这里写图片描述

2)添加新应用,按照提示信息填写相关资料后,提交并获取appkey

这里写图片描述

4、在AndroidManifest.xml中配置AppKey

添加以下相关权限,以及友盟相关参数

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <application ……>    ……    <activity ……/>        <meta-data            android:name="UMENG_APPKEY"            android:value="YOUR_APP_KEY" />        <meta-data            android:name="UMENG_CHANNEL"            android:value="Channel ID" />    </application>

这里简单说明下,YOUR_APP_KEY填入步骤3获取的appkey,并且我们是要进行多渠道的打包,这里的Channel ID需改为${UMENG_CHANNEL_VALUE}才能在打包的时候通过build.gradle文件中的productFlavors进行对应。

关于友盟SDK的集成步骤到此就ok了的,如若还有不明白的地方可参考友盟官方提供的集成文档。下面将开始讲述多渠道打包的配置步骤。

5、添加渠道包名,配置不同风格的app

  productFlavors {        googleplay {}        huawei {}        xiaomi {}        wandoujia {}        baidu {}        yingyongbao {}        android360 {}        uc {}        umeng {}        meizu{}        //批量配置        productFlavors.all { flavor ->            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]        }    }

最后在Terminal命令提示符中,输入命令 gradlew assembleRelease,等待打包工作的完成。打包完成之后,可以在 当前项目名称\app\build\outputs\apk\ 目录下查看已打包完成的apk列表。会不会觉得比以前打包的方式简单多了,效率也提升了不少。

这里写图片描述

当然这里还有一些其他的命令提供使用,比如:

gradlew assembleRelease //创建新任务打包所有渠道包的release版本apk
gradlew assembleDebug //创建新任务打包所有渠道包的debug版本apk
gradlew assemblebaiduRelease //创建新任务打包指定渠道包(百度)的release版本apk


打包的工作虽然已经完成,但大家都知道,此时打包的apk并没有进行签名,没有签名当然也就无法发布到应用市场。下面就说下apk是如何签名的,步骤相对来说比较简单。

apk签名发布

1)在Android Studio的菜单栏上依次选择Build->Generate Signed APK…

这里写图片描述

2)创建密钥库及密钥,点击“Create new…”按钮创建密钥库

这里写图片描述

这里注意一下信息项需填写哪些信息:

Key store path:密钥库文件的地址
Password/Confirm:密钥库的密码
Alias:密钥名称
Password/Confirm:密钥密码
Validity(years):密钥有效时间,一般默认25年
First and Last Name:密钥颁发者姓名
Organizational Unit:密钥颁发组织
City or Locality:城市
Country Code(XX):国家代码

4)点击Finish完成之后,到下一界面

这里写图片描述

5)点击Next按钮,并选择所有渠道或指定渠道,点击Finsh按钮,进行签名打包工作任务

这里写图片描述

等待所有渠道包签名打包完成后就可以发布到各大应用市场了的。

签名的方式还有另外一种哦,具体的操作是

在build.gradle文件中添加签名配置信息以及buildTypes配置信息如下:

 //签名配置    signingConfigs {        debug {            keyAlias 'kits'            keyPassword '888888'            storeFile file("kitskeystore.jks")            storePassword '888888'        }        release {            //key别名            keyAlias 'kits'            //key密码            keyPassword '888888'            //密钥文件路径            storeFile file("kitskeystore.jks")            //密钥文件密码            storePassword '888888'        }    }  buildTypes {        debug {            // 显示Log            buildConfigField "boolean", "LOG_DEBUG", "true"            // apk包名称后缀,用来区分release和debug            versionNameSuffix "-debug"            signingConfig signingConfigs.debug        }        release {            // 不显示Log            buildConfigField "boolean", "LOG_DEBUG", "false"            //开启混淆            minifyEnabled true            // 移除无用的resource文件            shrinkResources true            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,指定混淆规则文件            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'            signingConfig signingConfigs.release        }    }

注意,这里笔者把debug版本和release都设置同样的配置信息,在平常的开发过程中debug配置,可以使用android studio默认的配置信息即可。配置完成后,在Terminal命令提示符中,输入命令gradlew assembleRelease就可以了的。

这里写图片描述

在打包apk文件时,还可以对文件的名称进行修改,比如加入时间信息或者svn版本到apk文件名称中,方便查找apk等。下面将把打包的时间添加到apk名称中,具体代码如下:

  applicationVariants.all { variant ->                variant.outputs.each { output ->                    def outputFile = output.outputFile                    if (outputFile != null && outputFile.name.endsWith('.apk')) {                        // 输出apk名称为dt_android360_v1.0_0705114322.apk                        def fileName = "dt_${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${new Date().format("MMddhhmmss")}.apk"                        output.outputFile = new File(outputFile.parent, fileName)                    }                }            }

最后奉上完整版的build.gradle文件的全部内容,同时文件也加入了注释,方便读者阅读

apply plugin: 'com.android.application'android {    //编译SDK的版本    compileSdkVersion 23    //编译的tools版本    buildToolsVersion "23.0.3"    defaultConfig {        //当前应用包名        applicationId "com.chenyk.androidkits"        //支持的最低版本        minSdkVersion 9        //支持的目标版本        targetSdkVersion 22        //版本号        versionCode 1        //版本名        versionName "1.0"        // dex突破65535的限制        multiDexEnabled true    }    //执行lint检查,有任何的错误或者警告提示,都会终止构建,现将其关掉。    lintOptions {        abortOnError false    }    //签名配置    signingConfigs {        debug {            keyAlias 'kits'            keyPassword '888888'            storeFile file("kitskeystore.jks")            storePassword '888888'        }        release {            //key别名            keyAlias 'kits'            //key密码            keyPassword '888888'            //密钥文件路径            storeFile file("kitskeystore.jks")            //密钥文件密码            storePassword '888888'        }    }    buildTypes {        debug {            // 显示Log            buildConfigField "boolean", "LOG_DEBUG", "true"            // apk包名称后缀,用来区分release和debug            versionNameSuffix "-debug"            minifyEnabled false            zipAlignEnabled false            shrinkResources false            signingConfig signingConfigs.debug        }        release {            // 不显示Log            buildConfigField "boolean", "LOG_DEBUG", "false"            //开启混淆            minifyEnabled true            //Zipalign优化            zipAlignEnabled true            // 移除无用的resource文件            shrinkResources true            //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,指定混淆规则文件            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'            signingConfig signingConfigs.release            //修改输出文件的名称            applicationVariants.all { variant ->                variant.outputs.each { output ->                    def outputFile = output.outputFile                    if (outputFile != null && outputFile.name.endsWith('.apk')) {                        // 输出apk名称为dt_android360_v1.0_0705114322.apk                        def fileName = "dt_${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${new Date().format("MMddhhmmss")}.apk"                        output.outputFile = new File(outputFile.parent, fileName)                    }                }            }        }    }    //渠道Flavors,配置不同风格的app    productFlavors {        googleplay {}        huawei {}        xiaomi {}        wandoujia {}        baidu {}        yingyongbao {}        android360 {}        uc {}        umeng {}        meizu{}        //批量配置        productFlavors.all { flavor ->            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.4.0'    compile 'com.android.support:design:23.2.0'    compile project(':jpushkit')    compile project(':commkit')    compile project(':asynchttpkit')    compile project(':jskit')    compile project(':appkit')    compile project(':photokit')    compile project(':retrofitkit')    compile project(':zxingkit')}

版权声明:本文为博主原创文章,未经博主允许不得转载。

3 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 行驶证累计记分满12分后怎么办 行车证丢了被交警查到怎么办 手机摔了一下一半黑屏了怎么办 三星手机的显示屏插头坏了怎么办? 被普通的手机维修店骗了怎么办? 手机外屏裂了内屏进水了怎么办 小米2s手机忘了解锁图案怎么办 红米note5手机屏烂了怎么办 网上买好高铁票身份证没带怎么办 高铁票买好了身份证丢了怎么办 苏州园区社保卡丢了怎么办 大学办的社保卡丢了怎么办 毕业六年了大学社保卡丢了怎么办 医保卡丢了补办后卡里余额怎么办 银行卡丢了记不住卡号怎么办 哈尔滨医保卡挂失后又找到了怎么办 孩子在哈尔滨户口在外地医保怎么办 椒江二桥通行证被扣走了怎么办 住建委查到买房材料不真怎么办 房子租出去被别人又租出去了怎么办 在成都乘出租车房产证掉了怎么办 电信不限量卡限网速了怎么办 only实体店换货没有小票怎么办 运管所包车单不给盖章怎么办 上海留学生落户过了取号时间怎么办 电信固话怎么办才能显示自己公司 日本跟团签证没有资产证明怎么办 摇号手机号换了密码忘了怎么办 小客车摇号的账号密码忘了怎么办 去银行交违章罚款单子丢了怎么办 我的身份证被别人办了信用卡怎么办 北京驾驶证在深圳扣了分怎么办 c照一次被扣12分怎么办 教师资格证认定申请表填错了怎么办 外地车在北京违章没有牡丹卡怎么办 护士辞职了原单位不给延续怎么办 护士证注册的单位倒闭了怎么办 护士证注册的医院倒闭了怎么办 显示发货了但没物流信息怎么办 考科目三被别人举报了怎么办 科目一考了5没过怎么办