- Drawable可以通过Drawable.createFrom从文件里面生成一个Drawable对象(不过应该没有进行图片处理,缩放等)
- StateListDrawable可以用来作为Drawable,不过是一个可以根据state变的,就相当于xml里面的drawable selector。
- ColorStateColorList是一个color的selector
2017年01月04日23:23:48 2
- 安卓里面Drawable.createFrom直接从文件中获取然后setImageDrawable显示的大小通常相对于在xml里面引用的小很多,如果用BitmapDrawable(getResources,Drawable.createFromXX)这个来进行setImageDrawable就可以了。因为Drawable.createFrom没有根据安卓设备进行处理。
- Android里面EventBus在context间传递消息很有用,可以省去保存context对象的麻烦。
- color是十六进制,要想通过string保存可以Integer.toHexString(从xml里面获取的color).
2017年01月05日18:08:39 3
- java ZipFile解压zip文件,用到的zipEntry中的Enumeable.getNext那个方法依次返回的是zip文件里面的压缩file(directory或者file),例如/asd/asd2/asd.json,通过getNext获得的第一个是/asd目录,第二个是/asd/asd2目录,第三个才是/asd/asd2/asd.json文件。所以可以挨个解压文件不用考虑递归。
2017年01月06日23:34:21 1
- jvm的类加载(class loading)
- load。把.class文件格式的东西读取(可以通过网络等方式,不局限于.class文件)
- verify。校验文件输入流格式/字节码正确性/符号引用正确等。
- resolve。将符号引用转化成实际的JVM中的内存的直接饮用。例如类/接口方法,属性,常量等,进行内存空间的分配。
- 上面三个是<连接link>过程
- initialize。完成<clinit>(),即class里面的static语句以及类变量的初始赋值。initialize在第一次new/使用到类的static变量/使用类的static方法时候必须进行。
- 类加载器。不同的类加载器加载同一个类得到两个名字一样的class,两个class调用==也是不一样的,包括instanceOf/equals等判断。因为两个类相同的前提就是同一个类加载器加载的
- 类加载器有一个“双亲委托方式Parents Delegation Method”,主要就是sub类加载器加载的时候先调用parent 类加载器进行加载,失败了再自己加载,这样做可以保证一些类不会重复加载(类加载器最底层(父子关系最爷爷辈的)加载器加载java基础包中的类,然后次一级的加载classPath的,再次一级加载自己指定的类……,大概意思如此,不一定准确)。
- 获取一个网站的时间,可以用URL连接那个网站,然后获取返回的头部的date信息。
- popUpWindow可以用来做蒙版。popUpWindow设置contentView,然后制定显示在屏幕的什么坐标。
- living is good
2017年01月09日21:52:50 6
- JVM的栈帧-stack frame
- 每个stack frame 对应一个方法,主要包含方法的本地变量表/动态链接/返回地址
- local variable table 包含了栈帧用到的本地变量的空间。方法里面变量空间可以根据变量的生存域进行复用(这里会对gc有一定的影响,不过通常jit会优化这部分代码取消这种影响)
- v.requestlayout可以用v.forcelayout;v1.requestlayout来实现。区别是后者只会有一次重新对view树的layout,但是可以把执行了forcelayout的所有view都做layout(forcelayout是一个标记函数,在下一次layout bypass(类似于全局更新信号)的时候对该view重新layout。)
2017年01月10日20:52:21 3
- JVMstack frame
- 操作数栈,JVM通过栈来进行数据运算
- JVM运行代码的时候方法的解析(method resolution)有静态(通过参数类型确定重载overload方法,同一类内的不同方法)和动态(通过方法的调用者确定override方法,父类子类的同一方法)之分。
- viewGroup的clipChildren属性可以用来使子view超出父view控件
2017年01月11日21:13:30 2
- JVM里面代码执行有解释/编译两种类型(编译指的是字节码编译成机器码)
- android view 的measure过程
- RelativeLayout即使clipChildren=false,如果children measure的时候是wrap_content,那么就会把children压缩到剩余空间那么大,并不会直接让view超出relativelayout,但是如果是指定大小的,Relativelayout就不会压缩view了,所以弄一个指定大小的LinearLayouy里面放view,就可以实现RelativeLayout里面的view clipChildren了。
2017年01月12日21:04:40 5
- jvm的类加载还挺复杂tomcat/OSGi什么的,不懂
- android动态加载类不能用classLoader,要用dexClassLoader/pathClassLoader,因为ClassLoader在android里面是阉割版的,没有实现。
- android app的“皮肤”功能可以通过下载apk包动态加载apk资源来实现,当然也可以下载文件然后通过文件流读取,不过似乎性能不够好。
- android的”加固”
- 需要源apk(实际产品apk)/壳apk(用来解开源apk的)/加壳程序。
- 加壳程序可以用java写,也可以用别的语言python什么的。主要是通过源dex和壳dex构建一个新的dex,并且规范其格式符合dex文件格式。
- 加壳程序构建新的dex的时候,会把源dex的byte流加密,这样就可以防止反编译直接获得源dex了。因为没有解密程序是没办法解密的。而解密程序是在壳dex里面的,所以如果源码阅读能力够强,还是能解密的,不过没那么直接了,一个命令就得到dex。
- 打开加壳后的apk时,壳dex会解密并动态加载源dex,然后看起来好像正常启动一样。具体的动态加载过程之后在了解并实践。
2017年01月13日18:24:21 5
- javascript date
- new Date().valueOf()获取number时间戳
- new Date(yyyy,mm,dd,HH,MM,SS),参数为number,月0-11,日1-31。
- js里正则表达式获取匹配结果以及匹配到的内容的方式
var str="";
var reg=/regex/g;
var matched = false;
str.replace(reg,function(){
matched = true;//matched callback here,arguments[1-...]is the content captured
}
//following code
- android 的clipChildren属性在android4.1.1上面会有问题,因为在view发生改变(例如滚动)的时候,超出父控件的view还是会被clip。
- android获取系统版本进行判断
String s = android.os.Build.SDK;
int s = android.os.Build.SDK_INT;
int jelly_bean = android.os.Build.JELLY_BEAN;
2017年01月16日18:20:33 2
null
2017年01月17日22:12:09 0
- jvm解语法糖
- 自动装箱/拆箱。
- 整数的cache,Integer的-128~127是缓存的。整数的比较,整数的equals与整数的==在类型相同(都是Integer)的时候是等价的。
- 泛型。编译后直接为泛型类型然后通过object强制转换为指定类型,而不是具体的泛型类型。所以下面的代码不能通过编译,因为在编译器看来,两个函数完全一样了,参数都是List<>。
private void f1(List<String> arg){}
private void f2(List<Integer> arg){}
- android的apk签名,使用jarsigner(需要keystore)/signapk(需要x509/p什么)进行签名。keystore和x509/p什么 可以相互转化。
- 签名了以后,apk里面有一个文件manifest.mf保存了apk所有文件的校验值,cert.sf保存了manifest的校验值,cert.rsa保存了私钥进行的cert.sf的数字签名和公钥信息用来进行校验,公钥私钥来自于keystore。那么问题来了,为什么不直接manifest.rsa呢?为什么多了一步cert.sf呢?文件大小的原因吗?
2017年01月21日23:02:20(for 1.20) 4