PROCEDURE-201701

来源:互联网 发布:上海惠灵顿学校知乎 编辑:程序博客网 时间:2024/06/07 00:39
  • 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过程
Created with Raphaël 2.1.0startparent传递给子view自己的measuredSpec(包含specMode和specSize的)子view根据parent的:返回有三种:EXACTLY+SIZE(子view是指定大小);AT_MOST+SIZE(子view是wrap_content,表示最大用这么多,如果parent的不够了,就分配少点);AT_MOST+SIZE(前两种是子view的size,这个是parent传进来的size,表示parent多大我就要多大)parent根据子view的返回进行布局。end
  • 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


0 0