Android - 打包之多渠道打包

作者: Allens_Jiang | 来源:发表于2018-01-09 11:56 被阅读143次
    老婆保佑,代码无BUG

    前言

    开发环境

    • MAC
    • AS 3.0

    目录

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

    一:程序签名

    (1)选择Generate Signed APK

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

    (2)新建一个签名文件

    WX20180109-093917@2x.png

    (3)填写信息

    WX20180109-094212@2x.png

    二:友盟多渠道打包

    (1) 友盟集成文档

    友盟官网

    工程build.gradle配置

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

    添加相关权限

    <!-- 必须的权限 -->
    <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" />
    
    

    代码混淆

    -keep class com.umeng.commonsdk.** {*;}
    

    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>
    

    (2) 配置多渠道打包

    修改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"]//添加一个默认渠道号
        }
    

    配置打包相关

     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]
            }
        }
    
    

    如何解决出现的异常

    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
    
    解决方案链接
    defaultConfig {
          ...
          //版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了
            flavorDimensions "versionCode"
        }
    

    修改生成APK 的路径

    android{
      ...
      applicationVariants.all { variant ->
            //这个修改输出的APK路径
            variant.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath + "/app/apk")
            variant.getPackageApplication().outputScope.apkDatas.forEach { apkData ->
                //这个修改输出APK的文件名
                apkData.outputFileName = "AppName-" +
                        variant.versionName + "_" +
                        variant.flavorName + "_" +
                        variant.buildType.name + "_" +
                        ".apk"
            }
        }
    }
    
    屏幕快照 2018-01-09 上午11.52.28.png

    查看渠道

    package com.allens.umengdemo;
    
    import android.content.Context;
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String umeng_channel = getAppMetaData(this, "UMENG_CHANNEL");
            Log.e("TAG", umeng_channel);
    
            TextView text = findViewById(R.id.text);
            text.setText(umeng_channel);
    
        }
    
        /**
         * 获取application中指定的meta-data
         *
         * @return 如果没有获取成功(没有对应值,或者异常),则返回值为空
         */
        public static String getAppMetaData(Context ctx, String key) {
            if (ctx == null || TextUtils.isEmpty(key)) {
                return null;
            }
            String resultData = null;
            try {
                PackageManager packageManager = ctx.getPackageManager();
                if (packageManager != null) {
                    ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
                    if (applicationInfo != null) {
                        if (applicationInfo.metaData != null) {
                            resultData = applicationInfo.metaData.getString(key);
                        }
                    }
                }
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            return resultData;
        }
    }
    
    

    相关文章

      网友评论

        本文标题:Android - 打包之多渠道打包

        本文链接:https://www.haomeiwen.com/subject/cthwnxtx.html