Android 多渠道打包的应用

2019/03/26 note 共 4373 字,约 13 分钟

如何简单的使用keystore文件为apk签名

  1. 在项目根目录下创建文件夹keystore,并将签名文件比如keystore1.jks放到目录下。
    比如创建的keystore1.jks文件,密码为pass4keystore;签名文件下有一个alias为itlgl,密码为pass4itlgl
  2. build.gradle文件下增加配置:
    android {  
     signingConfigs {  
         keystore1 {  
             keyAlias 'itlgl'  
             keyPassword 'pass4itlgl'  
             storeFile file('./keystore/keystore1.jks')  
             storePassword 'pass4keystore'  
         }  
     }  
     // 省略部分配置  
    	  
     buildTypes {  
         release {  
             minifyEnabled false  
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
             signingConfig signingConfigs.keystore1  
         }  
         debug {  
             signingConfig signingConfigs.keystore1  
         }  
     }  
    }  
    

    这样release版本和debug版本就都用keystore1.jks文件进行了签名

不同的渠道有不同的包名

android {  
    // android studio升级以后,需要在文件中加上一个这个  
    // https://blog.csdn.net/syif88/article/details/75009663  
    flavorDimensions "test"  
    productFlavors {  
        dev {  
            // 包名将被修改为com.itlgl.dev  
            applicationId "com.itlgl.dev"  
            // 也可以用下面这种后缀的方式,dev模式下将会在原有的applicationId后面缀上.dev  
            // applicationIdSuffix ".dev"  
        }  
  
        stage {  
            applicationId "com.itlgl.stage"  
        }  
  
        prod {  
            applicationId "com.itlgl.prod"  
        }  
    }  
}  

不同的渠道修改不同的versionName

android {  
    // android studio升级以后,需要在文件中加上一个这个  
    // https://blog.csdn.net/syif88/article/details/75009663  
    flavorDimensions "test"  
    productFlavors {  
        dev {  
            // versionName将被修改为xxx_dev  
            versionName "xxx_dev"  
            // 也可以用下面这种后缀的方式,dev模式下将会在原有的versionName后面缀上_dev  
            // versionNameSuffix "_dev"  
        }  
  
        stage {  
            versionName "xxx_stage"  
        }  
  
        prod {  
            versionName "xxx_prod"  
        }  
    }  
}  

不同渠道在资源文件添加不同字段

利用 resValue 来定义资源的值,顾名思义 res 底下的内容应该都可以创建,最后用 R.xxx.xxx 来引用。
如下就根据不同的类型,添加了不同的 app_name 字段,以及定义了 布尔值,可以通过 R.string.app_name 来引用。
注意,这里是添加,是在 string.xml 里面添加了一个字段app_name,所以在现有的 string.xml 中不能有这个字段,否则会报错!!!

android {  
    // android studio升级以后,需要在文件中加上一个这个  
    // https://blog.csdn.net/syif88/article/details/75009663  
    flavorDimensions "test"  
    productFlavors {  
        dev {  
            resValue "string", "app_name", "dev_myapp"  
            resValue "bool", "isrRank", 'false'  
        }  
        stage {  
            resValue "string", "app_name", "stage_myapp"  
            resValue "bool", "isrRank", 'true'  
        }  
        prod {  
            resValue "string", "app_name", "myapp"  
            resValue "bool", "isrRank", 'true'  
        }  
    }  
}  

通过以上我们大概可以推测出 color、dimen 也可以通过类似的方法添加。

不同渠道添加不同的常量到BuildConfig

  1. 在BuildConfig中定义字段
    android {  
     // android studio升级以后,需要在文件中加上一个这个  
     // https://blog.csdn.net/syif88/article/details/75009663  
     flavorDimensions "test"  
     productFlavors {  
         dev {  
             buildConfigField "String", "ENVIRONMENT", '"dev"'  
         }  
         stage {  
             buildConfigField "String", "ENVIRONMENT", '"stage"'  
         }  
         prod {  
             buildConfigField "String", "ENVIRONMENT", '"prod"'  
         }  
     }  
    }  
    
  2. 使用常量
    在我们自己的任意的类中,来直接通过 BuildConfig 就可以调用我们定义的字段。
    public class Constants {  
     public static final String ENVIRONMENT = BuildConfig.ENVIRONMENT;  
    }  
    

不同渠道,修改 AndroidManifest.xml 里渠道变量

  1. 在 AndroidManifest.xml 里添加渠道变量
    ```xml
... ...
2. 在 build.gradle 设置 productFlavors  
```gradle  
android {  
    // android studio升级以后,需要在文件中加上一个这个  
    // https://blog.csdn.net/syif88/article/details/75009663  
    flavorDimensions "test"  
    productFlavors {  
        dev {  
            manifestPlaceholders = [ENVIRONMENT: "dev",  
                                    app_icon   : "@drawable/icon_dev"]  
        }  
        stage {  
            manifestPlaceholders = [ENVIRONMENT: "stage",  
                                    app_icon   : "@drawable/icon_stage"]  
        }  
        prod {  
            manifestPlaceholders = [ENVIRONMENT: "prod",  
                                    app_icon   : "@drawable/icon_prod"]  
        }  
    }  
}  

不同环境,引用不同的 module

这个就很强大了,根据不同的环境,引用对应的 module。
你可以替换大量的图片,string,color,vaule等等。

首先,要建立跟渠道对应的 module,然后再引用。
引用方式如下:

dependencies {  
    compile fileTree(dir: 'libs', include: ['*.jar'])  
  
    // 引用本的项目  
    devCompile project(':devModule')  
    stageCompile project(':stageModule')  
    prodCompile project(':prodModule')  
  
    // 也可以分渠道引用网络的。因为这里都相同,所以地址也就都一样了  
    devCompile 'com.roughike:bottom-bar:2.0.2'  
    stageCompile 'com.roughike:bottom-bar:2.0.2'  
    prodCompile 'com.roughike:bottom-bar:2.0.2'  
}  

如何修改不同渠道apk的名称

在gradle下添加:

android {  
    compileSdkVersion 27  
    defaultConfig {  
        applicationId "com.itlgl"  
        minSdkVersion 19  
        targetSdkVersion 27  
        versionCode 1  
        versionName "1"  
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"  
    }  
  
    // android studio升级以后,需要在文件中加上一个这个  
    // https://blog.csdn.net/syif88/article/details/75009663  
    flavorDimensions "test"  
  
    productFlavors {  
        dev {  
            versionNameSuffix "_dev"  
        }  
        stage {  
            versionNameSuffix "_stage"  
        }  
        prod {  
            versionNameSuffix "_prod"  
        }  
    }  
      
    // 生成的apk名字就变成了  
    // --build  
    // ----outputs  
    // ------apk  
    // --------dev  
    // ----------debug  
    // ------------xxx_1_dev.apk  
    // --------stage  
    // ----------debug  
    // ------------xxx_1_stage.apk  
    // --------prod  
    // ----------debug  
    // ------------xxx_1_prod.apk  
    android.applicationVariants.all { variant ->  
        variant.outputs.all {  
            outputFileName = "xxx_${defaultConfig.versionName}${variant.productFlavors[0].versionNameSuffix}.apk"  
        }  
    }  
}  

参考资料

文档信息

Search

    Table of Contents