Android Studio 2.3调试小米手机安装失败

Android Studio 2.3调试小米手机 MIUI 8.7.4的时候,安装 APK一直失败,错误信息如下:

网上查询了一下,是 MIUI自身的优化导致的问题。
解决方法就是在 MIUI-> 设置-> 更多设置-> 开发者选项-> 启用MIUI优化,关闭这个选项就可以了。

参考链接


Android Studio 2.3 adb install-multiple Failed to create session Failure [UNS...

macOS Sierra (10.12.4)下使用Android Studio打开Android Virtual Device Manager报告“/dev/kvm is not found”错误

Android Virtual Device Manager突然出现了/dev/kvm is not found这个错误,我猜测大概 Hardware_Accelerated_Execution_Manager丢失了某些文件,或者没安装好 HAXM

继续阅读macOS Sierra (10.12.4)下使用Android Studio打开Android Virtual Device Manager报告“/dev/kvm is not found”错误

Android Studio 2.2 启用代码混淆

在新版本的 Android Studio中开启混淆的方法如下:

具体解释一下 minifyEnabled用来影响是不是开启混淆, shrinkResources只有在 minifyEnabledtrue的情况下,才能有效,用来去除无效的资源文件。 proguard-android-optimize.txtAndroid SDK-> tools\proguard目录下, Google已经写好默认的混淆模板文件,其中的 proguard-android.txt默认没有配置代码优化,而 proguard-android-optimize.txt默认配置了代码优化,至于我们自己工程下面的 proguard-rules.pro文件,只要配置我们自定义的额外配置即可,其他的用默认配置即可。

顺便讲一下代码混淆的好处:

1.代码安全,不易理解,增加破解难度。

2.减小APK的体积,减少内存开销。

3.缩减类名,方法名的长度,减少CPU开销。

参考链接


Android Studio 混淆代码时提示 “Warning:org.apache.commons.httpclient.util.URIUtil: can't find referenced class org.apache.commons.codec.net.URLCodec”

Android混淆代码时提示" Warning:org.apache.commons.httpclient.util.URIUtil: can't find referenced class org.apache.commons.codec.net.URLCodec"
解决方法是 proguard-rules.pro中增加如下语句:

其他类似的警告信息,可以参考以上的方法,逐行添加即可。

参考链接


ProGuard error can't find superclass or interface org.apache.http.entity

Android Studio升级到2.2正式版本后,在Windows命令行中执行“gradlew build”时,报告错误“Unsupported major.minor version 52.0”

Android Studio升级到 2.2正式版本后,在 Android Studio中编译一切正常。但是在 Windows命令行中执行“ gradlew build”时,报告如下错误:

这个原因,目前本人遇到的原因是,机器上同时安装了 jdk1.7.0_80jdk1.8.0_73两个版本的 JDK,而环境变量中的 JAVA_HOME指向的是 jdk1.7.0_80

解决方法就是修改 JAVA_HOME指向 jdk1.8.0_73即可。

注意,修改完成环境变量后,需要重启一下 Android Studio,以及 Windows命令行窗口。否则环境变量不生效。

Android Studio编译出的APK中一直包含android:debuggable="true"

最近遇到一个比较奇葩的事情,就是编译出来的 APKAndroidManifest.xml中的 application标签中一直包含 android:debuggable="true"。不管是 release版本,还是 debug版本,不管如何设置,最终生成的文件中的调试选项一直是处于开启状态。

一时间竟然有些无从下手的感觉。首先确认我们自己的配置文件是没有问题的,那么这个现象一定是引入了某个 aar中引入的 AndroidManifest.xml中存在这个 android:debuggable="true",导致 Android Studio在最终合并 AndroidManifest.xml文件的时候,把这个选项给合并进来了。

那么我们既然已经知道引入的地方,因此就只需要针对这种情况进行剖析即可了。

执行 gradlew build之后,我们在 app\build\intermediates\exploded-aar目录下面可以找到我们引入的全部的依赖的 aar。我们只需要逐个分析引入的 aar包的 AndroidManifest.xml文件即可。

那么比较奇葩,是奇葩在哪里呢? 正常情况下,我们引入一个 aar包,需要在 build.gradle中声明如下:

但是我们从真正的配置选项中看到的却是

按照一般的理解,我们如果没有设置 @aar,那么 Android Studio应该去下载对应的 jar包才对。但是我们从实际的编译过程中看到, Android Studio在没有指定 @aar的情况下,依旧默认去服务器上先尝试下载对应的 aar,只有当 aar找不到的时候才会去下载对应的 jar包。而恰好,我们服务器上面两者都是存在的。于是出现了乌龙事件,本来只是需要下载 jar包,结果却引入了一个莫名的 aar包。而这个 aar的开发同学又没有考虑到这种情况,以为用户只会用他提供的 jar包。
解决方法还是比较简单的,就是明确告知 Android Studio,我们需要的是 jar包,也就是增加 @jar。如下:

相关参考链接


Android Studio: Why is Release Build debuggable?

Android Studio 2.1.3配置Robolectric-3.0,Powermock-1.6.5单元测试环境

Android Studio提供了比较方便的单元测试,但是由于 Android系统的限制( ClassloaderGoogle自己实现的, Powermock无法修改底层的 bytecode),目前 Powermock还没办法直接在设备上执行测试,但是我们代码中难免存在一些静态对象,需要测试的时候,只能求助于 PowermockRobolectric的组合。
具体的配置如下:
1.首先在需要测试的项目的 build.gradle中声明需要使用 PowermockRobolectric

2.定义测试基类,在基类中声明一些必备的设置
AbsRobolectricPowerMockTest.java

3.定义真正的测试子类
DeckardActivityTest.java

注意,参考链接中的内容不可完全相信,按照参考链接中的配置( Robolectric-3.1.2+ PowerMock-1.6.5),一般会遇到如下问题(看上去很怪异,其实是由于不同的 classloader同时加载了相同的类,导致尽管类名是相同的,但是依旧无法进行类型转换):

参考链接


Gradle本站镜像

使用 Android Studio开发,最痛苦的其中一项是 Maven下载数据缓慢,目前已经可以根据在Ubuntu 14.04 系统中的Apache Tomcat上部署Apache Archiva 2.2.1来使用本站的代理服务器的方式进行提速了。另一个痛苦的事情就是下载 Gradle工具包的速度异常缓慢了,不仅慢,而且还容易失败。
目前本网站已经提供了 Gradle工具包的下载代理,具体的操作就是把 services.gradle.org进行域名污染,指向本站的 IP地址 121.199.27.227
Windows下的解决方法为修改 C:\Windows\System32\drivers\etc下的 hosts文件,里面增加如下内容:

接着修改 Android Studio项目下的 gradle\wrapper\gradle-wrapper.properties文件,把其中的

修改为:

注意,上面的修改其实主要是把 HTTPS修改成了 HTTP,原因在于 HTTPS无法进行域名污染。

当然,另外一个比较简单的修改方式为,只要修改 distributionUrl为本站地址,更加省事:

目前本站提供的 Gradle工具包版本如下:

Android Studio 2.1.2 在引用AAR的时候排除armeabi-v7a目录下的.so文件

Android Studio 2.1.2在引用 AAR的时候,如果 AAR中包含 armeabi-v7a版本的 .so文件,而我们自带的 .so又仅仅包含 armeabi版本的,会导致我们的APK在运行的时候崩溃,报告找不到 .so文件,另外就是会增大我们最后的 APK的大小,因此我们需要排除 armeabi-v7a目录下的 .so文件.
操作方法如下:

这个方法的本质是通过强制指定 abi的方式来要求 Android Studio排除其他系统版本的 .so文件。

同样道理,可以用来在 32位的 APK中排除 64位的 .so文件,减少 APK大小。

参考链接


How to use 32-bit native libaries on 64-bit Android device

Android Studio 2.1.2版本计算代码覆盖率

Android Studio 2.1.2版本已经集成了 JaCoCo用来进行代码覆盖的计算,严格上来说,这个功能并不是 Android Studio实现的,而是 IntelliJ IDEA早就实现的功能。

全部需要做的仅仅是在 build.gradle中增加 testCoverageEnabled = true即可,如下图:

testCoverageEnabled

然后,在命令行中执行

即可在每个子项目的 build\reports\coverage\debug\下面会生成代码覆盖率的统计文件。点击 index.html即可查看代码覆盖情况,目前看到的情况是,貌似只能统计到 test目录下覆盖到的代码,而无法统计 androidTest目录下的测试代码的覆盖情况。

参考链接