Android 配置子Module混淆时遇到的错误,和一些零散技术点总结

概要说明:
1、子Module不能配置混淆,仅仅只能在主Module中配置混淆。
2、主Module配置了混淆,打包成apk后,其他Module的代码也会一起混淆。
3、所有Module中的res目录下的资源都会在打包时合并到主Module的res目录下对应文件位置。
4、所有被主Module直接或间接引用了的Module,在打包时,其AndroidManifest.xml文件都会合并到主Module的AndroidManifest.xml文件中。
5、手机横竖屏时寻找layout目录的规则。
6、手机横竖屏时的宽度dp值和高度dp值。
7、注意textView.setTextSize(size)函数的代码,size的单位



Error:Execution failed for task ':app:compileDebugJavaWithJavac'.

> Compilation failed; see the compiler error output for details.


上面错误导致的原因是所有子Module都不能配置混淆,即minifyEnabled true。如果需要,也只能在主Module中配置。


在主Module中配置了混淆,打包时会作用在所有的Module上,即其他的Module的代码也会被混淆。
所有Module下res目录中的内容也会合并到主Module的res对应目录和文件中。参考文章:http://blog.csdn.net/fesdgasdgasdg/article/details/78133821
所有被主Module直接或间接引用的子Module的AndroidManifest.xml文件,在打包时内容都会合并到主Module的AndroidManifest.xml文件中,
包括权限,注册的组件等






layout目录描述:
layout-port为竖屏时的布局目录。
layout-land为横屏时的布局目录。
layout为默认目录,即:
竖屏时,系统会首先寻找layout-port目录的布局,如果找不到则使用layout目录的布局;
横屏时,系统会首先寻找layout-land目录的布局,如果找不到则使用layout目录的布局。








我有个容器类的自定义控件ImageTextView,其内部包含了一个TextView。但是我想在容器级别上设置个自定义属性,获取字体大小imageTextSize,
1)、于是这么获取属性值:

imageTextSize = array.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, TEXT_SIZE, getResources().getDisplayMetrics()));
2)、然后这么设置
innerTextView.setTextSize(imageTextSize);
运行后看效果我就懵了,这么字体比普通的TextView字体大一倍?但是innerTextView.getTextSize()与普通的textView.getTextSize()值相等。奇葩。

分析发现:

imageTextSize = array.getDimensionPixelSize(attr,默认值);
看看默认值这个静态函数代码TypedValue.applyDimension():
public static float applyDimension(int unit, float value,DisplayMetrics metrics)
{switch (unit) {case COMPLEX_UNIT_PX:return value;case COMPLEX_UNIT_DIP:return value * metrics.density;case COMPLEX_UNIT_SP:return value * metrics.scaledDensity;case COMPLEX_UNIT_PT:return value * metrics.xdpi * (1.0f/72);case COMPLEX_UNIT_IN:return value * metrics.xdpi;case COMPLEX_UNIT_MM:return value * metrics.xdpi * (1.0f/25.4f);}return 0;
}

把TEXT_SIZE值当做sp单位,然后乘以了缩放比例。




在看看array.getDimensionPixelSize()函数代码:

public int getDimensionPixelSize(@StyleableRes int index, int defValue) {if (mRecycled) {throw new RuntimeException("Cannot make calls to a recycled instance!");}final int attrIndex = index;index *= AssetManager.STYLE_NUM_ENTRIES;final int[] data = mData;final int type = data[index+AssetManager.STYLE_TYPE];if (type == TypedValue.TYPE_NULL) {return defValue;} else if (type == TypedValue.TYPE_DIMENSION) {return TypedValue.complexToDimensionPixelSize(data[index+AssetManager.STYLE_DATA], mMetrics);} else if (type == TypedValue.TYPE_ATTRIBUTE) {final TypedValue value = mValue;getValueAt(index, value);throw new UnsupportedOperationException("Failed to resolve attribute at index " + attrIndex + ": " + value);}throw new UnsupportedOperationException("Can't convert value at index " + attrIndex+ " to dimension: type=0x" + Integer.toHexString(type));
}


调用了TypedValue.complexToDimensionPixelSize()函数,在深入看看这个函数代码:
public static int complexToDimensionPixelSize(int data,DisplayMetrics metrics)
{final float value = complexToFloat(data);final float f = applyDimension((data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,value,metrics);final int res = (int)(f+0.5f);if (res != 0) return res;if (value == 0) return 0;if (value > 0) return 1;return -1;
}

调用了TypedValue.applyDimension()代码,哈利路亚,这不又转回来了?乘以了缩放比例。

public static float applyDimension(int unit, float value,DisplayMetrics metrics)
{switch (unit) {case COMPLEX_UNIT_PX:return value;case COMPLEX_UNIT_DIP:return value * metrics.density;case COMPLEX_UNIT_SP:return value * metrics.scaledDensity;case COMPLEX_UNIT_PT:return value * metrics.xdpi * (1.0f/72);case COMPLEX_UNIT_IN:return value * metrics.xdpi;case COMPLEX_UNIT_MM:return value * metrics.xdpi * (1.0f/25.4f);}return 0;
}

也就是说(记住),我们通过array.getDimensionPixelSize(attr, 默认值)方式获取到的字体大小值,值经过转换后的pt值了,已经乘以了缩放比例。


我们在看看textView.setTextSize(size)函数代码:

public void setTextSize(float size) {setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}

注意看两个参数,sp单位,系统认为size值是sp单位的,进入函数看:

public void setTextSize(int unit, float size) {Context c = getContext();Resources r;if (c == null)r = Resources.getSystem();elser = c.getResources();setRawTextSize(TypedValue.applyDimension(unit, size, r.getDisplayMetrics()));
}


最后一行调用了setRawTextSize()函数,括号内又调用了TypedValue.applyDimension()静态函数。shit,不多说了。是不是又把size当成sp值,再乘以了缩放比例?


进入setRawTextSize()函数看看系统拿到放大后的pt值怎么设置字体大小:

private void setRawTextSize(float size) {if (size != mTextPaint.getTextSize()) {mTextPaint.setTextSize(size);if (mLayout != null) {nullLayouts();requestLayout();invalidate();}}
}


搜迪斯嫩,设置到了画笔上(mTextPaint.setTextSize(size);),然后重绘UI(requestLayout();invalidate();)立即生效。


总结这小节:
上例中,我们通过自定义属性获取到的字体值,已经是pt单位的了,此时要设置到textView上时,需要调用textView.getPaint().setTextSize()进行设置。
在自定义属性上获取到的字体大小和尺寸值都是乘以了缩放比例后的放大值。
textView.setTextSize()函数的单位是sp


















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26019.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

俄罗斯钓鱼服务器位置,俄罗斯钓鱼4《RussianFishing4》钓鱼地点攻略

俄罗斯钓鱼4《RussianFishing4》钓鱼地点攻略 一,胖比 35.49 卡8 蜂蜜面团 二.银鲫 同样35.49.卡8,甜面团,碎麦粥(这同点位就上个配置图吧) 三.青蛙 41.41 深度17,苍蝇 四.拟鲤 地点:码头 卡8毛翅目 五.梅花鲈 49.56 卡…

钓鱼概率问题,C语言实现和Python代码实现

钓鱼概率问题,C语言实现和Python代码实现 问题描述 又到了万物复苏的春天!活蹦乱跳的大鱼在沁湖各展风姿,GDUFE 的渔夫全都迫不及待地来钓鱼了,Baby O 也是其中之一。 其中,沁湖里有 n条鱼,来参加比赛的…

使用Ambari快速部署Hadoop大数据环境

前言 做大数据相关的后端开发工作一年多来,随着Hadoop社区的不断发展,也在不断尝试新的东西,本文着重来讲解下Ambari,这个新的Apache的项目,旨在让大家能够方便快速的配置和部署Hadoop生态圈相关的组件的环境,并提供维护和监控的功能. 作为新手,我讲讲我自己的学习经历,刚刚开始…

未来计算机带给自动化的机遇,数字化变革催生机遇 自动化已然“原力觉醒”...

原标题:数字化变革催生机遇 自动化已然“原力觉醒” 自动化兼具计算机速度与人工智能 计算机快速、精确,但缺乏智能。人工速度慢、不稳定,但足智多谋。自动化则以最简单的方式将计算机的速度与人工智能相结合,将手动流程转变为无需…

热烈庆祝祖国成立70周年,2019国庆档大片《我和我的祖国》、《攀登者》、《中国机长》数据分析

今年的国庆有大阅兵,也有情怀大片着实很不一般,今年我的国庆节是在医院里面度过的,不过我没有错过这举国欢庆的大阅兵仪式,还记得那一天早上好多老人、病号都齐刷刷地站在大厅注目着硕大的显示屏中的阅兵典礼,非常庄严…

代码规范指南:怎样写才能干净整洁

选自 Medium 作者:Chris Blakely 机器之心编译 能把代码写出来是一回事,但是写出整洁、可读的代码又是另一回事。然而,什么是「干净的代码」呢?怎么才能写出「干净的代码」?为了解答这些问题,本文作者写了一…

58全站用户行为数据仓库建设及实践

背景 随着58业务体系的不断建设与发展,数据分析与应用需求越来越丰富,给数据仓库的建设工作带来了很大的挑战。 全站行为数据仓库建设过程中,我们总结的问题包括如下几点: (1) 数据体系架构已经无法支持业务的快速迭代&#xff0c…

CSDN每日打卡已经2周,进展如何?(送两个CSDN背包)

🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家 & 总榜前十🏆、HDZ核心组成员。欢迎点赞、收藏、评论 🍅 粉丝专属福利:知识体系、面试题库、技术互助、简历模板。文末公众号领取 点赞评论 …

哈利路亚

2019独角兽企业重金招聘Python工程师标准>>> 产品规划、产品设计、产品开发、数据分析、数据挖掘、数据开发 转载于:https://my.oschina.net/u/818486/blog/185941

php钓鱼怎么使用方法,路亚钓法操作步骤及抛投技巧

路亚操作的五个基本步骤 虽然按照拟饵的钓法可以横跨淡水钓与海水钓二大系统,而且拟饵的种类达十大类几千种之多,但是,要如何才能玩好拟饵钓法,主要的操竿技巧则有五点,即为:“抽”、“摆”、“旋”、“快”…

AI扮演Linux虚拟机,能管理文件编程开浏览器,还能跟自己「套娃」聊天 | ChatGPT新玩法...

詹士 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT能运行docker了? 还可以自己连接到OpenAI网站,查查自己? 被玩出花的OpenAI聊天AI ChatGPT,又被整出新活了。 如上技能是一位DeepMind研究者Jonas Degrave的最新发现。 刚发出来几小…

chatgpt赋能python:Python作画:如何使用Python创建美丽而独特的艺术作品

Python作画:如何使用Python创建美丽而独特的艺术作品 介绍 Python被认为是一种多用途编程语言,可用于开发各种应用程序,包括软件工具、游戏、Web应用程序、机器学习算法和数据分析。但你也可能没有意识到,Python还可以被用于造美…

Stable Diffusion高阶技能(1)-掌握这些,你也能绘出惊艳画作

开篇 初踏入AI作画的世界,你可能会对如何制造出惊艳的艺术作品而困惑。作为一个前沿技术的探索者,我在这一篇文章中,会和你一同揭秘如何用正确的提示词操控AI的“透视”,将最美的画面展现在你眼前。 技能一、提高图片质量的高阶手法 在数量众多的元素中,我们如何做出最…

【益智游戏】开锁小游戏+ChatGPT写html代码

跟军哥吃饭聊天,说到一些个有意思的思维题目,说是小学五年级的题目,我竟然想了好久,问的GPT才恍然大悟!哈哈,记录下,顺便给小孩讲讲 在网页上玩一玩! 游戏规则: 密码锁有…

Python量化交易实战教程汇总

完整版视频教程 你将收获 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 教给你量化交易的投资思想 编程技术 核心量化策略 交易系统开发 讲师经验分享 成为一个“技术流”理财高手 结合chatgpt提问快速掌握Python量化交易实战 快速提问提高学习效率 适…

Android 微信登录 无法调起授权页面

如果你什么都比对了,有问题,只有一个原因 签名不匹配, 工具地址 微信开放文档 去微信 官方下载签名工具,然后按到手机上,然后在你工程的包名 粘贴一下子,发到手机上,然后用微信那个工具 放包名,获取你的签名,然后去微信官方换一下,然后等一会就好了.\ 如果这个还不行, and…

老杨说运维 | 运维数智化转型正确打开方式是什么?他这样说

2023年5月9日,中国计算机用户协会信息科技审计分会会员大会暨金融科技风险管理与审计论坛成功于北京召开。擎创科技CEO杨辰受邀与会,并分享了在数智运维发展过程中对企业数智化转型建设的规划思考以及相关实践经验。 同时,年会上举行了“金融…

【[ChatGPT] 从 GPT-3.5 到 GPT-5 的进阶历程 |带你全面详细的了解与学习】

目录 一、简介背景介绍OpenAi的前世今生Ai概述GTP的出现 二、chatGPT的进阶之路chatGPT版本的区别A. 模型规模的比较B. 语言理解能力的比较C. 训练数据集的比较D. 应用场景的比较 三、GTP-4到GTP-5的过渡GTP5的发展之路 四、深度学习的愿景GTP-5能否取代程序员?深度…

亚马逊运营知识:ASIN文案编写技巧

ASIN页面是买家了解商品的重要渠道,对转化率的影响很大,它包括了图片、价格、评论、文案等。那么ASIN文案怎么编辑呢?下面海熹跨境人才网给大家分享亚马逊运营人才ASIN文案编写技巧。一起来了解一下吧。 一、确认主要关键词列表 首先,我们需…

文案优化技巧,批量文案改写工具

在当今竞争激烈的市场中,一篇优秀的文案可以吸引更多的潜在客户,提高转化率,带来更多的收益。然而,写出优秀的文案有时是一项具有挑战性的任务。许多人不得不花费大量的时间和精力来编辑和重写它们,这不仅耗时费力&…