需求:同一套代碼,打一個京東,騰訊,小米的包,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' }
參考鏈接