2016年小结

16年大事记

  • 和老婆订婚并扯证了,从此加入已婚人士行列
  • 6年的爱情终于有了结晶,家里添了新成员,自己也升级做爸爸了
  • 人生中第一次跳槽,找到了一家目前而言还比较满意的公司
  • 自己家和老丈人家都盖了新房,过年无论去自己家还是老婆家都有新房住了
  • 3月份第一次参加了深圳百公里毅行,走了不到70公里
  • 开始使用随手记记账,并且接触了理财
  • 入手了一个kindle,开启阅读之旅(后面附书单)

17年展望

  • 踏实提升自己的技术实力,争取在公司能够扛起更多的责任
  • 继续坚持定期更新博客
  • 目前唯一的锻炼项目是篮球,属于激烈运动。为了增强体质,还得适当的参加些有氧运动。17年准备养成跑步的习惯,一周慢跑一到两次
  • 在长沙买一套属于自己的房子
  • 坚持看书的习惯,适当输出读书笔记
  • 毕业两年多了还没有和老婆去旅行,17年一定要带老婆去旅行一次
  • 今年的百公里争取走完全程

附:读书清单

2016年已读书单

《Android群英传》
《软技能-代码之外的生存指南》
《把时间当朋友》
《影响力》
《穷爸爸富爸爸》
《牛奶可乐经济学》
《MBA教不了你的创富课》
《寻路中国》
《看见》
《嫌疑人x的献身》
《白夜行》
《解忧杂货店》
《摆渡人》
《追风筝的人》
《偷影子的人》
《活着》
《围城》
《人生》
《孙子兵法》

2017年待读书单

《巨人的陨落》(已读55%)
《经济学原理》 (已读30%)
《经济学通识》 (已读40%)
《生活中的经济学》
《大败局1、2》
《腾讯传》
《百年孤独》
《瓦尔登湖》
《如何说孩子才会听,如何听孩子才会说》
《爱在左,管教在右》
《战争论》
《精进》
……

Jenkins+Gradle实现Android自动化构建

Jenkins简介

Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。目前大部分公司都在使用Jenkins来持续构建。

Jenkins下载与安装配置

Jenkins下载

安装Jenkins有两种方式:
第一种就是下载安装包直接安装,下载地址:http://mirrors.jenkins-ci.org
第二种就是下载war包,放到Tomcat中启动。war包下载地址:http://mirrors.jenkins-ci.org/war/,
或者http://updates.jenkins-ci.org/download/war/
这里因为我电脑上面之前装了Tomcat,所以我使用直接下载war包的方式进行安装。

Jenkins安装

将下载的jenkins.war放到Tomcat下的webapps目录下,然后启动Tomcat。在浏览器中访问”Tomcat访问地址/jenkins”即可安装,因为我的Tomcat装在本机,并且端口为8080,所以访问http://localhost:8080/jenkins/即可进行安装。

Jenkins配置

Jenkins安装之后可以进行用户的权限设置、插件的安装等配置。

阅读全文

《影响力》读书笔记(二)

《影响力》后半部分笔记整理如下:

《影响力》读书笔记(一)

这两天看了下《影响力》前两章,感觉还不错,固将其进行了整理,整理笔记如下图:

git使用小记

git在团队项目中的使用流程

1.首先从一个git远程仓库中clone项目到本地

1
git clone 仓库地址

2.创建开发分支
一般我们写代码不会在master分支上面写,而是新建一个分支

1
git checkout -b test

3.在test分支上面进行代码修改,比如完成某一项功能的开发

4.修改完之后提交代码到test分支

1
2
git add .
git commit -m "your comment"

5.review代码(非必需)
在test分支上面开发完某一个功能之后,建议自己review一下修改的代码,通过与master分支进行对比

6.切换到master分支

1
git checkout master

7.更新master分支

1
git pull (将本地master与服务器最新代码保持一致)

8.重新切换到test分支

1
git checkout test

9.将master代码更新到test分支

1
git merge master(将master分支合并到当前分支)

10.处理完冲突之后将test分支提交到服务器

1
git push origin 分支名

11.提交Merge Request
提交Merge Request之后代码审核组同事会对提交的代码进行审核,没问题则会同意合并请求,将test分支的代码合并到master分支

阅读全文

Ubuntu下adb无法识别手机设备

(1)首先使用lsusb命令,列出所有usb设备的VID、PID号。

1
2
3
4
5
6
7
8
liuling@liuling-PC:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 014: ID 2b0e:1768
Bus 001 Device 004: ID 0461:0010 Primax Electronics, Ltd HP Keyboard
Bus 001 Device 003: ID 03f0:094a Hewlett-Packard
Bus 001 Device 009: ID 046d:c053 Logitech, Inc. Laser Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
liuling@liuling-PC:~$

其中Bus 001 Device 014: ID 2b0e:1768为我插入的手机设备,可以看出VID为2b0e,PID为1768。

(2)在用户的 home 目录下,寻找 .android 目录,如果没有就创建。在 .android 目录下新建一个文件,叫adb_usb.ini, 记住,后缀是 “ini” 哦;添加前面获得的 VID 到 adb_usb.ini 中,如 0xAAAA,注意要加上0x,因为是16进制的。

(3)在 shell 中 分别输入 adb kill-server, adb start-server, adb devices;若能看到 devices 列出,那么就成功了。

JNI与C/C++数据类型的转换

字符数组与jbyteArray

jbyteArray转字符数组

1
2
3
4
int byteSize = (int) env->GetArrayLength(jbyteArrayData);  //jbyteArrayData是jbyteArray类型的数据
unsigned char* data = new unsigned char[byteSize + 1];
env->GetByteArrayRegion(jbyteArrayData, 0, byteSize, reinterpret_cast<jbyte*>(data));
data[byteSize] = '\0';

字符数组转jbyteArray

1
2
3
jbyte *jb =  (jbyte*) data;   //data是字符数组类型
jbyteArray jarray = env->NewByteArray(byteSize); //byteSize是字符数组大小
env->SetByteArrayRegion(jarray, 0, byteSize, jb);

阅读全文

JNI崩溃问题定位

一般native代码导致的崩溃问题,奔溃日志提示大概类似这样:

1
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 13261

只有这样而没有详细的调用栈信息,这样我们开发者无法定位到JNI中到底哪一行导致程序崩掉的。根本无法定位问题所在,就更不用说解决问题了。

好在NDK给开发者们提供了ndk-stack工具(在NDK根目录下),我们可以通过ndk-stack工具来查看so库中崩溃的堆栈信息。

NDK编译时已DEBUG模式编译

如果是使用命令行编译,则使用如下语句:

1
ndk-build clean all NDK_DEBUG=1

clean all 的意思是编译之前先清理全部上次编译生成的内容。NDK_DEBUG=1 意思是生成调试版本的文件。加了这个参数后 调试的时候能定位到源码行数。

阅读全文

初次尝试Kotlin

为Android Studio安装kotlin插件

在Android Studio中打开Settings->Plugins->Browse Repositories,输入kotlin搜索

阅读全文

so库中JNI方法混淆

​​默认情况下,使用JNI时与native对应的JNI函数名都是Java包名(点替换为)类名方法名,使用javah生成的头文件函数名就是这样的格式。这样的格式的so库被反汇编时很容易就找到对应的方法。

1
2
3
4
JNIEXPORT jstring JNICALL Java_com_liuling_ndkjnidemo_JniUtils_getStringFromC
(JNIEnv *env, jclass obj) {
return (jstring)(*env)-> NewStringUTF(env, "I am string from jni");
}

上面是简单的一个JNI方法,我们将生成的so库使用IDA工具进行反汇编之后就能看到如下的内容:

在左边很容易就能找到Java_com_liuling_ndkjnidemo_JniUtils_getStringFromC这个方法:

双击该方法就能看到该方法反汇编之后的内容,这里返回的字符串”I am string from jni”就暴露出来了,如果是一些敏感信息比如一些key之类的东西,这样就存在着风险。

阅读全文