gradle 다중 채널 패키지 구축(다중 응용 프로그램 Id, 다중 아이콘, 다중 app 이름)

어떻게 같은 코드를 이용하여 서로 다른 응용 프로그램 Id, 서로 다른 아이콘, 서로 다른 패키지 이름, 서로 다른 시작 페이지 등을 포장합니까?이때 신기-gradle을 구축하는 데 사용해야 한다.선상 부호
...
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android {
    compileSdkVersion 25
    buildToolsVersion '25.0.2'

    defaultConfig {
        applicationId "com.edt.edtdoctor"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 124
        versionName "1.2.4"

        ndk {
            abiFilters "armeabi"/*, "x86"*/
        }
        buildConfigField("String", "CHAT_DIRECTION", '"1"')
        buildConfigField("String", "XF_APPID", '"***"')
        buildConfigField("String", "CLIENT_ID", '"doctor"')
        buildConfigField("String", "WECHAT_KEY_VALUE", '"***"')
        //Enabling multidex support
        multiDexEnabled true
    }

    tasks.whenTaskAdded { task ->
        if (task.name.contains("lint")
                //  instant run   , clean    
                //||task.name.equals("clean")
                //        aidl          
                ||task.name.contains("Aidl")
                //              
                ||task.name.contains("mockableAndroidJar")
                ||task.name.contains("UnitTest")
                ||task.name.contains("AndroidTest")
                //   NDK JNI     
                //|| task.name.contains("Ndk")
                //|| task.name.contains("Jni")
        ) {
            task.enabled = false
        }
    }

    signingConfigs {
        release {
            try {
                storeFile file('./keystore/edt_edtdoctor.jks')
                keyAlias 'china'
                keyPassword '******'
                storePassword '******'
            } catch (ex) {
                throw new InvalidUserDataException(ex.toString())
            }

        }
        debug {
            storeFile file("./keystore/debug.keystore")
        }
    }
    //        (    androidManifest.xml)
    productFlavors {

        huawei {
            applicationId "com.edt.***"
            buildConfigField("boolean", "IS_DEVELOP", "false")
            resValue "string", "app_name", "appName"
            buildConfigField("String", "BUGLY_ID", '"***"')
            manifestPlaceholders = [JPUSH_APPKEY_VALUE  : "***",
                                    EASEMOB_APPKEY_VALUE: "***",
                                    UMENG_APPKEY_VALUE  : "***",
                                    UMENG_CHANNEL_VALUE : "huawei",
                                    START_BACKGROUND    : "@style/Splash_Theme",
                                    app_icon            : "@mipmap/ic_launcher"]
        }
        develop {
            applicationId "com.edt.***"
            buildConfigField("boolean", "IS_DEVELOP", "true")
            resValue "string", "app_name", "another"
            buildConfigField("String", "BUGLY_ID", '"***"')
            manifestPlaceholders = [JPUSH_APPKEY_VALUE  : "***",
                                    EASEMOB_APPKEY_VALUE: "***",
                                    UMENG_APPKEY_VALUE  : "***",
                                    UMENG_CHANNEL_VALUE : "develop",
                                    START_BACKGROUND    : "@style/Three_Splash_Theme",
                                    app_icon            : "@drawable/icon"]
        }

//        productFlavors.all { flavor ->
//            //UMENG_CHANNEL_VALUE  AndroidManifest.xml     ,        
//            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
//        }

    }


    lintOptions {
        tasks.lint.enabled = false
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false

    }

    configurations.all {
        resolutionStrategy.force 'com.android.support:support-annotations:23.0.1'
    }

    buildTypes {
        debug {
            manifestPlaceholders = [JPUSH_APPKEY_VALUE  : "***",
                                    EASEMOB_APPKEY_VALUE: "***",
                                    UMENG_APPKEY_VALUE: "***",
                                    START_BACKGROUND    : "@style/Splash_Theme",
                                    app_icon: "@mipmap/ic_launcher"]
            buildConfigField("String", "BUGLY_ID", '"***"')
            signingConfig signingConfigs.release
        }

        release {//         
            minifyEnabled false
            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   :   _   _  .apk
                        def fileName = "${variant.productFlavors[0].name}_v${defaultConfig.versionName}_${releaseTime()}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }

    aaptOptions {
        additionalParameters "--no-version-vectors"
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}
...

그 중에서 주목해야 할 것은 세 가지 부분:defaultConfig {},buildTypes {},productFlavors {} 이 세 부분은 모두 응용 프로그램 Id, 아이콘과 appname를 설정할 수 있지만 우선순위가 다르다.우선 순위는 다음과 같습니다.
buildTypes >  productFlavors > defaultConfig  

AndroidManifest를 설정합니다.xml의 속성은 manfestPlaceholders를 통해 설정할 수 있으며, 서로 다른 장면의 상수는buildConfigField를 통해 설정할 수 있으며, 자원의 인용은resValue를 통해 설정할 수 있다.
1. 다른 app 아이콘을 설정합니다.
1. 안드로이드 매니페스트에서.xml에서 icon의 속성 값을 ${app icon} (으)로 수정
 ".core.global.UserApplication"
        android:allowBackup="true"
        android:icon="${app_icon}"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

    ......

 </application>

2. 앱에서.gradle 파일 아래 "${app icon}"의 appicon의 값을 설정합니다.아래와 같다
manifestPlaceholders = [app_icon: "@mipmap/ic_launcher"]

주의: 일반적인 속성이면defaultConfig에서 설정할 수 있습니다.서로 다른 속성은 제품Flavors나buildTypes(debug 또는release 설정)를 통해 설정합니다.3. 컴파일링이 오타라면 다음과 같은 문장을 추가할 수 있다.
 lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false

    }

2. 서로 다른 앱 이름 설정
1. strings에 주석을 달다.xml의 appname의 자원
<resources>
    
    <string name="ToastError">string>
    <string name="sava_success">    string>
resources>

2. 앱에서.gradle 파일에서 app 설정name의 자원
resValue "string", "app_name", "app  "

3. 서로 다른 응용 프로그램 Id 수정
1. 안드로이드 매니페스트에서.xml에서 수정된 패키지의 이름은 ${applicationId}입니다. 아래와 같습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.edt.edtdoctor">
    <permission
        android:name="${applicationId}.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature"/>
    <uses-permission android:name="${applicationId}.permission.JPUSH_MESSAGE"/>
    <application
        android:name=".core.global.UserApplication"
        android:allowBackup="true"
        android:icon="${app_icon}"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".section.entry.controller.activity.StartActivity"
            android:theme="${START_BACKGROUND}">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            intent-filter>
        activity>
        <meta-data
            android:name="${applicationId}.GlideModule"
            android:value="GlideModule"/>
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="${UMENG_APPKEY_VALUE}"/>
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}"/>
        <meta-data
            android:name="DOMAIN_PACKAGE_NAME"
            android:value="${applicationId}"/>
        <meta-data
            android:name="EASEMOB_APPKEY"
            android:value="${EASEMOB_APPKEY_VALUE}"/>
        <meta-data
            android:name="JPUSH_CHANNEL"
            android:value="developer-default"/>
        <meta-data
            android:name="JPUSH_APPKEY"
            android:value="${JPUSH_APPKEY_VALUE}"/>
     application>

2. 앱에서.gradle 파일에서 서로 다른 채널에 따라 제품Flavors에서 설정하면 다음과 같다.
productFlavors {
        huawei {
            applicationId "com.edt.***"
        }
        develop {
            applicationId "com.edt.***"
        }

4. 기타 제3자 appkey의 설정, 참고 appicon의 설정 방식만 있으면 됩니다.
위의 설정을 완료한 후 Build > Generate Signed APK를 통해 서명을 선택한 후 다른 채널을 선택하여 포장할 수 있습니다.debug 상태에서 테스트를 진행하려면, 관련 코드를 buildTypes의 debug {}에 복사하면 됩니다.
주:위에 잘못된 곳이 있으면 고쳐 주십시오.
참고 자료:
Gradle 다중 채널 패키지(동적 설정 App 이름, 응용 아이콘, 상수 교체, 패키지 이름 변경, 채널 변경) 안드로이드--Gradle 소감, 변수, 다중 채널, 일부 구덩이는Gradle을 사용하여 여러 개의 서로 다른 응용 프로그램 Id 패키지를 구축한다.

좋은 웹페이지 즐겨찾기