Android Studio 3.+ 使用gradle配置动态修改包名、图标、常量等,实现动态配置编译不同包名的APP和多渠道打包

Android Studio 3.1.3  + gradle 4.4 + build:gradle:3.1.3

示例代码已上传github https://github.com/weixx/gradle-package

 

配置差别化渠道包

app/build.gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

def releaseTime() {
    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}

android {
    // 签名文件
    signingConfigs {
        config {
            keyAlias '111111'
            keyPassword '111111'
            storeFile file('C:\\Users\\Administrator\\Desktop\\11.jks')
            storePassword '111111'
        }
    }


    compileSdkVersion 28
    defaultConfig {
//        applicationId "com.xx"
        minSdkVersion 18
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        signingConfig signingConfigs.config
    }

    flavorDimensions "version"
    // 多渠道/多环境 的不同配置
    productFlavors {
        dev {
            // 每个环境包名不同
            applicationId "com.xx.dev"
            // 动态添加 string.xml 字段;
            // 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
            resValue "string", "s1", "dev"
            // 动态修改 常量 字段
            buildConfigField "String", "ENVIRONMENT", '"dev"'
            // 修改 AndroidManifest.xml 里的变量
            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"dev",
                                    app_icon:"@mipmap/ic_launcher",
                                    app_name:"dev_myapp"]
            dimension "version"
        }
        stage {
            applicationId "com.xx.stage"

            resValue "string", "s1", "stage"

            buildConfigField "String", "ENVIRONMENT", '"stage"'

            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"stage",
                                    app_icon:"@mipmap/ic_launcher",
                                    app_name:"stage_myapp"]
            dimension "version"
        }
        prod {
            applicationId "com.xx.prod"

            resValue "string", "s1", "prod"

            buildConfigField "String", "ENVIRONMENT", '"prod"'

            manifestPlaceholders = [UMENG_CHANNEL_VALUE:"prod",
                                    app_icon:"@mipmap/ic_launcher",
                                    app_name:"prod_myapp"]
            dimension "version"
        }
    }

    //移除lint检测的error
    lintOptions {
        abortOnError false
    }

    buildTypes {
        debug {
            buildConfigField("boolean", "LOG_DEBUG", "true")
            signingConfig signingConfigs.config
        }

        release {
            buildConfigField("boolean", "LOG_DEBUG", "false")
            zipAlignEnabled true
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config

            // 批量打包,使用 .\gradlew assemble 命令编译打包所有配置的包
            android.applicationVariants.all {
                variant ->
                    variant.outputs.all {
                        outputFileName = rootProject.getName()+"_" + productFlavors[0].name + "_" + buildType.name + "_v" + defaultConfig.versionName + "-${releaseTime()}.apk"
                    }
            }

        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    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'
}

AndroidManifest.xml

<application
        <!-- 动态修改图标和名称 -->
        android:icon="${app_icon}"
        android:label="${app_name}"
        ...>
        <meta-data
            android:name="UMENG_CHANNEL"
            <!-- 动态修改渠道名 -->
            android:value="${UMENG_CHANNEL_VALUE}" />

        </activity...>
    </application>

创建差别化资源代码文件夹,为差别化APP指定特定的行为

main/res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#1B1A2A</color>
    <color name="colorPrimaryDark">#1B1A2A</color>
    <color name="colorAccent">#FF4081</color>
</resources>

dev/res/values/colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#1B1A2A</color>
    <color name="colorPrimaryDark">#888888</color>
    <color name="colorAccent">#FF4081</color>
</resources>

以上是为dev渠道的创建了一个特定的colors资源,在打包dev时所有的引用都将指向该文件,string等都类似与该道理,也可以再创建一个stage/res/values/colors.xml为stage指定特定的资源。

 

 

参考

https://blog.csdn.net/aiynmimi/article/details/68944830

https://www.jianshu.com/p/533240d222d3

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio使用 Gradle 构建工具进行编译打包,生成 .so 动态链接库,可以按照以下步骤进行: 1. 在 Android Studio 中创建一个 C/C++ 模块,选择 File -> New -> New Module -> C/C++ Library,然后按照向导设置模块名称、语言类型和支持的 ABI。 2. 在模块的 build.gradle 文件中,添加以下配置: ```groovy android { // 指定支持的 ABI,包括 armeabi-v7a、arm64-v8a、x86、x86_64 等 ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } // 配置 CMakeLists.txt 文件路径 externalNativeBuild { cmake { path "CMakeLists.txt" } } } // 配置 CMake 版本 cmake { version "3.10.2" } ``` 3. 在模块的 src/main 目录下创建 jni 文件夹,并将 C/C++ 代码放入该文件夹中。 4. 在 jni 文件夹下创建 CMakeLists.txt 文件,并编写编译选项和链接选项,指定生成 .so 文件的名称和路径,以及引入其他依赖库等。例如: ```cmake # 设置编译选项 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # 设置源文件路径 file(GLOB_RECURSE SOURCE_FILES "*.cpp") # 设置头文件路径 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # 配置动态库输出路径和名称 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) set(CMAKE_LIBRARY_OUTPUT_NAME "native-lib") # 引入其他依赖库 find_library(log-lib log) # 生成动态库 add_library(native-lib SHARED ${SOURCE_FILES}) target_link_libraries(native-lib ${log-lib}) ``` 5. 点击 Android Studio 工具栏中的 Build -> Make Project,进行编译打包,生成 .so 动态链接库。 6. 在模块的 build.gradle 文件中查看生成的 .so 文件路径,例如: ```groovy android { externalNativeBuild { cmake { path "CMakeLists.txt" } } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } ``` 以上就是在 Android Studio使用 Gradle 构建工具进行编译打包,生成 .so 动态链接库的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值