美文网首页
2019-04-05 android 配置生成apk

2019-04-05 android 配置生成apk

作者: 每天坚持一点 | 来源:发表于2019-04-05 22:20 被阅读0次

    app/build.gradle 文件

    第一步:

        1.主要是通过gradle语言中的alllicationVarient变量all方法获取所有值,继而对all遍历varient->varient.outputs.each,通过output变量中的processManifest中的doLast业务:
    

    第二步:

       2:处理doLast的业务时:拼接对应的位置的AndroidManifest.xml,继而进行替换文件中的指定的字符串的值umeng_channel_value指定字符的值!
    

    第三步:

       3:通过判断varient.productFlavors[0].name名称是否为指定一个固定的"devloper"名称,如果是:将AndroidManifest文件中的第三方的key替换成 gradle.properties文件中一些常量值!反之,替换成一些另外的一些值!
    

    第四步:

      4:将mainfest文件路径,通过java文件对象将替换后字符串内容,写入到文件中!
    
     output.processResources.manifestFile = 
             file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml")
    

    具体的代码逻辑:

        android.applicationVariants.all { variant ->
         variant.outputs.each
                 {
                     output ->
                         output.processManifest.doLast {
                             //之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
                             //${buildDir}是指./build文件夹
                             //${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
                             //下面的路径是类似这样:./build/manifests/GooglePlay/release/AndroidManifest.xml
    //                            System.out.println("develop output.dirName:"+${output.dirName}+"..variant.productFlavors[0].name:"+variant.productFlavors[0].name+"..
    
                              output.productFlavors[0].name:"+output.productFlavors[0].name);
    //                            System.out.println("develop output.dirName:"+${output.dirName});
                             def manifestFile =      
                            "${buildDir}/intermediates/manifests/full/${output.dirName}/AndroidManifest.xml"
    //                            System.out.println("develop variant.productFlavors[0].name:" + output.productFlavors[0].name);
                             //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
                             def updatedContent = new File(manifestFile).getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
                             //替换包名、appkey
                             if ("devlop".equalsIgnoreCase("${variant.productFlavors[0].name}")) {
                                 System.out.println("develop");
                                 updatedContent = updatedContent.replaceAll("UMENG_APPKEY_VALUE", "${project.UMENG_APPKEY_VALUE_DEBUG}").
                                         replaceAll("JPUSH_APPKEY_VALUE", "${project.JPUSH_APPKEY_VALUE_DEBUG}").
                                         replaceAll("NETEASE_APPKEY_VALUE", "${project.NETEASE_APPKEY_VALUE_DEBUG}");
                             } else {
                                 System.out.println("develop else");
                                 updatedContent = updatedContent.replaceAll("UMENG_APPKEY_VALUE", "${project.UMENG_APPKEY_VALUE_PRODUCT}").
                                         replaceAll("JPUSH_APPKEY_VALUE", "${project.JPUSH_APPKEY_VALUE_PRODUCT}").
                                         replaceAll("NETEASE_APPKEY_VALUE", "${project.NETEASE_APPKEY_VALUE_PRODUCT}");
                             }
                             new File(manifestFile).write(updatedContent, 'UTF-8')
    //                            def testFile="D://${variant.productFlavors[0].name}.txt";
    //                            new File(testFile).write(updatedContent, 'UTF-8')
                             //将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
                             output.processResources.manifestFile = file("${buildDir}/intermediates/manifests/full/${variant.dirName}/AndroidManifest.xml")
    
                         }
                 }
           }
    
    
    

    第五步:

       5.需要将gradle.properties中的配置文件中的第三方平台的键appkey的信息动态地配置进来:
    
        UMENG_APPKEY_VALUE_DEBUG=58a26f4275ca3506ff00014a: 友盟测试环境下的key
        UMENG_APPKEY_VALUE_PRODUCT=58a26e70734be46f2b000243:友盟正式环境下的key
    
        JPUSH_APPKEY_VALUE_DEBUG=c43681960f7292c56b41280a: 极光测试环境下的key
        JPUSH_APPKEY_VALUE_PRODUCT=2d361c168b81de1a6d1a73d1 极光正式环境下的key
        NETEASE_APPKEY_VALUE_DEBUG=0ae09ff2cf01cf43d6e66d23ed87b0bf :云信测试环境下的key
        NETEASE_APPKEY_VALUE_PRODUCT=27b526714268b831ae835958fa0c40cf 云信正式环境下的key
    

    第六步:

       6:一般分构建类型和产品多配置打包类型:
           *构建类型中分为release 和debug 版,主要分别相关的签名相关的信息*
    
    具体代码如下
        signingConfigs {
        /**
         * 设置你的keystore相关
         * demo中只是一个示例,使用时请根据实际情况进行配置
         */
        debug {
            //keystore中key的别名
            keyAlias 'unipus'
            //keystore中key的密码
            keyPassword 'unipus'
            //keystore的文件路径,可以使绝对路径也可以是相对
            storeFile file('unipus.jks') 放入到当前路径下的jks的文件!
            //keystore的密码
            storePassword 'unipus'
        }
    
        release {
            //keystore中key的别名
            keyAlias 'unipus'
            //keystore中key的密码
            keyPassword 'unipus'
            //keystore的文件路径,可以使绝对路径也可以是相对
            storeFile file('unipus.jks') 放入到当前路径下的jks的文件!
            //keystore的密码
            storePassword 'unipus'
        }
    }
    

    .而多个产品配置打包,可能涉及到不同产品发布平台中的一些的配置信息,注意平台中一般 不在manifest文件不配置第三方开发的appkey!

       productFlavors {
        devlop {
            applicationIdSuffix ".dev" 将包名动态改变!
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet.dev",UMENG_CHANNEL_VALUE: 
                     name]
        }
        unipus {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
        }
    
        yingyongbao {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
        }
    
        zhushou360 {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
        }
    
        xiaomi {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
        }
    
        baidu {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
        }
    
        huawei {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
        }
    
        wandoujia {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name]
        }
    
    }
    

    注意开发项目时,一定要做好项目多个平台下的release和debug两种构建类型动态参数的设置

      buildTypes {
        debug {
            applicationIdSuffix ".dev" //测试环境下的包名
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet.dev",UMENG_CHANNEL_VALUE: name,NIM_PACKAGE:"cn.unipus.ispeak.cet.dev",UMENG_APPKEY_VALUE:"${project.UMENG_APPKEY_VALUE_DEBUG}",JPUSH_APPKEY_VALUE:"${project.JPUSH_APPKEY_VALUE_DEBUG}",NETEASE_APPKEY_VALUE:"${project.NETEASE_APPKEY_VALUE_PRODUCT}"]//对应第三方开发appKey配置
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        release {
            manifestPlaceholders=[JPUSH_PKGNAME:"cn.unipus.ispeak.cet",UMENG_CHANNEL_VALUE: name,NIM_PACKAGE:"cn.unipus.ispeak.cet",UMENG_APPKEY_VALUE:"${project.UMENG_APPKEY_VALUE_PRODUCT}",JPUSH_APPKEY_VALUE:"${project.JPUSH_APPKEY_VALUE_PRODUCT}",NETEASE_APPKEY_VALUE:"${project.NETEASE_APPKEY_VALUE_PRODUCT}"]
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            // 自定义输出配置
        }
        applicationVariants.all { variant -> //为最后生成apk文件命名!
            variant.outputs.each { output ->
                def outputFile = output.outputFile
                if (outputFile != null && outputFile.name.endsWith('.apk') && outputFile.name.contains("debug")) {
                    // 输出apk名称为iSpeak_v1.0_wandoujia.apk
                    def fileName = "iSpeak_v${defaultConfig.versionName}_${variant.productFlavors[0].name}_debug.apk"
                    output.outputFile = new File(outputFile.parent, fileName)
                }else if(outputFile != null && outputFile.name.endsWith('.apk') && outputFile.name.contains("release")){
                    // 输出apk名称为iSpeak_v1.0_wandoujia.apk
                    def fileName = "iSpeak_v${defaultConfig.versionName}_${variant.productFlavors[0].name}_release.apk"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    }    
    
    

    相关文章

      网友评论

          本文标题:2019-04-05 android 配置生成apk

          本文链接:https://www.haomeiwen.com/subject/ezxkiqtx.html