本文章由情随事迁收集编写,转载请说明出处

混淆文件收集技巧

自动备份 mapping 混淆发布后对应的真实代码比对文件

applicationVariants.all { variant ->variant.outputs.each { output ->if (variant.getBuildType().isMinifyEnabled()) {variant.assemble.doLast{copy {from variant.mappingFileinto "${projectDir}/mappings"rename { String fileName ->"mapping-${variant.name}-${variant.versionName}_${variant.versionCode}.txt"}}}}}}

除此之外还可以切换test目录
将会在项目根目录/mappings/生成文件mapping-release-1.1_2.txt,这样解决了每次发布版本总是需要在build/outputs/release/mapping.txt中找到并移动出来进行备份的问题.
文件自定义字符串混淆的套路

android.applicationVariants.all {variant ->variant.each() {//buildTypeName:debug,appprintln("buildTypeName:" + variant.buildType.name+","+ this.project.name);}variant.each {myeach->//buildTypeName:release,myeach:releaseprintln("buildTypeName:" + variant.buildType.name+",myeach:"+myeach.name+",dir:"+myeach.outputs);}variant.outputs.each { output ->def fileName = "appname_v${variant.versionName}_release_${variant.flavorName}.apk"if (variant.buildType.isDebuggable()) {fileName = "appname_v${variant.versionName}_debug_${variant.flavorName}.apk"}println("fileName:"+fileName);
//            output.outputFile = new File(output.outputFile.parent, fileName)}variant.outputs.each {}
}

设置编译时间

buildConfigField "long", "BUILD_TIME", System.currentTimeMillis() + "L"

设置这个之后方便查看编译时间,哪怕是开发xposed插件 用这个可以方便查看是否更新生效,根据编译时间来判断.

设置各种目录仿造eclipse目录结构

//高仿eclipse结构sourceSets {main {
//            manifest.srcFile 'AndroidManifest.xml'
//            java.srcDirs = ['src']
//            resources.srcDirs = ['src']
//            aidl.srcDirs = ['src']
//            res.srcDirs = ['res']
//            assets.srcDirs = ['assets']jniLibs.srcDirs=['libs']}}

合并support版本

作用:解决第三方sdk无法修改但是不得不使用问题

configurations.all {resolutionStrategy.eachDependency { DependencyResolveDetails details ->def requested = details.requestedif (requested.group == 'com.android.support') {if (!requested.name.startsWith("multidex")&& !requested.name.startsWith("exifinterface")) {details.useVersion '24.2.1'//不设置24.2.1但是设置到了25就找不到布局,全部不管好像又冲突设置24.2.1 那么 要么冲突 要么       java.lang.NoSuchFieldError: No field notification_template_lines of type}}}
}

优化so库压缩体积排除其他平台可自动兼容

ndk {//APP的build.gradle设置支持的SO库架构abiFilters 'armeabi-v7a'}

这样的话夜神模拟器和真机测试时没毛病的,体积也节省了不少,QQ也是这样做的哈!
缺点就是开发工具会对于没有所指定的会强制不让运行,但是不这样指定的话,如果极光有5个so,但是自己只有一个armebi-v7a的,没法放开,放开也会崩溃,所以还是得下面得方法。

排除指定文件不打包

packagingOptions {exclude "lib/arm64-v8a/libimagepipeline.so"exclude "lib/x86/libsmssdk.so"exclude "lib/x86_64/libsmssdk.so"exclude "lib/mips/libsmssdk.so"exclude "lib/mips64/libqssq.so"}

只保留armebi-v7a

packagingOptions {exclude "lib/arm64-v8a/**"exclude "lib/x86/**"exclude "lib/armeabi/**"exclude "lib/mips/**"exclude "lib/mips64/**"exclude "lib/x86_64/**"}

这里只是演示排除非 armeabi-v7a 目录的so文件,除了排除so还可以排除资源文件哦!

统一协议标准跳转

manifestPlaceholders = [APP_SCHEME: "xxx", //]

xml对应代码

<activityandroid:name=".activity.EditUserInfoActivity"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.VIEW"></action><category android:name="android.intent.category.DEFAULT"></category><category android:name="android.intent.category.BROWSABLE"></category><dataandroid:host="profile"android:scheme="${APP_SCHEME}"></data></intent-filter></activity>

java对应代码

Intent intent=new Intent("xxx://profile");
startActivity(intent);

xml代码引用包名

${applicationId}这个变量就可以自动读取包名,版本号也是可以的哈.

<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_path" /></provider>

多个源代码文件夹指定

sourceSets {main {jniLibs.srcDirs = ['jniLibs']res.srcDirs = ['src/main/res','src/main/res_qssq']}}sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jni/'] } }

这样以后如果某个模块不要了,删除图片和布局文件,操作速度也是非常快的.
编译生成版本号

编译修改app-release.apk为app应用名称-版本名-版本号.apk

网上有些方法实际上是有bug的,需要经常刷新,每次改版本的时候或者时间变化的时候需要重新build,我这个方法没有bug.

archivesBaseName = "情迁神器${versionName} build_${versionCode}".replace(' ', '_')

这个东西放到defaultConfig节点下即可.

debug包自动签名

signingConfigs {debug {Properties properties = new Properties()properties.load(project.rootProject.file('d:/sign/sign.properties').newDataInputStream())def keyPwd = properties.getProperty("signingConfigs.keyPwd")def keyName = properties.getProperty("signingConfigs.keyName")def keyPath = properties.getProperty("signingConfigs.path")storeFile file(keyPath)storePassword keyPwdkeyAlias keyNamekeyPassword keyPwdv2SigningEnabled false}}

解决无法编译问题常见的几个配置

packagingOptions {exclude 'META-INF/DEPENDENCIES.txt'exclude 'META-INF/NOTICE'exclude 'META-INF/NOTICE.txt'exclude 'META-INF/LICENSE'exclude 'META-INF/LICENSE.txt'}lintOptions {checkReleaseBuilds falseabortOnError false}

让android studio debug模式编译多套so跑模拟器而打包则只编译v7

buildTypes {debug {externalNativeBuild {cmake {cppFlags ""abiFilters 'x86', 'armeabi-v7a'}//APP的build.gradle设置支持的SO库架构}}

生成arr到指定目录

libraryVariants.all { variant ->variant.outputs.each { output ->def outputFile = output.outputFileif (outputFile != null && outputFile.name.endsWith('.aar')) {def fileName = "${archivesBaseName}-${rootProject.version}-${variant.name}.aar"output.outputFile = new File(outputFile.parent, fileName)def folderName = rootProject.projectDir.toString() + new String("/arr-output")output.outputFile = new File(folderName, fileName)}}}

导入根目录文件夹的某个文件夹所有arr

flatDir{dirs "${rootProject.projectDir}/arr_out"}

取出不需要的资源

variantData.outputs.each {def apFile = it.packageAndroidArtifactTask.getResourceFile();it.packageAndroidArtifactTask.doFirst {def arscFile = new File(apFile.parentFile, "resources.arsc");JarUtil.extractZipEntry(apFile, "resources.arsc", arscFile);def HashMap<String, ArrayList<DuplicatedEntry>> duplicatedResources = findDuplicatedResources(apFile);removeZipEntry(apFile, "resources.arsc");if (arscFile.exists()) {FileInputStream arscStream = null;ResourceFile resourceFile = null;try {arscStream = new FileInputStream(arscFile);resourceFile = ResourceFile.fromInputStream(arscStream);List<Chunk> chunks = resourceFile.getChunks();HashMap<String, String> toBeReplacedResourceMap = new HashMap<String, String>(1024);// 处理arsc并删除重复资源Iterator<Map.Entry<String, ArrayList<DuplicatedEntry>>> iterator = duplicatedResources.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, ArrayList<DuplicatedEntry>> duplicatedEntry = iterator.next();// 保留第一个资源,其他资源删除掉for (def index = 1; index < duplicatedEntry.value.size(); ++index) {removeZipEntry(apFile, duplicatedEntry.value.get(index).name);toBeReplacedResourceMap.put(duplicatedEntry.value.get(index).name, duplicatedEntry.value.get(0).name);}}for (def index = 0; index < chunks.size(); ++index) {Chunk chunk = chunks.get(index);if (chunk instanceof ResourceTableChunk) {ResourceTableChunk resourceTableChunk = (ResourceTableChunk) chunk;StringPoolChunk stringPoolChunk = resourceTableChunk.getStringPool();for (def i = 0; i < stringPoolChunk.stringCount; ++i) {def key = stringPoolChunk.getString(i);if (toBeReplacedResourceMap.containsKey(key)) {stringPoolChunk.setString(i, toBeReplacedResourceMap.get(key));}}}}} catch (IOException ignore) {} catch (FileNotFoundException ignore) {} finally {if (arscStream != null) {IOUtils.closeQuietly(arscStream);}arscFile.delete();arscFile << resourceFile.toByteArray();addZipEntry(apFile, arscFile);}}}
}
通过这种方式可以有效减少重复资源

还有更多技巧欢迎吐槽哦!!!
更多参考推荐http://blog.csdn.net/s402178946/article/details/54140200


http://www.taodudu.cc/news/show-7225302.html

相关文章:

  • ffmpeg学习心得之一键处理视频图片合成加图片水印文字水印裁剪
  • 使用mvc架构模式实现账户之间的转账(没有涉及事务处理)
  • Spring D5
  • 宁波市中医院-自己视力检查-2019年2月2日
  • 求助-影像组学 for循环连续提取影像受阻
  • 关于激光雷达盲区0.4m问题
  • Opencv项目实战:基于dlib的疲劳检测
  • 激光雷达动态障碍物滤除-调研与展望
  • GRL(CVPR2023图像修复)训练自己的数据集
  • 电脑连上wifi但不能上网的解决办法
  • WiFi 無法上網(Wi-Fi列表不見了)
  • 连上wifi但无法上网
  • 家里WIFI连接上了但是无法上网的问题解决方案
  • 解决电脑WiFi已连接,可是无法上网办法
  • 新能源乘用车渗透率超30%!新能源汽车产业技术论坛11月3日开幕
  • 报告解读下载 | 2022年4月中国数据库行业分析报告
  • 报告 | 《2022年数据隐私统计、事实与趋势》,涵盖26项数据隐私统计数据
  • 行业数据和报告到底应该如何去找?
  • 5月《中国数据库行业分析报告》正式发布,首发时序、实时数据库两大【全球产业图谱】
  • 学习总结——player(播放器)相关知识
  • 企业微信,实现群机器人监控线上服务报警
  • 《数字摄影与摄像》——风光摄影
  • “湘西明珠”-凤凰古城
  • 回顾光影先锋发展史(2)-佳能
  • 《人在影途》----2010摄影之家年会贺岁片
  • Ameya360:安森美成像技术开启数字电影摄影新纪元
  • 美摄云剪辑3.0:融合AIGC,实现效率提升
  • 安森美成像技术开启数字电影摄影新纪元
  • 深入理解分布式技术 - 分布式系统中的缓存
  • 面试官:聊一下分布式事务!

gradle的几个实用技巧让你爽歪歪相关推荐

  1. Android Gradle实用技巧/如何自动为APK瘦身

    <Android Gradle 权威指南>终于发售上市了,这本书里包含了很多实用技巧.实战经验以及原理分析,今天这篇文章主要介绍下如何自动为APK瘦身的. 随着工程越来越大,功能越来越多, ...

  2. 编译加速的 8 个实用技巧 | 开发者说·DTalk

    本文原作者: 程序员江同学,原文发布于: 程序员江同学 关于 Android 编译加速的文章相信大家都看过不少,今天我们就一起来看看,在 AGP7.0 时代,除了传统的开启 build-cache,打 ...

  3. 深度学习11个实用技巧

    深度学习11个实用技巧 深度学习工程师George Seif发表了一篇博文,总结了7个深度学习的技巧,本文增加了几个技巧,总结了11个深度学习的技巧,主要从提高深度学习模型的准确性和速度两个角度来分析 ...

  4. 【老鸟分享】Linux命令行终端提示符多种实用技巧!

    1.Linux命令行提示符简介 众所周知,Linux命令行是系统管理员管理Linux的重要手段,我们管理Linux,首先要面对的就是Linux命令行提示符. Linux命令行结尾的提示符有" ...

  5. 经典 | 深度学习的7大实用技巧

    编译 | AI科技大本营 参与 | 林椿眄 编辑 | 谷 磊 对于许多具有挑战性的现实问题,深度学习已经成为最有效的解决方法. 例如,对于目标检测,语音识别和语言翻译等问题,深度学习能够表现出最佳的性 ...

  6. 深度学习七个实用技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 深度学习已经成为解决许多具有挑战性的现实世界问题的方法.对目标检测 ...

  7. Python大神用的贼溜,9个实用技巧分享给你

    来源:数据分析1480 本文约3000字,建议阅读6分钟 本文为你介绍一些关于python的实用技巧. 本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的的.让我们一探究竟吧! ...

  8. 5 个针对有经验用户的 Vim 实用技巧

    Vim 编辑器提供了很多的特性,要想全部掌握它们很困难.然而,花费更多的时间在命令行编辑器上总是有帮助的.毫无疑问,和 Vim 用户们进行交流能够让你更快地学习新颖有创造性的东西. 注: 本文中用到的 ...

  9. ES6的几个实用技巧,你了解吗?

    本文给大家分享了es6的几个实用技巧,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧 Hack #1 交换元素 利用 数组解构来实现值的互换 let a = 'world', b = 'hello ...

最新文章

  1. OSChina 周六乱弹 —— 去做点疯狂的事情
  2. HTTPS安全证书介绍
  3. centos配置-java-php-mysql【转载参考】
  4. python while循环语句-Python中的while循环语句怎么用?
  5. php登录注册连接数据库,利用PHP连接数据库——实现用户登录注册功能以及管理员对用户注...
  6. 数据结构与算---重点复习知识
  7. python中mako中loop_python中Mako库实例用法
  8. C语言libcurl例程:multi 多线程,多任务
  9. 那些让程序员炸毛的奇葩需求,说起来满满的都是泪!
  10. 时间单位的换算(秒,毫秒,微秒,纳秒,皮秒)
  11. Android动态生成答题卡,手机扫描答题卡改卷的最佳选择——ZipGrade
  12. ES6-rest参数
  13. db2 windows linux,Migrate DB2 v9 on windows to DB2 v10.5 on linux
  14. 12-Azido-1-dodecanol,57395-51-4,12-叠氮-1-十二醇点击化学试剂结构式分析
  15. 360浏览器默认使用IE兼容模式解决办法
  16. 劳动合同与聘用合同的区别
  17. 安卓读取U盘容量信息,支持低版本API
  18. Caused by: io.netty.resolver.dns.DnsNameResolverTimeoutException: [/192.168.1.1:53] query via UDP ti
  19. 计算机英语名词简释(转载)
  20. 摩尔斯电码、摩斯电码

热门文章

  1. python模块matplotlib.pyplot用法_03_Python 使用Matplotlib绘图
  2. 【2015NOIP普及组】T1:金币 试题解析
  3. matlab szj,matlab求微分方程的解实验报告4.doc
  4. jsdoc安装与配置
  5. 理解Node类型——不应被忽视的 nodeType、nodeName、nodeValue
  6. 《世界著名心理学家——弗洛伊德》简单读书笔记
  7. Redux异步解决方案之Redux-Thunk原理及源码解析
  8. 关于EL的理解(一)
  9. Web开发-Lodop打印控件实践
  10. AT89C51单片机外部中断