美文网首页
微信AndResGuard和packer-ng-plugin组合

微信AndResGuard和packer-ng-plugin组合

作者: TMAC_EAH | 来源:发表于2017-10-21 16:56 被阅读0次
 release {           
            signingConfig signingConfigs.release
            debuggable true
            minifyEnabled true
            shrinkResources true //删除无用资源
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

报错:

* What went wrong:
A problem was found with the configuration of task ':app:packageWin28Release'.
> File '/Users/mj/Android/xx/app/build/intermediates/res/resources-win28-release-stripped.ap_' specified for property 'resourceFile' does not exist.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

注:Gradle2.0以上的版本minifyEnabled字段为true时已经包含了shrinkResources,在代码优化时会自动去掉多余资源,所以在打正式包时也不需要设置shrinkResources字段。

解决方式是注释掉shrinkResources

 release {           
            signingConfig signingConfigs.release
            debuggable true
            minifyEnabled true
           // shrinkResources true //删除无用资源
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

集成:AndResGuard

github地址 AndResGuard

操作系统 mac

如果没有7zip 请下载 7 zip
如果没有brew 请下注 brew

  1. brew install p7zip

2.根据配置配置文件

apply plugin: 'AndResGuard'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.6'
    }
}

andResGuard {
    // mappingFile = file("./resource_mapping.txt")
    mappingFile = null
    // It will be invalid when you sign apk with schemeV2
    use7zip = true
    useSign = true
    // it will keep the origin path of your resources when it's true
    keepRoot = false

    whiteList = [
        // your icon
        "R.drawable.icon",
        // for fabric
        "R.string.com.crashlytics.*",
        // for google-services
        "R.string.google_app_id",
        "R.string.gcm_defaultSenderId",
        "R.string.default_web_client_id",
        "R.string.ga_trackingId",
        "R.string.firebase_database_url",
        "R.string.google_api_key",
        "R.string.google_crash_reporting_api_key"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.2.6'
        //path = "/usr/local/bin/7za"
    }

    /**
    * Optional: if finalApkBackupPath is null, AndResGuard will overwrite final apk
    * to the path which assemble[Task] write to
    **/
    finalApkBackupPath = "${project.rootDir}/final.apk"
    // digestalg = "SHA256" // 请注释掉它,如果你用v1签名,否则,下边的异常招呼你
}
Error:(60, 0) Could not set unknown property 'digestalg' for  use7zip = true
 useSign = true
 metaName = META-INF
 keepRoot = false
 whiteList = [R.drawable.icon, R.string.com.crashlytics.*, R.string.google_app_id, R.string.gcm_defaultSenderId, R.string.default_web_client_id, R.string.ga_trackingId, R.string.firebase_database_url, R.string.google_api_key, R.string.google_crash_reporting_api_key]
 compressFilePattern = [*.png, *.jpg, *.jpeg, *.gif, resources.arsc]
 finalApkBackupPath = /Users/mj/Android/People28/final.apk
         of type com.tencent.gradle.AndResGuardExtension.
<a href="openFile:/Users/mj/Android/People28/app/build.gradle">Open File</a>
FAILURE: Build failed with an exception.

* What went wrong:
Task 'resguard' is ambiguous in root project 'People28'. Candidates are: 'resguardDebug', 'resguardDev', 'resguardRelease', 'resguardWin28', 'resguardWin28Debug', 'resguardWin28Dev', 'resguardWin28Release'.

* Try:
Run gradlew tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 3 mins 16.307 secs

按照配置,到了这里,执行命令

============微信瘦身打包命令
gradlew clean resguardRelease
============微信瘦身打包命令

瘦身后,进行多渠道打包
gradle多渠道打包会很慢,我用的是这个打包神器
传送门
参考他的代码(多渠道打包与AndResGuard的结合)
传送地址

用了下面这个代码片段

project.afterEvaluate {
 //在Release后执行资源混淆,然后多渠道打包
 //打包命令 ./gradlew resguard
 tasks.getByName("resguard") {
     it.doLast {
         println 'channel package task begin'
         def oldName = VERSIO_NNAME +"_${releaseTime()}_release"
         def fileName = oldName + "_signed_7zip_aligned.apk"
         def rApk = new File("app/build/outputs/apk/AndResProguard_" + oldName+ "/" + fileName)
         if (rApk.exists()) {
             println 'resGuard apk exits begin channel package'
             packageChannel(rApk.absolutePath)
         }
     }
 }
}

这位老铁拼写的路径是
AndResProguard_
实际上是输出目录是这个
AndResGuard_

结果apk文件找不到

=瘦身apk全路径=
app/build/outputs/apk/AndResProguard_全民28-win28_v1.1.64/全民28-win28_v1.1.64_aligned_signed.apk
#########apk瘦身文件找不到啊########
##瘦身后apk文件地址

所以,无法进行多渠道打包
吭哧吭哧很久时间,发现路径是错的好吧,无论如何,在电脑中,你要先找到它才能使用它,我就犯了这个错

所以,复制代码时,请看清文件路径!!``请看清文件路径!!请看清文件路径!!

上我的配置吧,仅供参考

app 下 build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
//======== 打包工具和微信瘦身
apply plugin: 'AndResGuard'
apply plugin: 'packer'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.mcxiaoke.packer-ng:plugin:2.0.0'
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.6'
    }
}
andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    // add <your_application_id>.R.drawable.icon into whitelist.
    // because the launcher will get thgge icon with his name
    def packageName = "com.oneweone.allpeople"
    whiteList = [
            //for your icon
            packageName + ".R.drawable.icon",
            //for fabric
            packageName + ".R.string.com.crashlytics.*",
            //for umeng update
            packageName + ".R.string.umeng*",
            packageName + ".R.string.UM*",
            packageName + ".R.string.tb_*",
            packageName + ".R.layout.umeng*",
            packageName + ".R.layout.tb_*",
            packageName + ".R.drawable.umeng*",
            packageName + ".R.drawable.tb_*",
            packageName + ".R.anim.umeng*",
            packageName + ".R.color.umeng*",
            packageName + ".R.color.tb_*",
            packageName + ".R.style.*UM*",
            packageName + ".R.style.umeng*",
            packageName + ".R.id.umeng*"
    ]
    compressFilePattern = [
            "*.png",
            "*.jpg",
            "*.jpeg",
            "*.gif",
            "resources.arsc"
    ]
    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.2.6'
        //path = "/usr/local/bin/7za"
    }
    /**
     * Optional: if finalApkBackupPath is null, AndResGuard will overwrite final apk
     * to the path which assemble[Task] write to
     * 可选
     **/
    finalApkBackupPath = "${project.rootDir}/final.apk"
}
//================
android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    defaultConfig {
        applicationId "com.oneweone"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode rootProject.ext.versionCode
        versionName rootProject.ext.versionName
        multiDexEnabled true

//        manifestPlaceholders = [
//                GETUI_APP_ID    : "TXNBMXWZLu7mT4A8aoqkX4",
//                GETUI_APP_KEY   : "sqTPVHinMG6FLpCa0sE949",
//                GETUI_APP_SECRET: "HBvsuO41LWAd6RXvh7cwo3",
//                UMENG_APPKEY    : "5912b5656e27a46dac000c29",
//                UMENG_Channel_ID: "develop"
//        ]
        manifestPlaceholders = [
                GETUI_APP_ID    : "8Kpfve1PsA9OIDYDbYDEj2",
                GETUI_APP_KEY   : "LgeeTbRtZe7USktdAzYXr7",
                GETUI_APP_SECRET: "hzBZKPDfRG7yWFqs0brG4A"
        ]
        //x86
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"
        }
    }

    signingConfigs {
        debug {
            keyAlias ''
            keyPassword ''
            storeFile file('stockcode.jks')
            storePassword ''
        }
        release {
            keyAlias ''
            keyPassword ''
            storeFile file('stockcode.jks')
            storePassword ''
        }
    }

    buildTypes {
        debug {
            //shrinkResources true
            //buildConfigField "String", "RUN_URL", "\"http://stockapi.76iw.com\""
            //buildConfigField "String", "apiVersion", "\"v1.0\""
            signingConfig signingConfigs.debug
            applicationIdSuffix "allpeople"
            minifyEnabled false
            shrinkResources false //去除无用资源resource文件
            debuggable true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            manifestPlaceholders = [app_name: rootProject.ext.appname, icon: "@mipmap/ic_launcher"]
        }
        dev {
            //buildConfigField "String", "RUN_URL", "\"http://stockapi.76iw.com\""
            //buildConfigField "String", "apiVersion", "\"v1.0\""
            signingConfig signingConfigs.debug
            applicationIdSuffix "allpeople"
            debuggable true
            minifyEnabled true // 开启混淆
            //shrinkResources true //删除无用资源
            //===
            zipAlignEnabled true
            pseudoLocalesEnabled true
            //====
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            manifestPlaceholders = [app_name: rootProject.ext.appname, icon: "@mipmap/ic_launcher"]
        }

        release {
            //buildConfigField "String", "RUN_URL", "\"http://stockapi.76iw.com\""
            signingConfig signingConfigs.release
            applicationIdSuffix "allpeople"
            debuggable true
            minifyEnabled true //删除无用代码
            //shrinkResources true //删除无用资源
            //===
            zipAlignEnabled true
            pseudoLocalesEnabled true
            //====
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            manifestPlaceholders = [app_name: rootProject.ext.appname, icon: "@mipmap/ic_launcher"]
        }

    }

    productFlavors {
        //wandoujia {}
        win28 {}
//        sogou {}
        //       oppo {}
        //       vivo {}
        //       xiaomi {}
//        xdi28 {}
//        m360 {}
//        fenxiang{}
//        yingyongbao {}
        //qq {}
        // baidu {}
        //letv {}
        //a2pchina {}
        // haodaijinfu {}
        // develop {}
        // moren{}
        //meizu {}
        //jinli {}
        //eoe {}
        // huawei {}
        // goapk {}
        //lenovo {}
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [UMENG_Channel_ID: name]
        }

    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                // 前段
                def fileName = outputFile.name.replace("app", rootProject.ext.appnamechannel)
                // 中段
                fileName = fileName.replace("-debug", "_测试")
                fileName = fileName.replace("-dev", "_开发")
                fileName = fileName.replace("-qa", "_预发布")
                fileName = fileName.replace("-release", "")
                // 尾端
                fileName = fileName.replace(".apk", "_v${defaultConfig.versionName}.apk")
                output.outputFile = new File(outputFile.parent, fileName)
                println "===============apk打包完毕==============="
            }
        }
    }
    packagingOptions {
        exclude 'META-INF/rxjava.properties'
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
//========================打包
packer {
    archiveNameFormat = '${buildType}-v${versionName}-${channel}'
    archiveOutput = new File(project.rootProject.buildDir, "apks")
//    channelList = ['*Douban*', 'Google/', '中文/@#市场', 'Hello@World',
//                   'GradleTest', '20070601!@#$%^&*(){}:"<>?-=[];\',./']
//    channelFile = new File(project.rootDir, "markets.txt")
    channelMap = [
            "Cat" : project.rootProject.file("channels/cat.txt"),
            "Dog" : project.rootProject.file("channels/dog.txt"),
            "Fish": project.rootProject.file("channels/channels.txt")
    ]
}
project.beforeEvaluate {
    println "===============构建任务开始==============="
}

def packageChannel(String releaseApk) {
    try {
        println "##瘦身后apk文件地址##" + releaseApk
        def stdout = new ByteArrayOutputStream()
        exec {
            //执行python脚本打多渠道包
            //commandLine 'python', rootProject.getRootDir().getAbsolutePath() + "/app/ngpacker.py", releaseApk, rootProject.getRootDir().getAbsolutePath()+"/markets.txt", rootProject.getRootDir().getAbsolutePath() + "/build/archives"
            //commandLine 'sh',rootProject.getRootDir().getAbsolutePath()+ "/pack.sh"
//            def command = [
//                    'sh',rootProject.getRootDir().getAbsolutePath()+'/pack.sh'
//            ]
//            commandLine command
            executable "chmod +x " + rootProject.getRootDir().getAbsolutePath()+"/pack.sh"
            executable 'sh'
            args "-c",rootProject.getRootDir().getAbsolutePath()+"/pack.sh $releaseApk"
            standardOutput = stdout

            println "##python打包##"+stdout.toString().trim()+"||"
        }
        return stdout.toString().trim()
    } catch (ignored) {
        println "##未知错误##"+ignored
        return "##########未知错误##########";
    }
}
//全民28-win28_v1.1.63_aligned_signed.apk
project.afterEvaluate {
    println "===============构建任务收尾==============="

    tasks.getByName("resguardRelease") {
        it.doLast {
            println '===============多渠道打包开始===============' + rootProject.getRootDir().getAbsolutePath()
            //def oldName = VERSIO_NNAME +"_${releaseTime()}_release"
            def oldName = rootProject.ext.appnamechannel + "-win28_v" + rootProject.ext.versionName
            def fileName = oldName + "_aligned_signed.apk"
            println '=瘦身apk目录=' + oldName
            println '=瘦身apk目录下文件=' + fileName
            println '=瘦身apk全路径=' + rootProject.getRootDir().getAbsolutePath() + "/app/build/outputs/apk/AndResGuard_" + oldName + "/" + fileName
            println '=瘦身apk全路径=' + "app/build/outputs/apk/AndResProguard_" + oldName + "/" + fileName
            //def rApk = file(rootProject.getRootDir().getAbsolutePath() + "/app/build/outputs/apk/AndResProguard_" + oldName + "/" + fileName)
            String path = 'app/build/outputs/apk/AndResGuard_' + oldName + '/' + fileName;
            println '=瘦身apk目录-----=' + path
            def rApk = new File(path) //找不到文件,我日
            //def rApk = new File("/Users/mj/Android/People28/app/build/outputs/apk/quanmin-win28_v1.1.64.apk")
            //def rApk = file(new File("app/build/outputs/apk/AndResProguard_" + oldName + "/" + fileName))//找不到文件,日
            if (rApk.exists()) {
                println '#########apk已经瘦身,多渠道打包开始########'
                packageChannel(rApk.absolutePath)
            } else {
                println '#########apk瘦身文件找不到啊########'
                path = rootProject.getRootDir().getAbsolutePath() + '/app/build/outputs/apk/AndResGuard_' + oldName + '/' + fileName;
                println '##路径处理下##' + path
                packageChannel(path)
            }
        }
    }
}
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}
//========================打包 end

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
    compile 'com.jakewharton:butterknife:8.2.1'
    apt 'com.jakewharton:butterknife-compiler:8.2.1'
    compile 'com.android.support:appcompat-v7:25.+'
    compile 'com.zhy:autolayout:1.4.5'
    compile 'com.android.support:cardview-v7:25.+'
    compile 'com.android.support:recyclerview-v7:25.+'
    compile 'com.android.support:design:25.+'
    compile 'com.facebook.fresco:fresco:0.12.0'
    compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
    compile 'com.github.bumptech.glide:glide:3.7.0'
    compile 'com.umeng.analytics:analytics:latest.integration'
    //阿里热更新
    compile 'com.aliyun.ams:alicloud-android-hotfix:3.1.3'
    //打包工具
    compile 'com.mcxiaoke.packer-ng:helper:2.0.0'
    testCompile 'junit:junit:4.12'
    compile project(':base')
    compile project(':http')
    compile project(':uilib')
    compile project(':viselog')
    compile project(':common')
    compile project(':alpay')
    compile project(':push')
}

项目根目录 build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

//repositories {
//    mavenLocal()
//    //阿里云仓库
//    maven {
//        url "http://maven.aliyun.com/nexus/content/repositories/releases"
//    }
//    mavenCentral()
//    jcenter()
//    flatDir {
//        dirs 'libs'
//    }
//}

allprojects {
    repositories {
        jcenter()
//        maven {
//            url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
//        }
        //阿里云
        maven {
            url "http://maven.aliyun.com/nexus/content/repositories/releases"
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

project.ext {
    compileSdkVersion = 26
    buildToolsVersion = "26.0.0"
    minSdkVersion = 15
    targetSdkVersion = 26
    appname = "全民28"
    appnamechannel="quanmin" // 渠道,英文名称
    versionCode = 3
    versionName = "1.2.0"
    abortOnError = false //执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
    incremental = false
}

apk瘦身之后,进行脚本打包
pack.sh,开始是没有权限的,要了老命了,废了好大劲

Backup Final APk(V2) to /Users/mj/Android/People28/final.apk
<--AndResGuard Done! You can find the output in /Users/mj/Android/People28/app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0
===============多渠道打包开始===============/Users/mj/Android/People28
=瘦身apk目录=quanmin-win28_v1.2.0
=瘦身apk目录下文件=quanmin-win28_v1.2.0_aligned_signed.apk
=瘦身apk全路径=/Users/mj/Android/People28/app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
=瘦身apk全路径=app/build/outputs/apk/AndResProguard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
=瘦身apk目录-----=app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
#########apk已经瘦身,多渠道打包开始########
##瘦身后apk文件地址##/Users/mj/Android/People28/app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
##python打包##||
sh: /Users/mj/Android/People28/pack.sh: Permission denied
##未知错误##org.gradle.process.internal.ExecException: Process 'command 'sh'' finished with non-zero exit value 126

BUILD SUCCESSFUL

查看目录下权限

localhost:People28 mj$ ls -l
total 15376
-rw-r--r--   1 mj  staff      843 Aug 22 22:03 People28.iml
-rw-r--r--   1 mj  staff        0 Aug 14 17:22 README.md
drwxr-xr-x  11 mj  staff      374 Oct 21 16:54 alpay
drwxr-xr-x  21 mj  staff      714 Oct 21 16:55 app
drwxr-xr-x  10 mj  staff      340 Oct 21 16:55 base
drwxr-xr-x   4 mj  staff      136 Oct 21 16:55 build
-rw-r--r--   1 mj  staff     1452 Oct 21 11:38 build.gradle
drwxr-xr-x  10 mj  staff      340 Oct 21 16:54 common
-rw-r--r--   1 mj  staff        0 Sep  7 17:38 file
-rw-r--r--   1 mj  staff  7598819 Oct 21 16:55 final.apk
drwxr-xr-x   4 mj  staff      136 Aug 18 18:10 gradle
-rw-r--r--   1 mj  staff      760 Sep  5 19:45 gradle.properties
-rwxr-xr-x   1 mj  staff     4971 Aug 14 17:22 gradlew
-rw-r--r--   1 mj  staff     2314 Aug 22 21:49 gradlew.bat
drwxr-xr-x  10 mj  staff      340 Oct 21 16:55 http
-rw-r--r--   1 mj  staff      509 Oct 19 16:13 local.properties
-rw-r--r--   1 mj  staff       57 Oct 21 10:54 markets.txt
-rw-r--r--   1 mj  staff      593 Oct 21 16:08 pack.sh
-rwxr-xr-x   1 mj  staff   224451 Aug  8 20:32 packer-ng-2.0.0.jar
drwxr-xr-x   9 mj  staff      306 Oct 21 16:55 push
-rw-r--r--   1 mj  staff       99 Sep 19 17:56 settings.gradle
-rw-r--r--   1 mj  staff      873 Oct 21 15:57 tst.sh
drwxr-xr-x   9 mj  staff      306 Oct 21 16:54 uilib
drwxr-xr-x   9 mj  staff      306 Oct 21 16:55 viselog
drwxr-xr-x   7 mj  staff      238 Oct 21 16:54 weixinpay
localhost:People28 mj$ 

为脚本添加执行权限
chmod +x pack.sh
删除脚本执行权限
chmod -x pack.sh

localhost:People28 mj$ chmod +x pack.sh
localhost:People28 mj$ ls -l // 查看权限

执行命令

localhost:People28 mj$ gradlew clean resguardRelease 
<--AndResGuard Done! You can find the output in /Users/mj/Android/People28/app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0
===============多渠道打包开始===============/Users/mj/Android/People28
=瘦身apk目录=quanmin-win28_v1.2.0
=瘦身apk目录下文件=quanmin-win28_v1.2.0_aligned_signed.apk
=瘦身apk全路径=/Users/mj/Android/People28/app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
=瘦身apk全路径=app/build/outputs/apk/AndResProguard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
=瘦身apk目录-----=app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
#########apk已经瘦身,多渠道打包开始########
##瘦身后apk文件地址##/Users/mj/Android/People28/app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
##python打包##||

BUILD SUCCESSFUL

我用的是方式是文件来配置渠道

markets.txt
## ==========内容是============
xiaomi#小米渠道
oppo#
yingyongbao#应用宝
vivo#vivo

pack.sh脚本内容是

#! /bin/bash
## 测试
ROOT_PATH="/Users/mj/Android/People28"
echo '==============打包开始=============='
echo $1
## java -jar packer-ng-2.0.0.jar generate --channels=@markets.txt --output=build/archives app/build/outputs/apk/AndResGuard_quanmin-win28_v1.2.0/quanmin-win28_v1.2.0_aligned_signed.apk
## echo java -jar $ROOT_PATH/packer-ng-2.0.0.jar generate --channels=@markets.txt --output=$ROOT_PATH/build/archives $1
java -jar $ROOT_PATH/packer-ng-2.0.0.jar generate --channels=@$ROOT_PATH/markets.txt --output=$ROOT_PATH/build/archives $1
echo '==============打包完成=============='

关于路径,请自己配置,packer-ng-2.0.0.jar 请自行下载

参考图片

把渠道号注入项目,如果你用packer打包的话

在(MyApplication extends Application)自定义Application中,添加如下代码

  /**
     * 友盟渠道配置|使用快速打包时,会执行该代码进行代码配置<br/>
     */
    private void doUmengConfigs() {
        String markets = PackerNg.getChannel(this);
        //Logger.e("bug002", markets);
        if (!Tools.isEmpty(markets)) {
            String appkey = Config.APPKEY_FOR_UMENT;
            MobclickAgent.UMAnalyticsConfig config = new MobclickAgent.UMAnalyticsConfig(this, appkey, markets);
            //Logger.e("bug002", "#友盟appkey#" + appkey);
            MobclickAgent.startWithConfigure(config);
        }
    }

相关文章

网友评论

      本文标题:微信AndResGuard和packer-ng-plugin组合

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