美文网首页
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