作者: 默默
Android Studio 指定签名证书文件
1.先参照Android Studio中创建keystore生成指定的证书文件。
2.在app/build.gradle文件中增加signingConfigs字段:如下所示:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.0" defaultConfig { applicationId "com.test.example" minSdkVersion 14 targetSdkVersion 21 versionCode 1 versionName "1.0" } signingConfigs { debug { File strFile = new File("../../Keystore/Debug/debug.jks") storeFile file(strFile) storePassword "storeDebug1234567890" keyAlias "debugkey" keyPassword "aliasDebug1234567890" //println strFile.absolutePath; } release { File strFile = new File("../../Keystore/Release/release.jks") storeFile file(strFile) storePassword "storeRelease1234567890" keyPassword "keyRelease1234567890" keyAlias "releasekey" // println strFile.absolutePath; } } buildTypes { release { signingConfig signingConfigs.release runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } |
注意
1.storeFile,storePassword,keyAlias,keyPassword缺一不可,都必须填写,并且填写正确。
如果没有填写keyAlias,则签名时候会报告Android-APK signing error : Failed to read key from keystore
密码不正确的时候,会报告java.security.UnrecoverableKeyException: Cannot recover key
This exception may result from the fact that you had provided a key password that was different from the keystore password
2.对于Release配置,在buildTypes中必须指定
|
1 |
signingConfig signingConfigs.release |
否则,会出现
|
1 |
Error: The apk for your currently selected variant(app-release-unsigned.apk) is not signed. please specify a signing configuration for this variant(release) |
3.signingConfigs必须在buildTypes前面声明,否则会出现找不到配置选项的错误。
查看Keystore文件的签名信息/检查APK文件中的签名信息
-
查看 keystore文件的签名信息
|
1 |
$ keytool -list -v -keystore keystoreName -storepass keystorePassword |
-
检查APK文件中的签名信息
解压出apk中META-INF目录下的CERT.RSA文件,然后用keytool即可查看签名信息:
|
1 |
$ keytool -printcert -file CERT.RSA |
-
比对签名是否一致
验证APK的签名是不是我们给定的签名文件的签名。
1.解压出apk中META-INF目录下的CERT.RSA文件.
2.执行如下命令:
Windows:
|
1 2 3 |
$ keytool -printcert -file CERT.RSA | findstr MD5 $ keytool -list -v -keystore keystoreName -storepass keystorePassword | findstr MD5 |
Linux:
|
1 2 3 |
$ keytool -printcert -file CERT.RSA | grep MD5 $ keytool -list -v -keystore keystoreName -storepass keystorePassword | grep MD5 |
比较两者输出的MD5字符串,是否一致即可。
Android Studio 1.5使用junit单元测试,以及“Test running startedTest running failed: Instrumentation run failed due to 'java.lang.RuntimeException' Empty test suite”
Android Studio 1.5创建的工程,会生成两个默认的测试目录:test,androidTest,其中,test目录为在本机执行单元测试代码的目录,androidTest为在Android设备上执行单元测试代码的目录。
目录如下图所示:
对于新建的工程,默认会生成相应的测试代码例子。如下图所示:
请注意上图的两个文件图标的差别,一个文件的图标的右上角是两个三角标记,另一个文件的右下角是个时钟的标记。
右击androidTest目录下的ApplicationTest.java,就会出现执行测试用例的菜单。如下图:
但是当右击test目录下的ExampleUnitTest.java则没有任何的运行菜单。如下图:
那么,如何执行test目录下的ExampleUnitTest.java呢?
操作方法为"View"->"Tool Windows"->"Build Variants",然后,切换Test Artifact从Android Instrumentation Tests到Unit Tests。
如下图:
切换Test Artifact
可以看到,切换完成后,两个文件的图标互换了一下:
此时右击test目录下的ExampleUnitTest.java则会出现Run 'ExampleUnitTest',Debug 'ExampleUnitTest'的菜单了。
如下图:
至于
|
1 2 |
Test running startedTest running failed: Instrumentation run failed due to 'java.lang.RuntimeException' Empty test suite |
这个问题,是由于Android Studio 的BUG,导致的,一般是没有执行上述的切换命令,然后右击test目录下的ExampleUnitTest.java依旧会出现Run 'ExampleUnitTest',Debug 'ExampleUnitTest'的菜单,然后点击后,会让我们选择运行的设备,这个时候,明显是把我们当作可以在设备上运行的测试用例了,因此,找不到是必然的。
应对这个BUG的解决方法,就是清理代码,然后重新加载工程,一般可以解决这个问题了。
Android Studio编译报错“java.lang.OutOfMemoryError: GC overhead limit exceeded”
Android Studio编译报错 java.lang.OutOfMemoryError: GC overhead limit exceeded
详细的崩溃信息如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: GC overhead limit exceeded at com.android.dx.cf.code.RopperMachine.getSources(RopperMachine.java:665) at com.android.dx.cf.code.RopperMachine.run(RopperMachine.java:288) at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:612) at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:412) at com.android.dx.cf.code.Simulator.simulate(Simulator.java:94) at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:782) at com.android.dx.cf.code.Ropper.doit(Ropper.java:737) at com.android.dx.cf.code.Ropper.convert(Ropper.java:346) at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:282) at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:139) at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:94) at com.android.dx.command.dexer.Main.processClass(Main.java:682) at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634) at com.android.dx.command.dexer.Main.access$600(Main.java:78) at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572) at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284) at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166) at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144) at com.android.dx.command.dexer.Main.processOne(Main.java:596) at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264) at com.android.dx.command.dexer.Main.run(Main.java:230) at com.android.dx.command.dexer.Main.main(Main.java:199) at com.android.dx.command.Main.main(Main.java:103) |
解决方法:
- 如果在整个工程中生效,则在build.gradle中增加如下配置:
12345678android {..............dexOptions {incremental truejavaMaxHeapSize "4g"}...............} - 如果只在单元测试的时候生效,则在build.gradle中增加如下配置:
12345678910android {..............testOptions {android.dexOptions {incremental truejavaMaxHeapSize "4g"}}...............}
Android Studio 1.5增加Stacktrace或debug选项输出详细编译错误
Android Studio 编译工程的时候,如果出现错误,会打印如下信息:
|
1 2 3 4 5 6 7 8 9 10 11 |
:myapp:processDebugResources FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:processDebugResources'. ... ... * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log outp |
最后会提示,增加--stacktrace,--info 或 --debug来获取更加详细的信息。
那么如何设置这些参数呢?如下操作即可:
"Android Studio"->"preferences-Build, Execution, Deployment"->"Compiler"
如下图所示:

com.android.dex.DexIndexOverflowException
现象描述
注意,本文描述的方案,仅在Android Studio 1.5,Gradle插件版本1.3.1中测试成立!
同时在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件。
编译时候产生如下的异常信息:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Error:Execution failed for task ':xxx:dexRelease'. > com.android.ide.common.internal.LoggedErrorException: Failed to run command: C:\Android\sdk\android-sdk\build-tools\23.0.1\dx.bat --dex --output D:\Source\android\build\intermediates\dex\release --input-list=D:\Source\android\build\intermediates\tmp\dex\release\inputList.txt Error Code: Output: UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502) at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277) at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168) at com.android.dx.merge.DexMerger.merge(DexMerger.java:189) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302) at com.android.dx.command.dexer.Main.run(Main.java:245) at com.android.dx.command.dexer.Main.main(Main.java:214) at com.android.dx.command.Main.main(Main.java:106) |
解决方案
Google给出的解决方案就是使用MultiDexApplication
-
Multidex Apps
1.在项目的build.gradle文件的dependencies 节中添加分包设置:
12345dependencies {...compile 'com.android.support:multidex:1.0.1'...}2.通过在defaultConfig节中设置multiDexEnabled标签为true,开启multi-dexing支持.
12345defaultConfig {...multiDexEnabled true...}3.如果没有创建自己的
Application.class,直接在AndroidManifest.xml文件的Application声明中添加:1android:name="android.support.multidex.MultiDexApplication"如果实现了自己的
Application.class,则修改继承的父类为
android.support.multidex.MultiDex.MultiDexApplication
-
Multidex Apps单元测试
1.在项目的build.gradle文件的dependencies 节中添加分包设置:
12345dependencies {...androidTestCompile 'com.android.support:multidex-instrumentation:1.0.1'...}2.通过在defaultConfig节中设置multiDexEnabled标签为true,开启multi-dexing支持.
123456defaultConfig {...multiDexEnabled truetestInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"...}
参考链接
Android Studio 自动更新失败解决办法(2015-11-21,1.4.1升级1.5.0版本有效)
昨天在G+中看到Android Studio又有更新了就心血来潮想去更新体验一下,可是无论我怎么点Check Update却一直提示
|
1 |
Connection failed. Please check your network connection and try again |
,开始以为是由于G*W在捣乱,但是打开VPN后还是无法更新,然后开始Google了一下找到了下面的解决办法。
Mac OSX
首先打开Finder在左边选择Application目录,在右边找到Android Studio.app,然后右击选择“显示包内容”如下图:
然后找到 Contents/bin/ 目录下的 .vmoptions 后缀的文件
Linux
找到 bin/ 目录下的 studio.vmoptions (32位系统) 或者 studio64.vmoptions (64位系统)文件
Windows
找到 bin/ 目录下的 studio.vmoptions (32位系统) 或者 studio64.exe.vmoptions (64位系统)文件
接着用自己趁手的编辑器打开 idea.vmoptions 或者 studio.vmoptions/studio64.vmoptions 或者 studio.exe.vmoptions/studio64.exe.vmoptions 文件添加如下内容:
|
1 2 3 |
-Djava.net.preferIPv4Stack=true -Didea.updates.url=http://dl.google.com/android/studio/patches/updates.xml -Didea.patches.url=http://dl.google.com/android/studio/patches/ |
保存后,重新打开Android Studio点击Check Update就会弹出更新信息提示了
如果仍然无效,将url里的修改http为https,然后重启点击Check Update试试~~~
android-ndk-r10e开启C++11,编译TEMP_FAILURE_RETRY错误
在使用select来操作socket的时候,一般都是会这么写
|
1 |
int err = TEMP_FAILURE_RETRY(select(socket_fd + 1, NULL, &set, NULL, const_cast<struct timeval*>(&timeout))); |
其中的“TEMP_FAILURE_RETRY”宏在“unistd.h”中的定义如下:
|
1 2 3 4 5 6 7 |
/* Used to retry syscalls that can return EINTR. */ #define TEMP_FAILURE_RETRY(exp) ({ \ typeof (exp) _rc; \ do { \ _rc = (exp); \ } while (_rc == -1 && errno == EINTR); \ _rc; }) |
正常情况下,编译是没问题的。但是当在“Application.mk”中增加
|
1 |
APP_CPPFLAGS += -std=c++11 |
之后,发现编译不通过了。报告“error: 'typeof' was not declared in this scope”。
解决方法:
|
1 |
APP_CPPFLAGS += -std=gun++11 |
“c++11”和“gnu++11”的差别:
“gnu++11”增加了很多的扩展“c++11”的功能,功能更加多,具体的扩展参考Extensions to the C++ Language
NDK下GCC定义__cplusplus不正确的问题
在C++升级之后,编译会出现“C++11 error: unable to find string literal operator 'operator"”这种错误,按照链接里面操作,在“android-ndk-r10e”上面依旧出现问题。
追踪了一下,才发现,这个是GCC的一个BUG,GCC-4.7,GCC-4.8中定义的__cplusplus 竟然都是 “__cplusplus=1”,这个是明显不正确的,具体的BUG内容查看“__cplusplus defined to 1, should be 199711L”。
尽管这个BUG已经修复了,但是很明显“android-ndk-r10e”使用的GCC版本并没有合并这个补丁。
解决方案:
升级GCC到4.9,在”Application.mk“中增加
|
1 |
NDK_TOOLCHAIN_VERSION = 4.9 |













