jarsigner自动输入密码 @ 5/30/2018

技术类
jarsigner是干什么的,请参考之前写的blog: Android Studio 3.0带来的烦恼(三) : INSTALL_FAILED_TEST_ONLY, INSTALL_PARSE_FAILED_NO_CERTIFICATES

鉴于程序员的良好品德:爱折(tou)腾(lan)
因为每次签名的时候都要手动输入一次密码,烦恼不已,所以看看能不能解决一下。

首先,发现了一个有趣的办法:
(shell)$ (sleep 1;echo password)|cmd
(cmd)> (sleep 1 && echo password)|cmd
可以完成自动输入的功能。

举例如下:
(cmd)> (sleep 1 && echo echo "hello world";exit;)|php -a
可以看到php执行成功并输出“hello world”后退出。

然而,jarsigner说:Keystore was tampered with, or password was incorrect
好吧,不知道jarsigner怎么就不认了的。
但是我还是会想办法让你认的。

然后,找到正确的姿势了:
jarsigner.exe -keystore ifyr.keystore -storepass pwd4ifyr -signedjar ifyr_signed.apk ifyr.apk ifyr.keystore -digestalg SHA1 -sigalg SHA1withRSA -tsa http://timestamp.digicert.com
也就是加入参数 -storepass 密码(不用引号)

Done.
发布于 5/30/2018 13:19:22 | 评论:0

DexArchiveMergerException: Unable to merge dex @ 5/17/2018

技术类
Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

原因:工程里面的jar包和导入依赖的包有重复引用导致的

解决方案:把不需要的导入依赖项删除掉就可以了
发布于 5/17/2018 19:18:52 | 评论:0

优化Android图片内存 @ 5/3/2018

学习类
from: 云栖

原理:
尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,这些函数在完成decode后,最终都在java调用createBitmap,使用了大量内存。优化的方法是通过BitmapFactory.decodeStream方法创建bitmap,再将其设为ImageView的source。因为decodeStream直接调用JNI>>nativeDecodeAsset() 来完成decode,不再使用java层的createBitmap,从而节省了java层的空间。
同时,在读取时加上图片的Config参数,也可以跟有效减少加载的内存。

注意:decodeStream直接拿的图片来读取字节码了, 不会根据机器的各种分辨率来自动适应, 使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源, 否则在不同分辨率机器上都是同样大小。

代码:
public static Bitmap readBitMap(Context context, int resId) {
    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inPreferredConfig = Bitmap.Config.RGB_565;
    opt.inPurgeable = true;
    opt.inInputShareable = true;
    InputStream is = context.getResources().openRawResource(resId);
    return BitmapFactory.decodeStream(is,null,opt);
}
发布于 5/3/2018 21:51:59 | 评论:0

等待所有线程结束 @ 4/28/2018

技术类
不知道是不是重复发明了轮子。
App完全退出(System.exit)之前,我需要确认所有线程的结束。这种线程其实有好多种,有AsyncTask实现的,有Thread实现的,我需要等这些都执行完了才能干净退出。
看了一下java.util.concurrent包,没有找到实现这种功能的,就做了一个,有需要的人可以随便拿去用。原理很简单:维持一个线程计数器,线程启动的时候加一,线程退出的时候减一。需要等待所有线程结束的时候,根据计数器新建一个CountDownLatch,await直到它减为0。
需要注意的是:默认认为调用await之后,不会再起任何线程了,如果还有需要的话,请自行修改代码。

点此阅读全文...
发布于 4/28/2018 14:43:50 | 评论:0

Android: Activity has leaked window @ 4/26/2018

学习类
from: stackoverflow

Android报错如下:
ERROR/WindowManager(18850): Activity com.ifyr.demo has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
ERROR/WindowManager(18850): android.view.WindowLeaked: Activity com.ifyr.demo has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here

可能原因1:
You're trying to show a Dialog after you've exited an Activity.

可能原因2:
This error can be a little misleading in some circumstances (although the answer is still completely accurate) - i.e. in my case an unhandled Exception was thrown in an AsyncTask, which caused the Activity to shutdown, then an open progressdialog caused this Exception.. so the 'real' exception was a little earlier in the log

可能原因3:
Call dismiss() on the Dialog instance you created before exiting your Activity, e.g. in onPause() or onDestroy()
发布于 4/26/2018 17:53:40 | 评论:0

Android: MediaPlayer播放音频Byte Array数组 @ 4/26/2018

技术类
如果内容不多(实测800K以内),可以直接用数据格式url:
String url = "data:audio/mp3;base64," + new String(Base64.encodeBase64(audio));
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();

如果内容超过800K,还是直接写文件吧。

当然AudioTrack其实可以播放stream,不过需要是stream format
所以如果是mp3,转换成PCM音频流就可以了。
发布于 4/26/2018 17:45:48 | 评论:0

Android Studio 3.0带来的烦恼(三) : INSTALL_FAILED_TEST_ONLY, INSTALL_PARSE_FAILED_NO_CERTIFICATES @ 3/16/2018

技术类
装完Android Studio 3.0,然后把 Android API升到了27.0.2,开发遇到的麻烦已经解决了。
现在是安装的问题:
Failure [INSTALL_FAILED_TEST_ONLY]

点此阅读全文...
发布于 3/16/2018 18:49:58 | 评论:0

RAIN戒烟法 @ 3/13/2018

转贴类
网上看到的,有点意思,保存一下。

耶鲁大学医学院 贾德森·布鲁尔(Judson Brewer)为吸烟者提出一种戒烟方法,这个方法跟佛学中的正念自控法如出一辙,布鲁尔总结一套戒烟方法,简称RAIN,R代表recognize the feeling,当感情出现时,不要被感情控制,正确的方法的第一步是识别感情;A代表accept the feeling,识别感情后,不要跟感情对抗,而是要接受感情,允许感情的出现;I代表investigate the feeling,这一步我们要调查感情,这个感情到底是怎样的,它具有什么特质,有什么颜色么,有什么质地么,调研的越深,越不被感情控制。N代表non-attachment,经过以上三步,最后达到的目标是,与情感保持距离,不被情感束缚,做到原理情感。这种戒烟方法比美国肺癌研究会推荐的方法更有效。

TED演讲视频:贾德森·布鲁尔:一个简单的方式戒掉坏习惯
发布于 3/13/2018 15:34:40 | 评论:0

Android Studio 3.0带来的烦恼(二) : 配置Gradle @ 3/3/2018

技术类
先要吐槽一下Android Studio,老特么升级,每次隔一段时间打开Android Studio,就要一堆更新,不然就跑不通。。。

这回又出错了,说是需要Gradle4.1,怎么配都不通。
于是上网搜了一下,才知道Gradle和Android plugin for gradle不是一个东西。
Android Studio 3.0.1用的Gradle 4.1,对应的是Android-gradle-plugin 3.0.1。

所以配置应该是这样的:
1. gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

2. build.gradle
classpath 'com.android.tools.build:gradle:3.0.1'

repositories {
    jcenter()
    google()
}
发布于 3/3/2018 18:45:07 | 评论:0

《周末读完法国史》 @ 2/28/2018

唧歪类
《A traveller's history of France》 Robert Cole, Denis Judd 著
《周末读完法国史》 杨博 王乃粒 译

地理:
法国3/4是平原,剩下1/4是丘陵和山脉,南部有个中央高原,东边是阿尔卑斯山,南边是比利牛斯山,北边是平原和比利时、卢森堡接壤。
法国整体上是得天独厚的,不像中国这样多山,也许比较像山东加上河北,宋朝没有了燕云十六州,北部就无险可守了,所以二战的时候德国突破比利时和卢森堡,法国就没戏唱了。
又加上全境气候温和,几乎无处不盛产葡萄酒,所以法国也成了兵家必争之地,注定法国要多打一些仗了。
有四条大河把法国分割成了四个部分,其中三个位于大平原上,所以法国早期各种分割冲突在所难免。

点此阅读全文...
发布于 2/28/2018 20:48:31 | 评论:0
categories
recent comments
archives
links
statistics
  • 网志数:1143
  • 评论数:2011