Android studio 已勾选adb enable verityadb integration为什么还是no debuggable processes

Android开发遇到的问题(4)
有时候我们打开AndroidStudio的Android Monitor想要查看Application日志等情况,如果想要选择查看单独的Application的信息,但可调试的应用列表却显示No Debuggable Applications。
这时可以打开导航栏中的Tools -& Android -& Enable ADB Integration看看前面有没有打上勾,像这样就是没有开启,所以显示No Debuggable Applications。
得打上勾,开启才行,一点就打上勾了。
再来看Android Monitor的可调试应用列表,出现了可以调试的应用列表,这样就可以选择想要调试应用单独调试了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:41011次
排名:千里之外
原创:18篇
评论:18条
(1)(1)(2)(2)(2)(3)(3)(1)(2)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'相关文章推荐
响应失败情况如下两个:
1、当启动Android Studio时,如果弹出
adb not responding. you can wait more,or kill "adb.exe" ...
本人电脑上装的是腾讯的android设备驱动进程tadb.exe.
此进程在android程序调试过程中会占用adb所以使得android studio 无法与之桥接。接下来主要讲如何找到这个问题的...
在Studio开发环境中,使用真机开发经常会出现waiting for debugger,卡死不动了
手机正常连接,但是在cmd打印log的时候出现此错误。
解决方法如图。
华为P8手机,移动版,安卓5.0系统,进行解锁操作:
出现问题:按照网上的解锁教程,输入adb devices能检测到设备,输入adb reboot-bootloader也能成功进入bootload...
1.最近开发出现studio 无法正常调试android 程序。有如下几个原因:
(1) adb server 原因。执行命令 adb kill-server
我的环境:
1、修改php.ini文件(修改完重启apaceh)
【注意:远程的使用下面的配置文件,本地的使用上面的配置文件】
remote_host 是指调试客户端的地址,即IDE所在...
http://blog.chinaunix.net/uid--id-3359214.html
今晚由于种种未知的原因,陪伴了我两年的系统终于被我...
近期遇到AS连接手机运行时 ADB检测不到:
搜集了一些原因:
1.手机设置问题。开USB调试 方法: 手机设置 - 开发人员选项 - USB调试 - 勾选(开发者调试被隐藏了,在关于手机中连续点击版...
先上错误图片吧
查询了一下说是端口号5037被其他进程占用的原因
Windows中使用Win+R组合键,调出运行,输入,cmd,回车,这是调出命令提示符的过程,当然你也可以用其他方...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)无论你的应用多么有创新性、有用,如果它卡得要命,或者非常消耗内存,那么每人将会愿意使用它。
因此,性能变得尤为重要。当你忙碌于构建精美的用户界面或者完成新的特性时,你可能容易忘却掉一些性能相关的事情。
这也是为什么有Google Play的应用审核机制的原因之一。
这篇文章中,你会看到每个Android工程师需要了解的一些性能问题。你将会学会使用Android SDK提供的、已安装在你的设备中的工具来测试这些问题是否发生在你自己的应用中。
如果在你的应用中发现了一个性能问题,你肯定会想修复它。我们还会看一看如何使用Android SDK 工具来获取更多关于那些没有覆盖到的性能问题的相关信息。一旦你有了这些信息,你将会对如何提升应用性能有一个更深刻的理解,并且能够构建出让用户喜爱的App。
步骤1 : 问题描述
你应用的用户界面是连接用户的纽带,但是创建漂亮的界面只是挑战的其中一面,你还需要确保用户界面流畅的运行。
一个常见的问题就是用户界面卡顿,出现这种情况的原因可能是overdraw。Overdraw是屏幕上的某个像素在同一帧的时间内被绘制了多次。
例如,想象一下一个有蓝色的背景文本,Android不仅会绘制对用户可见的蓝色区域,而是会绘制整个蓝色的背景以及上面的文本。这意味着一些像素会被两次绘制,这就是过度绘制。
一些如上述例子所说的过度绘制示例是不可避免的。然而,过多的多度绘制会引发明显的性能问题,因此你必须将过度绘制的可能性降到最小。
检测应用中的过度绘制相对来说比较简单。大量的过度绘制会引出其他用户界面相关问题,例如视图层级过于复杂等。基于这些原因,当你测试你的App的性能问题时,从过度绘制开始是一个明智的选择。
步骤2 : 检测过度绘制
好消息是你的Android设备上已经内置了检测过度绘制的工具。
因此你需要做的第一步就是安装你要测试的App到你的设备中。然后打开设置页面,选择开发选项(Developer Options)-&调试GPU 过度绘制(Debug GPU Overdraw),然后选择“显示过度绘制区域(Show overdraw area)”。如下图所示。
这个工具使用色块来代表不同数量的过度绘制。剩下的事情就是启动你要测试的应用,然后观察它的过度绘制情况。
没颜色 : 没有过度绘制,也就是说一个像素只被绘制了一次。
蓝色 : 过度绘制了一次,也就是一个像素点被绘制了两次。
绿色 : 过度绘制了2次. 也就是一个像素点被绘制了三次,通常,你需要集中精力优化过度绘制次数大于等于2次的情况。
浅红色 : 过度绘制3次。这取决于你的应用,小范围的3次过度绘制可能是不可避免的,但是如果你看到了中等或者大量的红色区域那么你就需要查找出现这个问题的原因了。
深红色 : 过度绘制4次,像素点被绘制了5次,甚至更多次。出现这种问题你绝逼要找到原因,并且解决它。
步骤3 : 最小化过度绘制
一旦你发现了某个区域有严重的过度绘制,最简单的方法就是打开你应用的xml文件找到过度重叠的区域,特别是那些不可见的drawable对象和被绘制在其他控件上的背景,以此来降低这些地方的过度绘制。
你也应该查找那些背景属性设置为白色,并且它的父视图背景也设置为白色的区域。所有这些都会引起严重的过度绘制。
Android系统能自动的降低一些简单的过度绘制,但是这些对于复杂的自定义View并没有什么价值,因为Android不会知道你如何绘制你的内容。
如果你在App中使用了复杂的自定义View,你可以为使用clipRect函数为你的视图定义可绘制区域的边界。更新相关信息可以参考.
## 2. Android 图形渲染
步骤1 : 问题描述
另一个常见的性能问题就是应用的视图层级。为了渲染每个视图,Android都会经历这三个阶段 :
花在这三个阶段的时间与View层级中的View的数量成正比,这就意味着降低App渲染时间的最简单的方法就是识别和移除那些并没有什么卵用的UI元素。
即使在你的视图层级上的所有View都是必须的,不同的布局方式也可能对测量过程产生重要的影响。通常来说,你的视图层级越深,花在测量视图的时间就越长。
在视图渲染期间,每个View都要向它的父View提供它自己的尺寸。如果父view发现了任意一个尺寸问题,那么它会强制要求所有的子视图重新测量。
即使没有错误发生,重新测量也可能出现。例如,为了正确的进行布局RelativeLayout通常会对它们的子视图进行两次测量。子视图使用了layout_weight属性的LinearLayout也会对它的子视图进行两次测量。
这些都取决于你的布局方式,测量和重新测量的代价非常昂贵,它会严重影响你的渲染速度。
确保你的用户界面渲染流畅的关键就是移除任何非必须的View以及减少你的View层级。
Hierarchy Viewer是一个能够将你完整的View层级可视化的工具,这个工具能够帮助你发现冗余的View以及嵌套的布局。
步骤2:使用 Hierarchy Viewer
在我们进一步了解Hierarchy Viewer之前,你需要知道它的一些规则。首先Hierarchy Viewer只能与正在运行的App进行交互,而不是你的源代码。这就是说你需要将App安装到你的设备或者模拟器上。
还有一个最重要的问题,就是默认情况下Hierarchy Viewer只能与运行开发版Android系统的设备进行交互(译者注: 一般来说,使用模拟器即可)。如果你没有开发设备,那你需要添加到你的应用中。
了解这些之后就让我们打开Android Studio,并且选择”tools” -& “Android” -& “Android Device Monitor”,如图所示。
然后点击Hierarchy View按钮,如下图所示。
屏幕左边的Windows标签下列出了所有Android设备和模拟器。选择你的设备后,你会看到你设备上运行的所有进程。选中你要检测的进程,然后你会看到三个自动更新的视图层级区域。
这三个窗口提供了视图层级的三个不同可视化展示。
Tree View: **** 视图层级窗口,每个节点代表了一个V
Tree Overview: 整个视图层级的缩略布局;
Layout View: 当前视图层级的轮廓.
Hierarchy View中有三个窗口。如果你在一个窗口中选择了一个View,那么它会在另外两个中高亮显示。你能同时使用这三个窗口查找View层级中的冗余视图。
如果你不确定一个View是否是UI界面中的必须元素,最简单的方法就是到Tree View窗口点击这个节点。你将会看到该View是如何显示在屏幕的预览,此时你就可以确切地知道该View是否是必须的。
但是即使一个View对最终的渲染效果有贡献也并不意味着它不会引起严重的性能问题。你已经看到了如何通过Hierarchy Viewer来找到明显的嵌套布局,但是如果这引起的性能问题并不那么明显呢?或者还有其他的原因使得该视图渲染得非常慢?
好消息就是你还可以通过Hierarchy Viewer来剖析每个View在不同的渲染阶段的耗时。当性能问题的原因不那么明显时,这是你发现问题的另一途径。
下个章节我将为你展示如何通过Hierarchy Viewer来剖析每个View的渲染时间来找到潜伏在问题表面的性能问题。
步骤3 : 节点的性能分析
定位你的用户界面瓶颈的最简单方法就是收集每个View分别完成测量、布局、绘制的时间。
你不仅可以通过Hierarchy Viewer收集这些信息,Hierarchy Viewer还可以通俗易懂地向你展示这些数据,因此你可以通过这种形式来找到性能问题。
Hierarchy Viewer默认并不会显示渲染时间。你需要到Tree View窗口添加这个信息,然后选择你想要测试的根节点。下一步,在Hierarchy Viewer上点击由绿、红、紫的三个圆形色块组成的按钮,如图所示。
三个圆点色块就会显示在每个节点上,从左到右,这些圆点分别代表 :
用于测量的时间
用于布局的时间
用于绘制的时间
每个圆点都有颜色 :
绿色 代表该View的渲染速度至少要快于一半以上的其他参与测试的节点。例如,一个在布局位置上的绿色的圆点代表它的布局速度要快于50%以上的其他节点;
黄色 代表该View慢于50%以上的其他节点;
红色 代表该View的渲染速度比其他所有参与测试的节点都慢。
当收集了这些数据之后,你不仅知道哪些View需要优化,你还会确切地知道是在渲染的哪个阶段导致的问题。
哪些黄色、红色的地方就是你需要开始优化的地方,这些性能指标与该视图层级下的其他剖析节点也有关系。换句话说,你肯定会有一些视图渲染得比其他的慢。
在开始改良你的View相关的代码之前,摸着你的良心问一句该View渲染得比其他视图慢是否有一个合理的原因,如果答案是否定的,那么就开始你的View优化之旅吧。
3. Memory Leaks 内存泄漏
步骤1:问题描述
Android是一个自动管理内存的开发环境,不要让这个句话蒙蔽了,因为内存泄漏依旧是可能发生的。这是因为垃圾回收器只会移除那些不可达的对象。如果它不是一个不可达的对象,那么该对象就不会被释放掉。
这些不可达的对象阴魂不散,聚集在你的堆内存中,占用App的内存控件。如果你继续泄漏对象,那么可用的内存空间将会越来越小,GC操作就会频繁触发。
有两个原因表明这是一个坏消息。首先,GC操作通常不会明显地影响你的App性能,但是当内存控件较小时大量的GC操作会使你的App变慢,此时UI就不会那么流畅了。第二问题是移动设备的内存空间相对来说较小,因此内存泄漏会快速地升级为内存溢出,导致应用Crash。
内存泄漏难以被检测出。可能只有当用户开始抱怨你的应用时你才能发觉内存泄漏问题。幸运地是,Android SDK提供了一些有用的工具来让你找到这些问题。(译者注 : Square的开源库是查找内存泄漏的优秀工具,强烈建议大家使用)。
步骤2 : 内存监视器 (Memory Monitor)
Memory Monitor是一个能够实时获取应用内存使用情况的工具。需要注意的是这个工具只能作用于正在运行的应用,因此确保你的要测试的应用已经安装到你的设备中,并且你的设备已经连接到你的电脑上。
Memory Monitor已经内置在Android Studio中,因此你可以点击Android Studio的底部的”Memory”这个tab来切换到内存监视页面。当你切换到该页面的时候,Memory Monitor就开始记录你的内存使用情况了。
如果Memory Monitor没有开始记录,那么确保你的设备是已经被选中的状态。
如果Memory Monitor提示No debuggable applications,那么你可以打开Android Studio的”Tools”菜单,选择”Android”,然后确保选中了Enable adb integration。这个功能还不是很稳定,所以有时候你需要手动切换它的状态。你也可以断开设备与电脑的连接,然后再重连,这样可能就OK了。
一旦Memory Monitor检测到正在运行的应用,它就会显示这个应用的内存使用情况。已使用的内存会被表示为深蓝色,未分配的内存则会变为浅蓝色。
花一些时间与你的设备交互,并且关注你的内存使用情况。最终已分配的内存会增长,直到没有内存可用。此时,系统就会释放触发GC释放内存,当你看到已分配的内存明显的下降时就代表GC操作被触发了。
GC通常情况下会将无用的内存释放掉,但是当你看到App在短时间内快速增长或者GC变得非常频繁,此时你就需要倍加小心了,这就是发生内存泄漏的信号!
如果你通过Memory Monitor来追踪一个可疑的内存泄漏问题,你可能会看到Android系统会为你的App增大可用内存,TODO : 。
最终,你可能会看到你的App消耗了非常多的内存以至于系统无法再给你的应用更多的可用内存。如果你看到这种场景,那么说明你在内存使用上犯了很严重的错误。
步骤3 : Android Device Monitor
另一个能够帮助你收集更新关于内存泄漏信息和其他内存相关问题的工具是Android Device Monitor的DDMMS工具下的Heap。
Heap工具能够通过显示系统为你分配了多少内存来帮助你诊断内存泄漏问题。正如上面提到的,如果已分配的内存不断地增长,那么这是发生内存泄漏的明显信号。
但是这个工具还提供了许多关于你的应用堆内存使用情况的数据,包含你的App内分配的各种对象、分配的对象数量以及这些对象占用了多少空间。这些额外的信息对于你追踪内存泄漏极为有用。
你可以在Android Device Monitor工具中选择DDMS,在Devices中选择你要检测的App。然后选择Heap标签,如图所示。然后花一些时间与你的App进行交互以收集内存信息。
heap输出信息会在GC事件之后,因为你可以手动点击Cause GC来触发GC,使得Heap内存数据尽快地显示出来。
一旦GC事件被触发了,heap标签下就会更新App的堆内存使用信息,这些信息会在每次GC时更新。
在这篇文章中,我们学习了一些开发中最常见的性能问题,过度绘制、内存泄漏、缓慢的UI渲染。
相信你已经掌握了如何使用工具来检查这些问题,以及如何获取更新的信息来判断你的应用中是否出现了这些性能问题。你有越多的信息,就越容易追踪到问题的原因并且修复它。
Android SDK有很多工具可以供你诊断和定位性能问题。如果你想学习更多这方面的知识,你可以访问u这两篇官方文档 和 .Eclipse转Android Studio的过程中有必要弄明白的一些问题2 years ago8、问:Eclipse和AS中主工程对其它工程的依赖有什么异同?答:相同点:Eclipse和AS都可以依赖so、jar包和libproject;组织结构也一样,so和jar包放在libs文件夹,libproject是一个独立的工程,需要手动配置依赖关系。不同点:AS还可以依赖aar,并且AS除了可以依赖本地的库,还可以依赖服务器上的库,但Eclipse只能依赖本地库。9、问:jar包和aar有啥区别?答:jar包不能将so和资源文件打包进去,但aar可以,看得到的就是这点区别。10、问:AS使用过程遇到过哪些问题,是怎么解决的?答:assets文件的存放目录在”src/main/”目录下,和java、res文件夹平级;aidl文件需要单独在”src/main/”目录下新建一个文件夹,然后创建对应的包名,将aidl文件放在包名对应的包下。引用libs文件夹中的so,需要在对应module下的build.gradle文件的android标签下加上如下属性:
sourceSets {
jniLibs.srcDirs = ['libs']
android studio的编译时屏蔽掉lint检查,可以避免由于编译条件太过严格而编译不过的问题:
lintOptions {
abortOnError false
如果遇到多个jar包中的某个文件冲突,可以在对应module下的build.gradle文件的android标签下加上如下属性:
packagingOptions {
exclude 'META-INF/NOTICE.txt'// 这里是具体的冲突文件全路径
exclude 'META-INF/LICENSE.txt'
调整logcat文件显示的颜色:File→Setting→Editor→Colors&Fonts→Android Logcat→在界面的右侧调节logcat每个级别日志的颜色;显示行号:File→Setting→Editor→General→Appearance→勾选“Show line numbers”;Logcat的console中,显示”no debuggable applications”的问题:Tools→Android→Enable ADB Integration;如果依赖工程和主工程中有同名同类型的资源文件,需要修改依赖工程中的资源名称编译时才不会报错,如果依赖工程中的这个资源文件是整个工程都不需要用到的,可以直接删掉;Android Studio中一个主工程依赖多个library的模式编译时很慢(clean和rebuild时,之前Eclipse中是这种模式),因为这种工程框架是主工程和每个依赖工程中都有一个build.gradle,编译起来会消耗比较长的时间,可以将没有资源文件和so的依赖工程打包成jar包,有资源文件和so的打包成aar文件,然后在主工程中引用,这样编译会很快;Android Studio对九图的要求很严格,如果文件以”.9.png”结尾但是图片不是9图,编译的时候会报错,解决方案是直接在AS中打开这张图片,通过9图编辑工具编辑成9图即可;修改Module之间的依赖关系有两种方式:(1)直接修改每个module的build.gradle文件中的dependencies;(2)右键project→Open Module Settings→在弹出面板的左侧Modules一栏中选中要修改依赖关系的Module,点击右侧的Depencencies标签修改即可;Android Studio自动导包:File→Settings→Editor→General→Auto Import→Java→切换“Insert imports on paste”为“All”→勾选“Add unambigious imports on the fly”;代码格式化快捷键:CTRL+ALT+L;重命名文件夹或者文件的快捷键:ALT+SHIFT+R;鼠标悬浮在某个方法上时,显示该方法的信息:Preferences→Editor→Show doc on mouse move;删除一个Module,直接在IDE中选中Module后按Delete是删不掉的,需要先右键project→Open Module Settings→在弹出面板的左侧Modules一栏中选中要删除的Module→点击面板左上角的“-”符号→点击OK后回到IDE,然后选中要删掉的Module,按Delte快捷键删掉即可;Android Studio中执行Lint等工具对代码的检测,Analyze→Inspect Code;导入aar:将aar拷贝到libs文件夹,在module的build.gradle文件增加下面这段话:repositories {
flatDir() {
dirs 'libs'
然后在build.gradle的dependencies标签中按照如下格式引用aar文件即可:
compile(name:'aar包名不带扩展名', ext:'aar')
11、问:AS相比于Eclipse,有哪些新的工具或者更方便的功能?答:查看APP的内存占用、内存变化情况的工具;查看APP运行过程中网络使用情况的工具;查看CPU、GPU使用情况的工具;代码清理(Analyze—Code cleanup....)、代码静态检查工具(增强的ling检查工具,Analyze—Inspect code....);可以直接使用DOS窗口;给打码加书签的功能(Eclipse也有,只是之前没用过);IDE类9图编辑功能;快捷键AS2.2加入了反编译APK的功能:Build→Analyze APK...,非常方便;......很多很多一些小的功能,用熟了特别方便。12、问:在使用AS的过程中,有什么忠告?答:就像在使用Eclipse的时候不要轻易更新ADT一样,在使用AS的过程中不要轻易更新gradle和AS,每个版本会有一些差别,会有很多坑,还是等新版本出来一段时间,比较稳定后再用,毕竟IDE是提高生产力的工具,如果需要花大把时间去学习如何使用和解决使用过程中的问题就太没意思了。13、问:Eclipse的工程转成AS的版本后,在同一个机器中安装会报”INSTALL_FAILED_VERSION_DOWNGRADE“这个错误,是什么原因导致的?答:这是因为机器中存在一个版本号比安装apk版本号更高的版本,出现这个问题的原因是因为as除了可以在Manifest.xml文件中设置apk的版本名和版本号,还可以在build.gradle文件中设置apk的版本名和版本号,记得修改build.gralde中的版本名和版本号到最新就可以了。14、导入Google官方的Sample不成功,如何处理?答:Android Studio 导入 Google Sample 时,需要联网获取,由于某些原因,连接不了服务器。参考网上的,给出一种更为简便、快速的方法:在 host 文件中加入一句: 64.233.162.84
如果 ip 失效了,找个有用的替换即可(win7的host文件在:C:\Windows\system32\drivers\etc 目录下)。15、AS中的module被我remove掉了,但现在又想加进来怎么弄?答:这个我研究过,不能通过UI界面来配置,每个project下面有一个settings.gradle文件,里面是这个project包含了哪些module,你只需要在这里面添加被remove掉的module名称即可,格式:‘:module名称’。16、在AS中,libproject需要在AndroidManifest.xml中声明的内容是和Eclipse一样,需要在主工程中声明吗?答:不需要,在AS中,如果你依赖了library或者aar,只需要在library或aar中对应的AndroidManifest.xml中声明这个工程对应的属性就行了,不需要在主工程中的AndroidManifest.xml文件中去声明依赖包需要的声明。17、有没有比较好的gradle教程推荐?答:18、如何在构建时删掉build\output目录下的unsigned-align.apk?答:在build.gradle文件中加上下面这一段话:// delete unaligned files
android.applicationVariants.all { variant -&
variant.assemble.doLast {
variant.outputs.each { output -&
println "aligned " + output.outputFile
println "unaligned " + output.packageApplication.outputFile
File unaligned = output.packageApplication.outputF
File aligned = output.outputFile
if (!unaligned.getName().equalsIgnoreCase(aligned.getName())) {
println "deleting " + unaligned.getName()
unaligned.delete()
336收藏分享举报文章被以下专栏收录写出来是为了能够更清晰地理解!推荐阅读{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&写出来是为了能够更清晰地理解!&,&permission&:&COLUMN_PUBLIC&,&memberId&:350128,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&followee&,&canManage&:true,&intro&:&写出来是为了能够更清晰地理解!&,&urlToken&:&zmywly8866&,&id&:5057,&imagePath&:&ece0b64dc3c1ddd42340e.jpg&,&slug&:&zmywly8866&,&applyReason&:&&,&name&:&张明云的知识共享&,&title&:&张明云的知识共享&,&url&:&https:\u002F\\u002Fzmywly8866&,&commentPermission&:&COLUMN_FOLLOWEE_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:7194,&avatar&:{&id&:&ece0b64dc3c1ddd42340e&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\\u002Fece0b64dc3c1ddd42340e_l.jpg&,&articlesCount&:51},&state&:&accepted&,&targetPost&:{&titleImage&:&https:\u002F\\u002F718cadcc09b5_r.jpg&,&lastUpdated&:,&imagePath&:&718cadcc09b5.jpg&,&permission&:&ARTICLE_PUBLIC&,&topics&:[],&summary&:&AS出来一年多了,最近才从Eclipse转到AS,但我并不觉得使用Eclipse有多落后,它们都只是一个工具而已,哪个顺手就用哪个,用得好都能提高生产力,不会合理利用,再好的工具也是惘然。很多使用Eclipse的Android程序员不知道代码重构的快捷键、如何在运行时调…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&followee&,&likes&:0,&origAuthorId&:350128,&publishedTime&:&T20:07:49+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:332718,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&Eclipse转Android Studio的过程中有必要弄明白的一些问题&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_FOLLOWEE_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:5057,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&https:\u002F\\u002F718cadcc09b5_r.jpg&,&author&:{&bio&:&公众号:open_dev&,&isFollowing&:false,&hash&:&62f8e6fcf3bfc0e3ea3014a&,&uid&:12,&isOrg&:false,&slug&:&zhang-ming-yun-88&,&isFollowed&:false,&description&:&&a href=\&http:\u002F\\u002Flarge\u002F6d17e381gw1f4lrrlm8eaj206706mwep.jpg\&&分答&\u002Fa&&a href=\&http:\u002F\u002Fzmywly8866.github.io\u002F\&&博客&\u002Fa&&a href=\&http:\u002F\\u002Fusers\u002Fed4\u002Flatest_articles\&&简书&\u002Fa&&a href=\&https:\\u002Fzmywly8866\&&Github&\u002Fa&&,&name&:&张明云&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fzhang-ming-yun-88&,&avatar&:{&id&:&094ff2761def5a8b6c72e7b7c8af044e&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:350128,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:305408}],&title&:&Eclipse转Android Studio的过程中有必要弄明白的一些问题&,&author&:&zhang-ming-yun-88&,&content&:&\u003Cp\u003EAS出来一年多了,最近才从Eclipse转到AS,但我并不觉得使用Eclipse有多落后,它们都只是一个工具而已,哪个顺手就用哪个,用得好都能提高生产力,不会合理利用,再好的工具也是惘然。很多使用Eclipse的Android程序员不知道代码重构的快捷键、如何在运行时调试、一个Workspace一大堆工程......,我想即使转到Android Studio也并不见得比Eclipse顺手。\u003C\u002Fp\u003E\u003Cp\u003E下面将自己在Eclipse转AS过程中遇到的一些问题以及对各个问题的理解列出来,方便后续查阅。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E1、问:Eclipse的工程如何导入到AS?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E我的处理方式是在AS中新建工程,然后将Eclipse中对应工程的文件拷贝过来;当然也可以通过Eclipse将project导成gradle版本的,然后在AS中导入该工程。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E2、问:对于本地代码,是如何处理的,在AS上如何编译JNI的代码?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003EAS上同样可以开发JNI,只不过配置脚本的过程比较麻烦,各个gradle版本,配置的方式有些不一样;我的处理方式是AS上只做java开发,JNI还是在Eclipse中开发,方便编译和调试;\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Cu\u003E3、问:在AS上开发会和Eclipse一样,卡吗?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E会,卡不卡和你整个工作空间的复杂度有关,如果Eclipse的一个工作空间工程比较少,是不会卡的;AS也一样,如果AS的一个工作空间有太多工程,同样会很卡,特别是编译的时候;\u003C\u002Fp\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E4、问:AS存在启动慢的问题吗,有没有Eclipse那种初始化进度一直在0%的状态?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E目前为止我还没有遇到过,即使一个工作空间有上十个工程。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Cu\u003E5、问:AS编译比Eclipse或者ant编译快吗?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E不一定,这也跟你项目的复杂度有关,如果你的工程依赖关系简单,用gradle编译会很快,当然用Eclipse和ant编译也一样;如果你的工程依赖关系复杂,用gradle编译比用Eclipse、ant还慢。我的建议是:主工程不要依赖太多的libproject,否则会编译很慢,可以把这些libproject打包成aar,这样同样复杂的项目用gradle编译会比用Eclipse和ant编译块不少;\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Cu\u003E6、gradle与ant相比,有什么优点?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E优点比较多,主要的优点是配置简单,特别是在持续集成的时候,如果是gradle,一条命令就行了,如果是ant,还得自己写编译脚本。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E7、问:AS中如何配置工程的依赖关系?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E在Eclipse中,会存在几种依赖:\u003C\u002Fp\u003E\u003Cp\u003E(1)一种是jar包,直接放在libs文件夹即可(早先的Eclipse版本需要设置buildpath依赖关系才算配置OK);\u003C\u002Fp\u003E\u003Cp\u003E(2)另外一种是libproject,这需要右键主工程—properties—Android—点击Add添加依赖项,配置完成后依赖关系会更新到工程根目录下的“project.properties”文件。\u003C\u002Fp\u003E\u003Cp\u003E在AS中会很简单,右键主工程—Open Module Setting — 选中某一个工程,点击右边的Dependencies选项,点击“+”,分别添加Library\u002FFile\u002FModule dependency,Library dependency和File dependency主要是添加jar包(File dependency的jar包是放在工程的libs文件夹下),Module dependency是添加libproject,so放在工程的\&libs\u002F架构文件夹\&下,不需要配置依赖关系。AS的依赖关系配置完成后,可以在工程的\&build.gradle\&文件中查看。依赖关系配置完成后,记得在build.gralde文件的android标签下增加下面这句话,依赖关系才生效:\u003C\u002Fp\u003E\u003Cp\u003EsourceSets {\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E
jniLibs.srcDirs = ['libs']\n
}\n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E8、问:Eclipse和AS中主工程对其它工程的依赖有什么异同?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E相同点:\u003C\u002Fb\u003EEclipse和AS都可以依赖so、jar包和libproject;组织结构也一样,so和jar包放在libs文件夹,libproject是一个独立的工程,需要手动配置依赖关系。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E不同点:\u003C\u002Fb\u003EAS还可以依赖aar,并且AS除了可以依赖本地的库,还可以依赖服务器上的库,但Eclipse只能依赖本地库。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E9、问:jar包和aar有啥区别?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003Ejar包不能将so和资源文件打包进去,但aar可以,看得到的就是这点区别。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E10、问:AS使用过程遇到过哪些问题,是怎么解决的?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cli\u003E\u003Cp\u003Eassets文件的存放目录在”src\u002Fmain\u002F”目录下,和java、res文件夹平级;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Eaidl文件需要单独在”src\u002Fmain\u002F”目录下新建一个文件夹,然后创建对应的包名,将aidl文件放在包名对应的包下。\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003E引用libs文件夹中的so,需要在对应module下的build.gradle文件的android标签下加上如下属性:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E
android {\n
sourceSets {\n
jniLibs.srcDirs = ['libs']\n
}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003Eandroid studio的编译时屏蔽掉lint检查,可以避免由于编译条件太过严格而编译不过的问题:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E
lintOptions {\n
abortOnError false\n
}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E如果遇到多个jar包中的某个文件冲突,可以在对应module下的build.gradle文件的android标签下加上如下属性:\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E
packagingOptions {\n
exclude 'META-INF\u002FNOTICE.txt'\u002F\u002F 这里是具体的冲突文件全路径\n
exclude 'META-INF\u002FLICENSE.txt'\n
}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E调整logcat文件显示的颜色:File→Setting→Editor→Colors&Fonts→Android Logcat→在界面的右侧调节logcat每个级别日志的颜色;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E显示行号:File→Setting→Editor→General→Appearance→勾选“Show line numbers”;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003ELogcat的console中,显示”no debuggable applications”的问题:Tools→Android→Enable ADB Integration;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E如果依赖工程和主工程中有同名同类型的资源文件,需要修改依赖工程中的资源名称编译时才不会报错,如果依赖工程中的这个资源文件是整个工程都不需要用到的,可以直接删掉;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003EAndroid Studio中一个主工程依赖多个library的模式编译时很慢(clean和rebuild时,之前Eclipse中是这种模式),因为这种工程框架是主工程和每个依赖工程中都有一个build.gradle,编译起来会消耗比较长的时间,可以将没有资源文件和so的依赖工程打包成jar包,有资源文件和so的打包成aar文件,然后在主工程中引用,这样编译会很快;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003EAndroid Studio对九图的要求很严格,如果文件以”.9.png”结尾但是图片不是9图,编译的时候会报错,解决方案是直接在AS中打开这张图片,通过9图编辑工具编辑成9图即可;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E修改Module之间的依赖关系有两种方式:(1)直接修改每个module的build.gradle文件中的dependencies;(2)右键project→Open Module Settings→在弹出面板的左侧Modules一栏中选中要修改依赖关系的Module,点击右侧的Depencencies标签修改即可;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003EAndroid Studio自动导包:File→Settings→Editor→General→Auto Import→Java→切换“Insert imports on paste”为“All”→勾选“Add unambigious imports on the fly”;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E代码格式化快捷键:CTRL+ALT+L;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E重命名文件夹或者文件的快捷键:ALT+SHIFT+R;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E鼠标悬浮在某个方法上时,显示该方法的信息:Preferences→Editor→Show doc on mouse move;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E删除一个Module,直接在IDE中选中Module后按Delete是删不掉的,需要先右键project→Open Module Settings→在弹出面板的左侧Modules一栏中选中要删除的Module→点击面板左上角的“-”符号→点击OK后回到IDE,然后选中要删掉的Module,按Delte快捷键删掉即可;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003EAndroid Studio中执行Lint等工具对代码的检测,Analyze→Inspect Code;\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E导入aar:将aar拷贝到libs文件夹,在module的build.gradle文件增加下面这段话:\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cbr\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-java\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Erepositories\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003EflatDir\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E()\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E{\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Edirs\u003C\u002Fspan\u003E \u003Cspan class=\&err\&\u003E'\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Elibs\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E'\u003C\u002Fspan\u003E\n
\u003Cspan class=\&o\&\u003E}\u003C\u002Fspan\u003E\n\u003Cspan class=\&o\&\u003E}\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&n\&\u003E然后在build\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&na\&\u003Egradle的dependencies标签中按照如下格式引用aar文件即可\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E:\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003Ecompile\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ename\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E'\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eaar包名不带扩展名\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E'\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eext\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E:\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E'\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eaar\u003C\u002Fspan\u003E\u003Cspan class=\&err\&\u003E'\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cu\u003E\u003Cb\u003E11、问:AS相比于Eclipse,有哪些新的工具或者更方便的功能?\u003C\u002Fb\u003E\u003C\u002Fu\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E查看APP的内存占用、内存变化情况的工具;\u003C\u002Fli\u003E\u003Cli\u003E查看APP运行过程中网络使用情况的工具;\u003C\u002Fli\u003E\u003Cli\u003E查看CPU、GPU使用情况的工具;\u003C\u002Fli\u003E\u003Cli\u003E代码清理(Analyze—Code cleanup....)、代码静态检查工具(增强的ling检查工具,Analyze—Inspect code....);\u003C\u002Fli\u003E\u003Cli\u003E可以直接使用DOS窗口;\u003C\u002Fli\u003E\u003Cli\u003E给打码加书签的功能(Eclipse也有,只是之前没用过);\u003C\u002Fli\u003E\u003Cli\u003EIDE类9图编辑功能;\u003C\u002Fli\u003E\u003Cli\u003E快捷键\u003C\u002Fli\u003E\u003Cli\u003EAS2.2加入了反编译APK的功能:Build→Analyze APK...,非常方便;\u003C\u002Fli\u003E\u003Cli\u003E......很多很多一些小的功能,用熟了特别方便。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E\u003Cu\u003E12、问:在使用AS的过程中,有什么忠告?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E就像在使用Eclipse的时候不要轻易更新ADT一样,在使用AS的过程中不要轻易更新gradle和AS,每个版本会有一些差别,会有很多坑,还是等新版本出来一段时间,比较稳定后再用,毕竟IDE是提高生产力的工具,如果需要花大把时间去学习如何使用和解决使用过程中的问题就太没意思了。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Cu\u003E13、问:Eclipse的工程转成AS的版本后,在同一个机器中安装会报”INSTALL_FAILED_VERSION_DOWNGRADE“这个错误,是什么原因导致的?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E这是因为机器中存在一个版本号比安装apk版本号更高的版本,出现这个问题的原因是因为as除了可以在Manifest.xml文件中设置apk的版本名和版本号,还可以在build.gradle文件中设置apk的版本名和版本号,记得修改build.gralde中的版本名和版本号到最新就可以了。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E14、导入Google官方的Sample不成功,如何处理?\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003EAndroid Studio 导入 Google Sample 时,需要联网获取,由于某些原因,连接不了服务器。参考网上的\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\u002Fblog.csdn.net\u002Fcxw\u002Farticle\u002Fdetails\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E方案\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E,给出一种更为简便、快速的方法:在 host 文件中加入一句: \u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E64.233.162.84
\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E如果 ip 失效了,找个有用的替换即可(win7的host文件在:C:\\Windows\\system32\\drivers\\etc 目录下)。\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E\u003Cu\u003E15、AS中的module被我remove掉了,但现在又想加进来怎么弄?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E这个我研究过,不能通过UI界面来配置,每个project下面有一个settings.gradle文件,里面是这个project包含了哪些module,你只需要在这里面添加被remove掉的module名称即可,格式:‘:module名称’。\u003Cbr\u003E\u003Cbr\u003E\u003Cb\u003E\u003Cu\u003E16、在AS中,libproject需要在AndroidManifest.xml中声明的内容是和Eclipse一样,需要在主工程中声明吗?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E不需要,在AS中,如果你依赖了library或者aar,只需要在library或aar中对应的AndroidManifest.xml中声明这个工程对应的属性就行了,不需要在主工程中的AndroidManifest.xml文件中去声明依赖包需要的声明。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E\u003Cu\u003E17、有没有比较好的gradle教程推荐?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fa\u002F9002\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EGradle for Android 第一篇( 从 Gradle 和 AS 开始 )\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fa\u002F4712%3F_ea%3D538654\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EGradle for Android 第二篇( Build.gradle入门 )\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fa\u002F7922\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EGradle for Android 第三篇( 依赖管理 )\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cbr\u003E\u003Cb\u003E\u003Cu\u003E18、如何在构建时删掉build\\output目录下的unsigned-align.apk?\u003C\u002Fu\u003E\u003C\u002Fb\u003E\u003Cbr\u003E\u003Cb\u003E答:\u003C\u002Fb\u003E在build.gradle文件中加上下面这一段话:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u002F\u002F delete unaligned files\nandroid.applicationVariants.all { variant -&\n
variant.assemble.doLast {\n
variant.outputs.each { output -&\n
println \&aligned \& + output.outputFile\n
println \&unaligned \& + output.packageApplication.outputFile\n\n
File unaligned = output.packageApplication.outputF\n
File aligned = output.outputFile\n
if (!unaligned.getName().equalsIgnoreCase(aligned.getName())) {\n
println \&deleting \& + unaligned.getName()\n
unaligned.delete()\n
}\n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E&,&updated&:new Date(&T12:07:49.000Z&),&canComment&:false,&commentPermission&:&friends&,&commentCount&:2,&collapsedCount&:0,&likeCount&:336,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F718cadcc09b5_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Android Studio&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Android 开发&}],&adminClosedComment&:false,&titleImageSize&:{&width&:1260,&height&:760},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&zmywly8866&,&name&:&张明云的知识共享&},&tipjarState&:&inactivated&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:2,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T20:07:49+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&来知乎瞎蹿。。。&,&isFollowing&:false,&hash&:&4f933e082ab989bd97cb93da95dc5a1d&,&uid&:337000,&isOrg&:false,&slug&:&luo-jimmy-86&,&isFollowed&:false,&description&:&来知乎瞎蹿。。。&,&name&:&Fuvcdoi&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fluo-jimmy-86&,&avatar&:{&id&:&fefc4039caaaf9b4cb8f4c&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&c541a498f7b7937d1cea813a99416a7c&,&uid&:489000,&isOrg&:false,&slug&:&xiong-da-xiong-86&,&isFollowed&:false,&description&:&&,&name&:&熊大熊&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fxiong-da-xiong-86&,&avatar&:{&id&:&6e03b7e1f3cbc15b37771&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&java&,&isFollowing&:false,&hash&:&c6b3db82d5f92cb5bf2c&,&uid&:192400,&isOrg&:false,&slug&:&ling-74-51-15&,&isFollowed&:false,&description&:&&,&name&:&ling&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fling-74-51-15&,&avatar&:{&id&:&v2-eca1cd68919dde&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&学生&,&isFollowing&:false,&hash&:&acbd8639f8bcbbe63f355ac&,&uid&:200600,&isOrg&:false,&slug&:&mo-gu-bu-shi-gu-41&,&isFollowed&:false,&description&:&人生就是不管做什么都会后悔呀!&,&name&:&蘑菇不是菇&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fmo-gu-bu-shi-gu-41&,&avatar&:{&id&:&6a4189acc74f078a6a7f37c&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:null,&isFollowing&:false,&hash&:&fac1af537b4652fe97fe&,&uid&:60,&isOrg&:false,&slug&:&huang-kai-jun-46&,&isFollowed&:false,&description&:&&,&name&:&lemon&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fhuang-kai-jun-46&,&avatar&:{&id&:&c5a5ba52b&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&AS出来一年多了,最近才从Eclipse转到AS,但我并不觉得使用Eclipse有多落后,它们都只是一个工具而已,哪个顺手就用哪个,用得好都能提高生产力,不会合理利用,再好的工具也是惘然。很多使用Eclipse的Android程序员不知道代码重构的快捷键、如何在运行时调…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002F4c571e3feb7_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Android 开发&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Android&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Android Studio&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&公众号:open_dev&,&isFollowing&:false,&hash&:&62f8e6fcf3bfc0e3ea3014a&,&uid&:12,&isOrg&:false,&slug&:&zhang-ming-yun-88&,&isFollowed&:false,&description&:&&a href=\&http:\u002F\\u002Flarge\u002F6d17e381gw1f4lrrlm8eaj206706mwep.jpg\&&分答&\u002Fa&&a href=\&http:\u002F\u002Fzmywly8866.github.io\u002F\&&博客&\u002Fa&&a href=\&http:\u002F\\u002Fusers\u002Fed4\u002Flatest_articles\&&简书&\u002Fa&&a href=\&https:\\u002Fzmywly8866\&&Github&\u002Fa&&,&name&:&张明云&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fzhang-ming-yun-88&,&avatar&:{&id&:&094ff2761def5a8b6c72e7b7c8af044e&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&zmywly8866&,&name&:&张明云的知识共享&},&content&:&\u003Cp\u003E最近正准备写一篇关于这方面的文章,正好看到知乎上的这个问题:\u003Ca href=\&http:\u002F\\u002Fquestion\u002F#answer-\& class=\&internal\&\u003EAndroid 开发中,有哪些坑需要注意? - Android\u003C\u002Fa\u003E,索性以写答案的方式来写这篇文章,顺便推荐我之前在知乎上提出的一个问题:\u003Ca href=\&http:\u002F\\u002Fquestion\u002F\& class=\&internal\&\u003E在Android开发的过程中,有哪些坑是值得你放在checklist中警示自己的? - 程序员\u003C\u002Fa\u003E,里面有一些有参考价值的答案。\u003C\u002Fp\u003E\u003Cp\u003E作为一个有三、四年Android应用开发经验的码农,自然会遇到很多坑,下面是我能够想起的一些坑(实践证明不记笔记可不是个好习惯),后面有想到其它坑会陆续补上。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E在Android library中不能使用switch-case语句访问资源ID:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\u002Fzmywly8866.github.io\u002F\u002F24\u002Fandroid-can-not-use-switch-to-load-resource-in-libproject-solution.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E不能在Activity没有完全显示时显示PopupWindow和Dialog:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fquestions\u002F2Fproblems-creating-a-popup-window-in-android-activity\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Epopupwindow - Problems creating a Popup Window in Android Activity\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E在多进程之间不要用SharedPreferences共享数据,虽然可以(MODE_MULTI_PROCESS),但极不稳定:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fquestions\u002F2Fmode-multi-process-for-sharedpreferences-isnt-working\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Eandroid - MODE_MULTI_PROCESS for SharedPreferences isn't working\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E有些时候不能使用Application的Context,不然会报错(比如启动Activity,显示Dialog等):\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002F9be7e8e2d05cd088fb79d22b211fdaad_b.jpg\& data-rawwidth=\&600\& data-rawheight=\&328\& class=\&origin_image zh-lightbox-thumb\& width=\&600\& data-original=\&https:\u002F\\u002F9be7e8e2d05cd088fb79d22b211fdaad_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cbr\u003E\u003Cstrong\u003E备注:\u003C\u002Fstrong\u003E大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E1、数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task,一般情况不推荐;\u003Cbr\u003E\u003Cbr\u003E\n2、数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用;\u003Cbr\u003E\u003Cbr\u003E\n3、数字3:在Receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视);\u003Cbr\u003E\u003Cbr\u003E\n4、ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E同一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003EAndroid的JNI代码中,有返回类型的函数没有返回值编译的时候也不会报错;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E谨慎使用Android的透明主题,透明主题会导致很多问题,比如:如果新的Activity采用了透明主题,那么当前Activity的onStop方法不会被调用;在设置为透明主题的Activity界面按Home键时,可能会导致刷屏不干净的问题;进入主题为透明主题的界面会有明显的延时感;\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cul\u003E\u003Cli\u003E不要在非UI线程中初始化ViewStub,否则会返回null;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E公共接口一定要考虑到代码重入的情况,能设计为单例就尽量用单例;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E不要通过Bundle传递大块的数据,否则会报TransactionTooLargeException异常:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fquestions\u002F2Fissue-passing-large-data-to-second-activity\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ejava - Issue: Passing large data to second Activity\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E尽量不要通过Application缓存数据,这不稳定:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\u002Fzmywly8866.github.io\u002F\u002F26\u002Fandroid-do-not-store-data-in-the-application-object.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E不要在Android的Application对象中缓存数据!\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cul\u003E\u003Cli\u003E(AnimationDrawable在Android5.0及以上的版本已有明显的优化)尽量不要使用AnimationDrawable,它在初始化的时候就将所有图片加载到内存中,特别占内存,并且还不能释放,释放之后下次进入再次加载时会报错;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E9图不能通过tinypng压缩,不然会有问题;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003Egenymotion模拟器快是因为它是基于x86架构的,如果你的应用中用到了so,但没有x86架构的so,只能放弃使用它;Android Studio的模拟器也一样;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003EEclipse的Android开发环境配置好后不要轻易升级ADT和build tools,不然会浪费你很多时间,还有就是一个workspace中的工程不要太多,不然每次启动都会很慢;\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cul\u003E\u003Cli\u003EAndroid studio每个版本、gradle每个版本差别都比较大(我是这样认为的),对于jni代码的编译建议在Eclipse中进行,如果在Android studio中开发jni会浪费很多时间,主要是编译脚本的配置比较麻烦;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003EEclipse中的Lint太不靠谱,特别是主工程中依赖library的时候,很多提示都是有问题的,建议使用Android Studio的工程清理工具,特别推荐;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E不同API版本的AsyncTask实现不一样,有的是可以同时执行多个任务,有的API中只能同时执行一个线程,所以在程序中同时执行多个AsyncTask时有可能遇到一个AsyncTask的excute方法后很久都没有执行。\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\u002Fzmywly8866.github.io\u002F\u002F29\u002Fandroid-call-asynctask-excute-not-run.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E同一个应用,相同的图片分别放在drawable-xxhdpi、drawable-xhdpi、drawable-hdpi、drawable-mdpi、drawable-ldpi中,在同一设备中占用的内存会大不一样(设备的dpi是固定的,图片放在不同的dpi文件夹下,在设备上显示时需要将图片转换成和当前屏幕一样dpi后在设备中显示,所以即使该图片在不同dpi文件夹下大小一样,但放在内存中的大小却不是一样的,并不一定是长*宽*4),做应用的内存优化之前可以先看一看你的工程是如何做屏幕适配的,是否有优化的空间。强烈推荐这个屏幕适配视频教程,花两个半小时就能看完:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002Flearn\u002F484\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EAndroid-屏幕适配全攻略\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cul\u003E\u003Cli\u003E谨慎对待数据库升级(比如需要在原数据库中增加字段),避免数据丢失或者操作数据库异常的情况,数据库升级方法可以查阅《第一行代码》P263;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E多个程序共用一套代码(一套代码,在桌面上多个图标)时需要处理好不同入口进入时的堆栈问题;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView的方法中无论这项的每个视图是否需要设置属性(比如TextView设置的属性可能为null,item的某一个按钮的背景为透明、某一项的颜色为透明等),都需要为每一项的所有视图设置属性(textview的属性为空也需要设置setText(\&\&),背景透明也需要设置),否则在滑动的过程中会出现内容的显示错乱。\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E谨慎使用Android的多进程,多进程虽然能够降低主进程的内存压力,但会遇到如下问题:(1)不能实现完全退出所有Activity的功能(如果有同行在应用内采用多进程成功实现过完全退出程序欢迎沟通交流);(2)首次进入新启动进程的页面时会有延时的现象(有可能黑屏、白屏几秒,是白屏还是黑屏和新Activity的主题有关);(3)应用内多进程时,新启动一个进程都会重新跑一次Application的onCreate方法,不上重新创建一个Application,但会重新跑Application的onCreate,这样就不能在Application中缓存数据作为内存共享的途径了;(4)多进程间通过SharedPreferences共享数据时不稳定,具体可以查阅《Android开发艺术探索》。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cul\u003E\u003Cli\u003E使用Toast时,建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况(如果你有连续弹出Toast的情况,避免使用Toast.makeText);\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003EView的面积越大绘制的时间就越长,透明通道对View的绘制速度影响很大;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E不要通过Msg传递大的对象,会导致内存问题。\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E关于AS的使用经验,参见:[Android Studio使用过程中需要弄明白的一些问题](\u003Ca href=\&http:\u002F\\u002Fzmywly375410\& class=\&internal\&\u003EEclipse转Android Studio的过程中有必要弄明白的一些问题 - 张明云的知识共享 - 知乎专栏\u003C\u002Fa\u003E)\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cul\u003E\u003Cli\u003EEclipse的工程转成AS的版本后,在同一个机器中安装会报”INSTALL_FAILED_VERSION_DOWNGRADE“这个错误,原因是因为as除了可以在Manifest.xml文件中设置apk的版本名和版本号,还可以在build.gradle文件中设置apk的版本名和版本号,记得修改build.gralde中的版本名和版本号到最新就可以了;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E通常情况下,在插入USB之后可能会跳转到一个新的界面,这时候可能你本来是横屏的,突然跳转到这个新界面是竖屏的,虽然你的界面被压在下面,但是还是会被强制横竖屏切换一次,如果这时候你的界面不做处理就会重载,如果你的界面里面有很多fragment,这时候的重载更加复杂,难以处理。所以建议不做横竖屏切换的界面都弄一下横竖屏切换不重载。\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E如果你在 manifest 中把一个 activity 设置成 android:windowSoftInputMode=\&adjustResize\&,那么 ScrollView(或者其它可伸缩的 ViewGroups)会缩小,从而为软键盘腾出空间。但是,如果你在 activity 的主题中设置了 android:windowFullscreen=\&true\&,那么 ScrollView 不会缩小。这是因为该属性强制 ScrollView 全屏显示。然而在主题中设置 android:fitsSystemWindows=\&false\& 也会导致 adjustResize 不起作用;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E做自定义手写功能时,底层上报的点并不会都在MotionEvent中能够及时接收到,比如底层一秒钟200个点,上层收到的可能只有几十个点,为了提高手写的流畅度,在onTouchEvent中,通过MotionEvent中的getHistorySize能够获取到从底层传输到上层过程中所有的点;\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cul\u003E\u003Cli\u003E在Android 4.0以后,在Manifest.xml中静态注册的广播,程序安装后必须启动一次才能接收到广播,比如你的应用监听开机启动的广播,必须要你的程序被运行过才能监听到;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E一个AS的工程中,module不宜太多,否则会影响编译的速度,建议将不是经常变动的module打包成aar,主工程直接依赖aar可以大大提高编译的速度;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E在AS中,如果你想动态同步一个依赖包的更新,可以在依赖包的最后面写上“+”,比如:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Ecompile 'com.android.support:appcompat-v7:23.0.+' \n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E,但这种方法需要谨慎使用,否则会因为依赖包的变动导致你的项目不稳定:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\u002Fblog.danlew.net\u002F\u002F09\u002Fdont-use-dynamic-versions-for-your-dependencies\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EDon't use dynamic versions for your dependencies\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003Erelease版本的apk需要签名才能正常安装;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E在2.3之前GC操作是不能并发进行的,也就是系统正在进行GC程序就只能阻塞住等待GC结束,在2.3之后GC操作改成了并发的方式进行,GC过程中不会影响程序的正常运行,但在GC操作的开始和结束还是会短暂阻塞一段时间。所以频繁的GC会导致使用应用的过程中卡顿,所以为了应用在使用过程中更流畅,需要尽量减少触发GC操作,这涉及到性能优化,对于静态代码的分析,AS已经很强大了,可以使用Android Studio的Analyze→Inspect Code...进行分析;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E尽量避免给window和Activity同时都设置了背景,这样会造成过渡绘制,可以通过在给Activity设置主题时,去掉windowBackground背景的方式减少一层过渡绘制,有时候为了避免进入Activity时会黑屏或者白屏(和主题有关),会在给Activity设置主题的时候给window设置背景,如果这种情况下给Activity也设置了背景,是会增加一倍内存的:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E&item name=\&android:windowBackground\&&@null&\u002Fitem&\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E一个类的finalize方法调用时机是不确定的,应该避免指望通过这个方法去释放与类相关的资源,否则会导致一些随机bug;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003EActivity的onDestory方法调用时机是不确定的(有时候离开界面很久之后才会调用onDestory方法),应该避免指望通过onDestory方法去释放与Activity相关的资源,否则会导致一些随机bug;\u003C\u002Fli\u003E\u003Cbr\u003E\u003Cli\u003E不要指望MAT明确告诉你哪里存在内存泄露,它只会提供各个类间的引用关系,所以可以通过leakcanary或者通过adb shell dumpsys meminfo packagename查看进入\u002F退出一个界面后activity和views数量的变化情况,来初步定位可能存在内存泄露的地方,然后通过MAT工具找到具体的地方。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E能力有限,有些坑可能本身不是坑,只是自己没有处理好,再加上知识面有限,若有疑义,欢迎在评论区沟通交流。\u003C\u002Fb\u003E\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T10:47:04+08:00&,&url&:&\u002Fp\u002F&,&title&:&Android 开发中,有哪些坑需要注意?&,&summary&:&最近正准备写一篇关于这方面的文章,正好看到知乎上的这个问题:\u003Ca href=\&http:\u002F\\u002Fquestion\u002F#answer-\& class=\&internal\&\u003EAndroid 开发中,有哪些坑需要注意? - Android\u003C\u002Fa\u003E,索性以写答案的方式来写这篇文章,顺便推荐我之前在知乎上提出的一个问题:\u003Ca href=\&http:\u002F\\u002Fquestion\u002F\& class=\&internal\&\u003E在Android开发的过程中,有哪些坑是值得你放在checklist中警示自己…\u003C\u002Fa\u003E&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&friends&,&commentsCount&:6,&likesCount&:167},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002Ff961dbd4f2326_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&公众号:open_dev&,&isFollowing&:false,&hash&:&62f8e6fcf3bfc0e3ea3014a&,&uid&:12,&isOrg&:false,&slug&:&zhang-ming-yun-88&,&isFollowed&:false,&description&:&&a href=\&http:\u002F\\u002Flarge\u002F6d17e381gw1f4lrrlm8eaj206706mwep.jpg\&&分答&\u002Fa&&a href=\&http:\u002F\u002Fzmywly8866.github.io\u002F\&&博客&\u002Fa&&a href=\&http:\u002F\\u002Fusers\u002Fed4\u002Flatest_articles\&&简书&\u002Fa&&a href=\&https:\\u002Fzmywly8866\&&Github&\u002Fa&&,&name&:&张明云&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fzhang-ming-yun-88&,&avatar&:{&id&:&094ff2761def5a8b6c72e7b7c8af044e&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&zmywly8866&,&name&:&张明云的知识共享&},&content&:&\u003Cp\u003E\u003Cb\u003E零 简介:\u003C\u002Fb\u003E\u003C\u002Fp\u003E艾森豪威尔法则是一种给事情排优先级的方法;\u003Cp\u003E费曼技巧是一种提高学习效率的方法;\u003C\u002Fp\u003E\u003Cp\u003E这两者除了都是以人名命名的方法外,并没有直接的联系,但都是提高学习或工作效率的手段。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E一 艾森豪威尔法则:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002F1e3b3dd6967842defb9ff7e26ba7fb90_b.jpg\& data-rawwidth=\&960\& data-rawheight=\&720\& class=\&origin_image zh-lightbox-thumb\& width=\&960\& data-original=\&https:\u002F\\u002F1e3b3dd6967842defb9ff7e26ba7fb90_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cb\u003E说明:\u003C\u002Fb\u003E如上图所示,艾森豪威尔法则又名四象限法则或者十字法则,由于每个人的时间有限,在一段时间内能够完成的事情也有限,所以很有必要将需要做的事情分优先级,先完成什么,再完成什么,或者哪些是不需要完成的,按照“要事第一”的法则,将需要做的事情分成如下四类:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cb\u003E重要紧急:\u003C\u002Fb\u003E需要尽快处理的,最优先;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E重要不紧急:\u003C\u002Fb\u003E可暂缓,但要加以足够的重视的,最应该偏重做的事;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E不重要紧急:\u003C\u002Fb\u003E不太重要,但需要尽快处理的,可考虑是否安排他人;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E不重要不紧急:\u003C\u002Fb\u003E不重要,且也不需要尽快处理的,可考虑是否不做、委派他人、或推迟。\u003Cbr\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E使用场景:\u003C\u002Fb\u003E这个法则不仅适合于工作中,同样适合于生活中,还适合于对人生的规划。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E其它:\u003C\u002Fb\u003E采铜老师在\u003Ca href=\&http:\u002F\\u002Fquestion\u002F2Fanswer\u002F\& class=\&internal\&\u003E你有什么相见恨晚的知识想推荐给年轻人? - 采铜的回答\u003C\u002Fa\u003E这个问题的回答中,将这个法则演变为一种【可实现的成功学】,将事情分为:\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E高收益、长半衰期事件;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E高收益、短半衰期事件;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E低收益、长半衰期事件;\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E低收益、短半衰期事件。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E也是告知我们在做事情的时候,按照一定的原则将需要做的事情分类,这样有助于我们时刻在做对我们更有意义、更有价值的事情。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E二 费曼技巧\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca class=\& wrap external\& href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002Fv_show\u002Fid_XNDc1OTg1ODUy.html%3Ffrom%3Ds1.8-1-1.2\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E《如何高效学习》配套视频 The Feynman Technique—在线播放—优酷网,视频高清在线观看\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E说明:\u003C\u002Fb\u003E费曼技巧印证了金字塔学习原理,最有效的学习方式是教别人,工作越久,我对这种方法越认同,很多人写博客也是这个目的,写出来是为了能够更好地理解,对知识点的理解越深入就越难忘记,费曼学习技巧的具体步骤如下:\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cfigure\u003E\u003Cimg src=\&https:\u002F\\u002F6e2287cbf05c24b66b4030_b.jpg\& data-rawwidth=\&646\& data-rawheight=\&343\& class=\&origin_image zh-lightbox-thumb\& width=\&646\& data-original=\&https:\u002F\\u002F6e2287cbf05c24b66b4030_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cul\u003E\u003Cli\u003E\u003Cb\u003E选择一个你想要理解的概念:\u003C\u002Fb\u003E拿出一张白纸, 把这个概念写在白纸的最上边.\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E设想一种场景,你正要向别人传授这个概念:\u003C\u002Fb\u003E在白纸上写下你对这个概念的解释,就好像你正在教导一位刚接触这个概念的学生一样. 当你这样做的时候, 你会更清楚地意识到关于这个概念你理解了多少, 以及是否还存在理解不清的地方.\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E如果你感觉卡壳了, 就回顾一下学习资料:\u003C\u002Fb\u003E无论何时你感觉卡壳了, 回到原始的学习资料并重新学习让你感到卡壳的那部分, 直到你领会得足够顺畅, 顺畅到可以在纸上解释这个部分为止.\u003Cbr\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cb\u003E为了让你的讲解通俗易懂,简化语言表达最终的目的, 是用你自己的语言, 而不是学习资料中的语言来解释概念:\u003C\u002Fb\u003E如果你的解释很冗长或者令人迷惑, 那就说明你对概念的理解可能并没有你自己想象得那么顺畅,你要努力简化语言表达, 或者与已有的知识建立一种类比关系, 以便更好地理解它。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E\u003Cb\u003E使用场景:\u003C\u002Fb\u003E只要是学习都可以使用这种方式,学习效率会大大提高。\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003E三 总结:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E这两种方法我接触已经有一段时间,还在不断学习和验证中,但可以肯定的是,这两种方法确实有效,它们大大提高了我的工作效率。\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T19:43:21+08:00&,&url&:&\u002Fp\u002F&,&title&:&艾森豪威尔法则和费曼技巧&,&summary&:&\u003Cb\u003E零 简介:\u003C\u002Fb\u003E艾森豪威尔法则是一种给事情排优先级的方法;费曼技巧是一种提高学习效率的方法;这两者除了都是以人名命名的方法外,并没有直接的联系,但都是提高学习或工作效率的手段。\u003Cb\u003E一 艾森豪威尔法则:\u003C\u002Fb\u003E\u003Cb\u003E说明:\u003C\u002Fb\u003E如上图所示,艾森豪威尔法则又名四象限法则或者…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&friends&,&commentsCount&:2,&likesCount&:62}},&annotationDetail&:null,&commentsCount&:2,&likesCount&:336,&FULLINFO&:true}},&User&:{&zhang-ming-yun-88&:{&isFollowed&:false,&name&:&张明云&,&headline&:&&a href=\&http:\u002F\\u002Flarge\u002F6d17e381gw1f4lrrlm8eaj206706mwep.jpg\&&分答&\u002Fa&&a href=\&http:\u002F\u002Fzmywly8866.github.io\u002F\&&博客&\u002Fa&&a href=\&http:\u002F\\u002Fusers\u002Fed4\u002Flatest_articles\&&简书&\u002Fa&&a href=\&https:\\u002Fzmywly8866\&&Github&\u002Fa&&,&avatarUrl&:&https:\u002F\\u002F094ff2761def5a8b6c72e7b7c8af044e_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&zhang-ming-yun-88&,&bio&:&公众号:open_dev&,&hash&:&62f8e6fcf3bfc0e3ea3014a&,&uid&:12,&isOrg&:false,&description&:&&a href=\&http:\u002F\\u002Flarge\u002F6d17e381gw1f4lrrlm8eaj206706mwep.jpg\&&分答&\u002Fa&&a href=\&http:\u002F\u002Fzmywly8866.github.io\u002F\&&博客&\u002Fa&&

我要回帖

更多关于 enableintegration 的文章

 

随机推荐