Closed wangkunlin closed 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
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)
}
}
}
}
}
就是这个样子
@simpleton 我自己写的jenkins的resguard插件,混淆后,报错了。报的是
android.content.res.Resources$NotFoundException:File res/raw/a.ogg from drawable resource ID #0x7f060000
我只改了部分传入参数的代码啊。里面的混淆相关的我没动啊。请您看看可能是什么问题呢?
之前是在windows下用jar混淆的。raw下的资源没问题,是能正常获取到的。
如果使用绝对的文件名加载可以使用白名单(如使用getIdentifier
加载资源),可以不混淆该文件。 我们会混淆raw
这个folder名字,你可以在whiteList里增加raw
文件夹下的文件。
你的gradle插件的问题,我在example增加以下多渠道测试下。
@simpleton 我的keepRoot
是ture
的。并且也没有使用getIdentifier
加载资源。不了解哪里出问题了。
方便把你的apk发给我么? 我debug一下。 如果block你发布,可以先把raw文件夹下的资源加入白名单先。 email: sunsj1231@gmail.com
@simpleton 已发送。没有block发布,因为年底了,没啥事情,所以鼓捣自动化构建这东西呢。
我发现,即使加入白名单它也会报错,还是找不到。我想撞墙了。
@wangkunlin 我好像没有收到apk,可以再发一份么? sunsj1231@126.com,要不发到126邮箱吧。
@simpleton 额。不好意思,之前用公司邮箱发的,发现发送失败。我重新用gmail发了一份。
我这边的环境似乎混淆你的APK没有什么问题,我测试了下用多flavor来编译渠道包似乎也没什么问题。
你提出的Task andresguardnot found in root project XXXX
应该只是运行路径的问题
那好吧。我在仔细找找问题。麻烦您了!
不客气,有什么问题再提出来。
用了andresguard说找不到Task andresguardnot found in root project 'XXXX'.不能build完成之后自己就开始资源混淆么?我们的工程用了多渠道,并且自定义了apk的输出目录,还有就是使用的是jenkins自动化构建。即使上面的task不报错,但是能找到我的apk在哪么?我目前正在写jenkins的build插件。今天来github看看发现已经有了gradle插件了。所以试了试。