shwenzhang / AndResGuard

proguard resource for Android by wechat team
Apache License 2.0
8.54k stars 1.54k forks source link

用gradle怎么玩?求教 #33

Closed wangkunlin closed 8 years ago

wangkunlin commented 8 years ago

用了andresguard说找不到Task andresguardnot found in root project 'XXXX'.不能build完成之后自己就开始资源混淆么?我们的工程用了多渠道,并且自定义了apk的输出目录,还有就是使用的是jenkins自动化构建。即使上面的task不报错,但是能找到我的apk在哪么?我目前正在写jenkins的build插件。今天来github看看发现已经有了gradle插件了。所以试了试。

simpleton commented 8 years ago

@wangkunlin 可以贴一下你的build.gradle的代码片段,可以自动资源混淆,但是考虑不是每个人都需要出混淆过的包,就没直接做成assemble的postTask。下个版本也许会改,看大家觉得那种方便。

混淆过apk的位置位置就在你的${output_apk}/AndResProguard下面,未混淆的还在原位置。 以example工程为例,未混淆apk在./app/build/outputs/apk/app-release.apk 混淆的在./app/build/outputs/apk/AndResProguard/app-release_signed.apk

simpleton commented 8 years ago

@wangkunlin http://stackoverflow.com/questions/14093024/trying-gradle-build-task-build-not-found-in-root-project

wangkunlin commented 8 years ago
android.applicationVariants.all { variant ->
        def mBuildType = variant.buildType.name
        if (mBuildType.equalsIgnoreCase("release")) {
            variant.outputs.each { output ->
                output.processManifest.doLast {
                    def manifestDir = "${buildDir}/manifests/${variant.dirName}"
                    def manifestFile = manifestDir + "/AndroidManifest.xml"
                    def baseFile = output.processManifest.manifestOutputFile

                    def flavorsName = variant.productFlavors[0].name

                    def updatedContent = baseFile.getText('UTF-8').replaceAll("TD_CHANNEL_VALUE", flavorsName)
                    new File(manifestDir).mkdirs()
                    new File(manifestFile).write(updatedContent, 'UTF-8')
                    output.processResources.manifestFile = file(manifestFile)
                }
            }

            def flavorsName = variant.productFlavors[0].name

            def filePrefix = productVersion + apkPrefix + verName + "." + getSvnRevision() + "_" + flavorsName
            if (variant.buildType.zipAlignEnabled) {
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        output.outputFile = new File(outputFile.parent, filePrefix + apkSuffix)
                    }
                }
            } else {
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        output.outputFile = new File(outputFile.parent, filePrefix + "-" + unalignedSuffix)
                    }
                }
            }
        }

    }

就是这个样子

wangkunlin commented 8 years ago

@simpleton 我自己写的jenkins的resguard插件,混淆后,报错了。报的是

android.content.res.Resources$NotFoundException:File res/raw/a.ogg from drawable resource ID #0x7f060000 

我只改了部分传入参数的代码啊。里面的混淆相关的我没动啊。请您看看可能是什么问题呢?

wangkunlin commented 8 years ago

之前是在windows下用jar混淆的。raw下的资源没问题,是能正常获取到的。

simpleton commented 8 years ago

如果使用绝对的文件名加载可以使用白名单(如使用getIdentifier加载资源),可以不混淆该文件。 我们会混淆raw这个folder名字,你可以在whiteList里增加raw文件夹下的文件。

simpleton commented 8 years ago

你的gradle插件的问题,我在example增加以下多渠道测试下。

wangkunlin commented 8 years ago

@simpleton 我的keepRootture的。并且也没有使用getIdentifier加载资源。不了解哪里出问题了。

simpleton commented 8 years ago

方便把你的apk发给我么? 我debug一下。 如果block你发布,可以先把raw文件夹下的资源加入白名单先。 email: sunsj1231@gmail.com

wangkunlin commented 8 years ago

@simpleton 已发送。没有block发布,因为年底了,没啥事情,所以鼓捣自动化构建这东西呢。

wangkunlin commented 8 years ago

我发现,即使加入白名单它也会报错,还是找不到。我想撞墙了。

simpleton commented 8 years ago

@wangkunlin 我好像没有收到apk,可以再发一份么? sunsj1231@126.com,要不发到126邮箱吧。

wangkunlin commented 8 years ago

@simpleton 额。不好意思,之前用公司邮箱发的,发现发送失败。我重新用gmail发了一份。

simpleton commented 8 years ago

我这边的环境似乎混淆你的APK没有什么问题,我测试了下用多flavor来编译渠道包似乎也没什么问题。

你提出的Task andresguardnot found in root project XXXX 应该只是运行路径的问题

wangkunlin commented 8 years ago

那好吧。我在仔细找找问题。麻烦您了!

simpleton commented 8 years ago

不客气,有什么问题再提出来。