友盟分享,Android打包之多版本

2019-10-01 14:35 来源:未知

老婆保佑,代码无BUG

小弟原创文章,转载烦请注明本文出处http://www.jianshu.com/p/5e15b886d7fe
感觉自己堕落了,三个月没更任何东西 o(╥﹏╥)o

在平时的Android开发中,我们经常会遇到在不同网络环境(比如:开发环境、测试环境)之间的切换、一次打多个渠道包等需求,如何优雅的管理网络环境的配置?如何快速的打出多个渠道包?这是一个值得研究的问题。


前言

像这些第三方接入,还都是蛮简单的,基本上按照文档就可以完成(排除有一些文档不全的需要趟坑),记录这些主要是给新手朋友一点参考吧。

如果每一次在不同网络环境间切换,都需要更改代码,然而重新打包,那未免有点低效。下面是我的实践探索,看网上很多人都是根据buildType来切换网络环境,感觉有点不好,因为网络环境可能很多种,而buildType我们一般是2种,而且,不同网络环境的包最好能同时安装在手机上,以便我们调试。最好,我一看这个包的名称和图标,就能知道这是什么环境的包。

前言

开发环境

  • MAC
  • AS 3.0

1.去友盟平台注册一个账号

图片 1

获取你应用的Appkey.png

基于buildTypes

目录

  • 一:程序签名
    • (1)选择Generate Signed APK
    • (2)新建一个签名文件
    • (3)填写信息
  • 二:友盟多渠道打包
  • (1) 友盟集成文档
    • 工程build.gradle配置
    • 添加相关权限
    • 代码混淆
    • AndroidManifest清单配置文件方式初始化appkey和channel
  • (2) 配置多渠道打包
    • 修改manifest的应用配置
    • 首先要添加一个 渠道号
    • 配置打包相关
    • 配置多渠道打包
    • 如何解决出现的异常
    • 修改生成APK 的路径
    • 查看渠道

2.然后选择你需要集成的产品,比如这里选择是“应用统计”

图片 2

选择你要接入的服务.png

debug:调试版本,无混淆release:发布版本,有混淆、压缩

一:程序签名

3.下载对应的SDK,解压,导入到你的项目中

导入SDK有以下两种方法,选其中一种即可 。
(1) eclipse开发环境SDK集成

将需要的jar包拷贝到本地工程libs子目录下;在Eclipse中右键工程根目录,选择 Properties -> Java Build Path -> Libraries ,然后点击Add External JARs... 选择指向jar的路径,点击OK,即导入成功。(ADT17及以上不需要手动导入)

(2)使用Android Studio导入SDK

Android Studio是谷歌推出了新的Android开发环境,友盟+支持AndroidStudio的Gradle配置,如您使用Android Studio开发,请在您的App对应build.gradle文件中加入对统计SDK和Common通用组件库的依赖:

dependencies
{
    compile file(dir:'libs',include:['umeng-analytics-7.x.0.jar'])
    compile file(dir:'libs',include:['umeng-common-1.x.0.jar'])
}

基于productFlavors

(1)选择Generate Signed APK

屏幕快照 2018-01-09 上午9.35.54.png

4.配置APPKEY

manifest的配置主要包括添加权限,代码示例如下:

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

第一个<meta-data>中name填你appkey的名字(你自己取的),后面value里面填你刚刚在友盟平台为该应用申请的appkey值(是24位数字加字母的组合)
其实这个时候,友盟统计的基本集成已经完了,如果有更多的需求,比如需要自定义统计事件,可以看友盟的文档友盟文档的链接在这里(点击即可跳转)

第二个<meta-data>的配置是为了方便你多渠道打包用(不需要的可以不添加),name填你的为多渠道打包取得名字(你自己取得),value的值,为了方便建议你写成如下样式,方便在build.gradle文件中配置

<meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}"/>

build.gradle文件中android闭包中添加如下代码

   /* 友盟多渠道打包 */
    productFlavors {
        yingyongbao {}
        wandoujia {}
        baidu {}
        c360 {}
        uc {}
        xiaomi {}
        huawei {}
        c91shouji {}
        meizu {}
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    }

develop:开发环境,开发和自测时使用check:测试环境,克隆一份生产环境的配置,在这里测试通过后,再发布到生产环境。之所以没命名为test是因为在gradle编译时:ProductFlavor names cannot start with 'test'product:生产环境,正式提供服务的。

(2)新建一个签名文件

WX20180109-093917@2x.png

5.配置完上面的多渠道

在AndroidStudio菜单栏Build-->Generate signed APK-->选择你的签名文件(或者创建你的签名文件)后会看到如下:

图片 3

Generate signed APK.png

点击finish,稍等片刻就会打包成功

图片 4

打包成功之后的APK.png

这些APK文件可以正式上架到各大应用平台(可能有些平台会要求你进行加固)
································································分割线·····················································

基于Android新的应用签名方案APK Signature Scheme v2中的APK Signing Block区块

(3)填写信息

WX20180109-094212@2x.png

友盟分享

我这里使用的是美团封装的Walle库。使用Walle库请确保你的Android Gradle 插件版本在2.2.0以上。

二:友盟多渠道打包

1.同上面的友盟统计一样,首先要为你的应用申请appkey(如果该应用已经接入友盟其它服务,你这个appkey将会和之前的一样)

为什么不直接使用productFlavors来打包多渠道?因为productFlavors打多渠道包太慢了,打30个包差不多十几分钟,无法忍受!

(1) 友盟集成文档

2.下载SDK,并解压,解压之后如下

图片 5

解压之后如下.png

为什么不使用美团之前基于META-INF进行渠道标识的方案?因为Android7.0之后的这种黑科技已经失效了!

友盟官网

3.按照文档要求,拷贝对应的jar和res到你的项目中(解压文件中有一个集成工具,方便你拷贝文件),双击打开

图片 6

友盟集成工具.png

勾选你要分享的平台,选择你的开发工具,点击OK之后,会生成umeng_integratetool_result一个文件夹:
将对应的文件内容拷贝进入你的工程中即可。

图片 7

拷贝对应的文件进你的工程中.png

在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖, 如下:

工程build.gradle配置

dependencies {
    compile 'com.umeng.sdk:common:latest.integration'
    compile 'com.umeng.sdk:analytics:latest.integration'
}
4.添加回调Activity(这里添加的也需要在Manifest 中配置)

根据你要分享的平台(微信,QQ,新浪微博),添加不同的回调Activity
具体的友盟文档上很详细http://dev.umeng.com/social/android/quick-integration#1_3

buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.meituan.android.walle:plugin:1.0.3' }}

添加相关权限

<!-- 必须的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<!-- 推荐的权限 -->
<!-- 添加如下权限,以便使用更多的第三方SDK和更精准的统计数据 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
5.注意Android6.0权限适配

在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的aar

代码混淆

-keep class com.umeng.commonsdk.** {*;}
apply plugin: 'com.android.application'apply plugin: 'walle'android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } signingConfigs { release { keyAlias KEY_ALIAS keyPassword KEY_PASSWORD storeFile rootProject.file(KEYSTORE_FILE) storePassword KEYSTORE_PASSWORD } } buildTypes { //调试版本,无混淆 debug { minifyEnabled false signingConfig signingConfigs.release } //发布版本,有混淆 release { minifyEnabled true zipAlignEnabled true shrinkResources true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { //开发环境 develop { buildConfigField "int", "ENV_TYPE", "1" applicationId 'om.soubu.walledemo.develop' manifestPlaceholders = [ app_name: "开-WalleDemo", app_icon: "@drawable/icon_develop" ] } //测试环境 check { buildConfigField "int", "ENV_TYPE", "2" applicationId 'om.soubu.walledemo.check' manifestPlaceholders = [ app_name: "测-WalleDemo", app_icon: "@drawable/icon_check" ] } //生产环境 product { buildConfigField "int", "ENV_TYPE", "3" applicationId 'com.soubu.walledemo.product' manifestPlaceholders = [ app_name: "WalleDemo", app_icon: "@drawable/icon_product" ] } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12' compile 'com.meituan.android.walle:library:1.0.3'}

AndroidManifest清单配置文件方式初始化appkey和channel

<manifest>
    <application ……>
        ……
        <meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> 
        <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/> 
    </application>    
</manifest>

这里,我根据不同的环境生成了不同包名的apk,方便在手机上同时安装多个环境的应用。为了让gradle动态更改apk的名称和图标,我们需要在manifest文件中使用${app_icon}、${app_name}等占位符

(2) 配置多渠道打包

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:andro package="com.soubu.walledemo"> <application android:allowBackup="true" android:icon="${app_icon}" android:label="${app_name}" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application></manifest>

修改manifest的应用配置

<manifest>
    <application ……>
        ……
      <meta-data android:value="YOUR_APP_KEY" 
                 android:name="UMENG_APPKEY"/> <!--友盟 Appkey 自己应用注册申请来的-->
      <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" /> <!--渠道号,多渠道这里使用了占位符$-->

    </application>    
</manifest>

在代码中获取多渠道信息

首先要添加一个 渠道号

android {

        // AndroidManifest.xml 里面UMENG_CHANNEL的value为 ${UMENG_CHANNEL_VALUE}
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]//添加一个默认渠道号
    }
String channel = WalleChannelReader.getChannel(getApplicationContext;

配置打包相关

 signingConfigs {//签名配置
        release {//发布版签名配置
            storeFile file('/Users/allens/Desktop/umeng.jks')//密钥文件路径
            storePassword "123456"//密钥文件密码
            keyAlias "umeng"//key别名
            keyPassword "123456"//key密码
        }

        debug {
            storeFile file('/Users/allens/Desktop/umeng.jks')//密钥文件路径
            storePassword "123456"//密钥文件密码
            keyAlias "umeng"//key别名
            keyPassword "123456"//key密码
        }
    }


    buildTypes {

        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debug//设置签名信息
        }

        release {
            // 打开混淆
            minifyEnabled true
            // Zipalign优化
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release//设置签名信息
        }
    }

在代码中获取多环境信息

配置多渠道打包

 //多渠道打包支持
    productFlavors {
        Alpha {}//自己打包测试使用
        Tencent {}//投放应用宝市场
        Baidu {}//投放百度市场
        Wandoujia {}//投放豌豆荚市场
        PP {}//投放PP助手市场
        Qihoo {}//投放PP助手市场
        Vivo {}//投放vivo市场
        Oppo {}//投放oppo市场
        Xiaomi {}//投放小米市场
        Meizu {}//投放魅族市场
        Huawei {}//投放华为应用市场
        Lenovo {}//投放联想市场
        Letv {}//投放乐视市场
        Gionee {}//投放金立市场
        HiMarket {}//投放安卓市场

        //manifestPlaceholders 使用相关的值替换了UMENG_CHANNEL_VALUE 
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    }
int envType = BuildConfig.ENV_TYPE;

如何解决出现的异常

Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

这里的BuildConfig是由gradle动态生成的:

TAG标签:
版权声明:本文由金沙澳门官网4166发布于世界史,转载请注明出处:友盟分享,Android打包之多版本