Android
- Android
- Categories
-
Jan 6, 2016
Android Studio Version Management
Android Studio 版本自动更新 在开发Android项目的过程中,一些发布频率很高的应用,每次手动更改不是很方便,在一翻查找后,参考了这位同学的博文,感谢这位同学的无私奉献,我个人比较懒,为了考虑以后项目用的着,于是有些这篇文章。 思路: 先加载项目的gradle.properties文件,一般生成项目这个文件都会存在 判断项目是否存在VERSION_CODE,到这里就清晰了,没有就生成一个 获取当前task的名称,仅当task包含:app:assembleRelease或:app:generateReleaseSources时,则判定为正式环境,更新versionCode 然后返回versionCode 使用方法 在defaultConfig中填写方法名 defaultConfig { applicationId "com.application" minSdkVersion 14 targetSdkVersion 23 versionCode updateVersion() versionName "1.0" multiDexEnabled true } 更新versionCode方法,放在:app的gradle文里面就行 def updateVersion() {...
Read More -
May 20, 2015
Handler 和 Looper 原理分析
前言 就应用程序而言,Android系统中的Java应用程序和系统程序相同,都是以消息驱动来工作的,大致原理如下: 有一个消息队列,可以在消息队列中投递消息。 有一个消息循环,可以不断从消息队列中取出消息,并做处理。 把待处理的消息加处消息队列中,一直加到队列尾,一些优先级高的也可以加到队列头,提交的消息可以是按键,触屏等物理产生的消息,也可以是系统或者是应用本身发出的请求消息。 处理线程不断的从消息队列中取出消息并处理。请求消息可以把优先级高的放到队列头,这样就可以优先处理。 Looper类用于封装消息循环,有一个消息队列。 Handler类封闭的消息投递,消息处理等接口。 Looper 分析 //定义一个LooperThread class LooperThread extends Thread{ public Handler mHandler; public void run(){ //调用prepare Looper.prepare(); ... //进入消息循环 Looper.loop(); } } //应用程序使用LooperThread {...
Read More -
May 14, 2015
Android Proguard
语法 -include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_path} 指定要处理的应用程序jar,war,ear和目录 -outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称 -libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 -dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。 -dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。 保留选项 -keep {Modifier} {class_specification} 保护指定的类文件和类的成员 -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好 -keepclasseswithmembers...
Read More -
Jan 23, 2015
AsyncTask
异步任务类 前段时间,用到AsyncTask, 发现自己有些忘了,温习了一下,顺便做个笔记。 实际业务中,如果访问网络需求多,频繁开启线程比较耗费资源,因此,我们需要使用一些线程池。 Google已经很好的封装好了一个异步任务类,AsyncTask。 AsyncTask 一般用于做一些耗时的操作,其中内部封装了子线程,帮我们开启子线程,帮我们去做一些事情. 打开AsyncTask源文件,首先看到的,它是一个抽象类,我们要使用它,要么写一个内部类,要么写个类继承它。 先简单的创建一个对象出来看一下主要的三个方法: new AsyncTask<Void, Void, Void>() { /** * 执行之前调用, 执行在主线程中. */ @Override protected void onPreExecute() { System.out.println("onPreExecute: " + Thread.currentThread().getName()); } /**...
Read More -
Jan 9, 2015
AES加密
AES加密 首先得说的是让我困扰的参数问题,只有这个问题搞明白了才能有然后. 示例 Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); 首先应该明白AES是基于数据块的加密方式,也就是说,每次处理的数据是一块(16字节), 当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度。 ECB和CBC的加密结果是不一样的,两者的模式不同,而且CBC会在第一个密码块运算时加入一个初始化偏移量 分组加密的几种方式 ECB(Electronic Code Book,电子密码本):是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。 CBC(Cipher Block Chaining,加密块链):是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解难度。 CFB(Cipher FeedBack Mode,加密反馈)/OFB(Output FeedBack,输出反馈)实际上是一种反馈模式,目的也是增强破解的难度。 如果不指定算法模式,会默认使用ECB算法,而且完全忽略IV(偏移值/向量)参数, 如果忽略padding(补码/填充)方式,程序默认为PKCS5Padding; Cipher c = Cipher.getInstance("AES"); SecretKeySpec keySpec =...
Read More