Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android 多渠道打包的应用 #36

Open
itlgl opened this issue Mar 26, 2019 · 0 comments
Open

Android 多渠道打包的应用 #36

itlgl opened this issue Mar 26, 2019 · 0 comments
Labels
Android Android

Comments

@itlgl
Copy link
Owner

itlgl commented Mar 26, 2019

如何简单的使用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"'
        }
    }
}
  1. 使用常量
    在我们自己的任意的类中,来直接通过 BuildConfig 就可以调用我们定义的字段。
public class Constants {
    public static final String ENVIRONMENT = BuildConfig.ENVIRONMENT;
}

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

  1. 在 AndroidManifest.xml 里添加渠道变量
<application
    android:icon="${app_icon}"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    ...
    <meta-data
        android:name="UMENG_CHANNEL"
        android:value="${ENVIRONMENT}" />
    ...
</application>
  1. 在 build.gradle 设置 productFlavors
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"
        }
    }
}

参考资料

@itlgl itlgl added the Android Android label Sep 22, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Android Android
Projects
None yet
Development

No branches or pull requests

1 participant