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之类的东西,这样就存在着风险。

阅读全文

Ubuntu下NDK编译环境搭建及在Android Studio中集成NDK

Ubuntu下NDK环境的搭建

NDK下载

首先需要下载NDK编译工具,目前官方最新的NDK版本是r11c,为了保证稳定性,我下的是r11b。

能翻墙的可以从谷歌官网下载,地址为:https://developer.android.com/ndk/downloads/index.html

不能翻墙的也可以从下面网站下载,该网站提供了Android开发各种工具的下载:http://www.androiddevtools.cn/index.html

阅读全文