做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录。
查看SQLite日志
1 2 |
adb shell setprop log.tag.SQLiteLog V adb shell setprop log.tag.SQLiteStatements V |
因为实现里用了Log.isLoggable(TAG, Log.VERBOSE)做了判断,LessCode的LogLess中也参考了这种机制:LogLess。
使用这种方法就可以在Release版本也能做到查看应用的打印日志了。
PNG优化
APK打包会自动对PNG进行无损压缩,如果自行无损压缩是无效的。
当然进行有损压缩是可以的:https://tinypng.com/
Tcpdump抓包
有些模拟器比如genymotion自带了tcpdump,如果没有的话,需要下载tcpdump:
http://www.strazzere.com/android/tcpdump
把tcpdump push到/data/local下,抓包命令:
1 |
adb shell /data/local/tcpdump -i any -p -s 0 -w /sdcard/capture.pcap |
查看签名
很多开发者服务都需要绑定签名信息,用下面的命令可以查看签名:
1 |
keytool -list -v -keystore release.jks |
注意,这个是需要密码的,可以查看MD5, SHA1,SHA256等等。
单例模式(懒汉式)的更好的写法
特别说到这个问题,是因为网上很多这样的代码:
1 2 3 4 5 6 7 8 9 10 11 |
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } |
这种写法线程不安全,改进一下,加一个同步锁:
1 2 3 4 5 6 7 8 9 10 |
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } |
网上这样的代码更多,可以很好的工作,但是缺点是效率低。
实际上,早在JDK1.5就引入volatile关键字,所以又有了一种更好的双重校验锁写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } |
注意,别忘记volatile关键字哦,否则就是10重,100重也可能还是会出问题。
上面是用的最多的,还有一种静态内部类写法更推荐:
注意,别忘记volatile关键字哦,否则就是10重,100重也可能还是会出问题。
上面是用的最多的,还有一种静态内部类写法更推荐:
1 2 |
adb shell setprop log.tag.SQLiteLog V adb shell setprop log.tag.SQLiteStatements V |
因为实现里用了Log.isLoggable(TAG, Log.VERBOSE)做了判断,LessCode的LogLess中也参考了这种机制:LogLess。
使用这种方法就可以在Release版本也能做到查看应用的打印日志了。
PNG优化
APK打包会自动对PNG进行无损压缩,如果自行无损压缩是无效的。
当然进行有损压缩是可以的:https://tinypng.com/
Tcpdump抓包
有些模拟器比如genymotion自带了tcpdump,如果没有的话,需要下载tcpdump:
http://www.strazzere.com/android/tcpdump
把tcpdump push到/data/local下,抓包命令:
1 |
adb shell /data/local/tcpdump -i any -p -s 0 -w /sdcard/capture.pcap |
查看签名
很多开发者服务都需要绑定签名信息,用下面的命令可以查看签名:
1 |
keytool -list -v -keystore release.jks |
注意,这个是需要密码的,可以查看MD5, SHA1,SHA256等等。
单例模式(懒汉式)的更好的写法
特别说到这个问题,是因为网上很多这样的代码:
1 2 3 4 5 6 7 8 9 10 11 |
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } |
这种写法线程不安全,改进一下,加一个同步锁:
1 2 3 4 5 6 7 8 9 10 |
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } |
网上这样的代码更多,可以很好的工作,但是缺点是效率低。
实际上,早在JDK1.5就引入volatile关键字,所以又有了一种更好的双重校验锁写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } } |
注意,别忘记volatile关键字哦,否则就是10重,100重也可能还是会出问题。
上面是用的最多的,还有一种静态内部类写法更推荐: