Android動態配置ApplicationId,App名字,AppLogo


需求:同一套代碼,打一個京東,騰訊,小米的包,logo都是對應公司的logo,App名字為:京東,騰訊,小米
一、打開項目,在src目錄下,與main同級的地方,將要打的包新建三個文件夾,分別以jingdong,tengxun,xiaomi命名,在這三個文件夾下面就放着和其他兩個App不同的東西,比如logo圖片,App名字等,結構如圖:

strings.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">小米</string>
</resources>

styles.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
    </style>
</resources>

 

二、文件路徑app ==> src ==> main ==> AndroidManifest.xml 文件配置

<application
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher"
android:theme="@style/LaunchTheme"
tools:replace="android:allowBackup,icon,theme,label">
...
</application>

三、對App 的build.gradle(android ==> app ==> build.gradle)進行配置,其中主要是productFlavors的配置,

注意點:

flavorDimensions "default"

//不同APP的配置
productFlavors {
//TODO:....
}

配置如下

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

//打包時間
def releaseTime() {
    return new Date().format("yyyyMMddHHmm")
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    flavorDimensions "default"
    signingConfigs {
        debug {
            storeFile file('AndroidKeyStore')
            storePassword '1234567'
            keyAlias = 'keyforproject'
            keyPassword '123456'
        }
        release {
            storeFile file('AndroidKeyStore')
            storePassword '1234567'
            keyAlias = 'keyforproject'
            keyPassword '123456'
        }
    }
    compileSdkVersion 28

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    lintOptions {
        disable 'InvalidPackage'
    }

    //APP默認配置
    defaultConfig {

        applicationId = 'com.xiaoxiao.tengxun'
        signingConfig signingConfigs.debug

        minSdkVersion 16
        targetSdkVersion 28
        versionName "1.0.1"
        versionCode 10
//        versionCode flutterVersionCode.toInteger()
//        versionName flutterVersionName

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk {
            //選擇要添加的對應 cpu 類型的 .so 庫。
            abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'
        }

        manifestPlaceholders = [
                JPUSH_PKGNAME : applicationId,
                JPUSH_APPKEY : "appkey", // NOTE: JPush 上注冊的包名對應的 Appkey.
                JPUSH_CHANNEL : "developer-default", //暫時填寫默認值即可.
        ]

    }

    //不同APP的配置
    productFlavors {
        jingdong {
            applicationId "com.xiaoxiao.jingdong"
            resValue "string", "app_name", "jingdong"
            manifestPlaceholders = [CHANNEL_VALUE: "jingdong"
                                    ,app_icon   : "@mipmap/ic_launcher"]
        }
        tengxun {
            applicationId "com.xiaoxiao.tengxun"
            resValue "string", "app_name", "tengxun"
            manifestPlaceholders = [CHANNEL_VALUE: "tengxun"
                                    ,app_icon   : "@mipmap/ic_launcher"]
        }
        xiaomi {
            applicationId "com.xiaoxiao.xiaomi"
            resValue "string", "app_name", "xiaomi"
            manifestPlaceholders = [CHANNEL_VALUE: "xiaomi",
                                    app_icon   : "@mipmap/ic_launcher",
                                    JPUSH_PKGNAME : applicationId,
                                    JPUSH_APPKEY : "appkey", // NOTE: JPush 上注冊的包名對應的 Appkey.
                                    JPUSH_CHANNEL : "developer-default", //暫時填寫默認值即可.
            ]
        }
    }

    buildTypes {
        //測試版本
        debug {
            /* 簽名類型 */
            signingConfig signingConfigs.debug
            /* 是否開啟代碼混淆,默認false */
            minifyEnabled false
            /* 是否應該生成可調試的apk */
            debuggable true
            /* 混淆規則配置文件 */
//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            /* 自定義buildType */
//            buildConfigField 'String', 'BASE_URL', '"http://api-debug.**/"'
        }

        //生產版本
        release {
            /* 簽名類型 */
            signingConfig signingConfigs.release
            /* 是否開啟代碼混淆,默認false */
            minifyEnabled false
            /* 是否應該生成可調試的apk */
            debuggable false
            /* 移除無用的resource文件 */
//            shrinkResources true
            /* 混淆規則配置文件 */
//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            /* 自定義buildType */
//            buildConfigField 'String', 'BASE_URL', '"http://api-release.**/"'
        }

        //預生產版本
        /* 從給定的構建類型復制所有屬性 */
        pre.initWith(release)
        pre {
            buildConfigField "String", "BASE_URL", "http://api-pre.**/"
            matchingFallbacks = ['pre', 'debug', 'release']
        }


    }

//      當執行"Generate Signed Bundle or APK"時候,取消注釋,生成apk文件名
//    android.applicationVariants.all { variant ->
//        variant.outputs.all { output ->
//            def outputFile = output.outputFile
//            if (outputFile != null && outputFile.name.endsWith('.apk')) {
//                //這里修改apk文件名
//                def fileName = "hu_${variant.productFlavors[0].name}-${defaultConfig.versionCode}-${defaultConfig.versionName}-${releaseTime()}.apk"
//                //def fileName = outputFile.name.replace("app", "${rootProject.ext.appName}-${releaseTime()}-${defaultConfig.versionCode}-${defaultConfig.versionName}")
//                //                output.outputFile = new File(outputFile.parent, fileName)
//                outputFileName = fileName
//            }
//        }
//    }


}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

 

參考鏈接

Android動態配置ApplicationId,App名字,AppLogo

一次搞懂Android簽名文件的生成與配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM