初次尝试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

阅读全文

Android Studio在Gradle中配置NDK编译,覆盖默认NDK编译

默认情况下,存在src/main/jni文件夹时,gradle生成脚本会执行ndk编译生成操作,但是,编译生成方式并不是像以前那样用ndk-build去处理Android.mk Application.mk等进行c/c++代码的编译链接,而是在临时文件路径中重新生成了一份新的mk文件,并以此作为ndk编译项目。

如果我们想自己在jni目录下面建立Android.mk和Application.mk来进行编译,比如在so库中加入log打印功能,则需要在Android.mk中将log库编译到so文件,此时要怎么做呢?

首先在项目gradle文件的android{}中添加如下代码:

1
2
3
4
5
6
sourceSets {
main {
jni.srcDirs = [] //屏蔽gradle的jni生成过程
jniLibs.srcDir 'src/main/libs'
}
}

阅读全文

Android自动化反编译脚本

作为Android开发人员,在开发过程中经常会因为某个原因去反编译某个app。为了方便,这里特意整理了一个反编译的自动化脚本,只需一个命令就可以获取apk文件里面的资源文件,并使用jd-gui工具打开生成的jar文件。省去每次都要手动敲每个工具的命令,有时候忘记了某个命令还得上网搜索,很麻烦。

这里只整理了Linux和Mac两个平台的自动化脚本,Win下的百度能搜索的到。

所需要的工具

1)apktool,功能:反编译出apk所需要的资源文件和布局设置文件等,
下载地址:http://ibotpeaches.github.io/Apktool/install/

2)dex2jar,功能:反编译出jar文件,即apk的源程序文件的字节码,
下载地址:http://code.google.com/p/dex2jar/downloads/list

3)jd-gui 功能:查看反编译出来的jar文件
下载地址:http://jd.benow.ca/

这些工具我都整理好了,下面附了Linux和Mac平台的工具下载链接,并且包含了自动化脚本工具,可以直接下载使用。

阅读全文

EventBus源码解析

前面一篇文章讲解了EventBus的使用,但是作为开发人员,不能只停留在仅仅会用的层面上,我们还需要弄清楚它的内部实现原理。所以本篇博文将分析EventBus的源码,看看究竟它是如何实现“发布/订阅”功能的。

相关文章
EventBus使用详解
EventBus源码解析

事件注册

根据前一讲EventBus使用详解我们已经知道EventBus使用首先是需要注册的,注册事件的代码如下:

1
EventBus.getDefault().register(this);

阅读全文

EventBus使用详解

前言:EventBus出来已经有一段时间了,github上面也有很多开源项目中使用了EventBus。所以抽空学习顺便整理了一下。目前EventBus最新版本是3.0,所以本文是基于EventBus3.0的。

相关文章
EventBus使用详解
EventBus源码解析

概述

EventBus是针一款对Android的发布/订阅事件总线。它可以让我们很轻松的实现在Android各个组件之间传递消息,并且代码的可读性更好,耦合度更低。

阅读全文

【译文】AppBarLayout的越界滚动行为

很不幸,Youtube音乐应用在我们国家不可使用,我尝试着通过各种盗版网站来获取该应用,但我仍然无法看到在这个应用上发生了什么。感谢这位redditor,在我的请求下,他在/r/materialdesign打开了一个thread并且发表一段录制的视频,我才有机会看到这个行为。

Youtube视频app的真实截图,可能的行为

阅读全文

Say bye to my 2015

技术成长

14年毕业后开始接触Android,到目前为止从事Android开发差不多一年半的时间,15年算是自己技术成长最大的一年吧。
上半年自己大部分精力都耗在云老师项目上,自己既要开发同时兼任项目负责人(这里要感谢老大认可,愿意给新人机会)。前前后后经历了四五次迭代,最终在3个Android新人(确切来说是两个)的努力下完成并上线了。遗憾的是项目不受公司重视,并且部门领导担心影响实体产品的销售而不愿推广。最后随着部门的解散该项目也夭折了,这当时对我来说是很令人伤心的事了。虽然项目夭折了,但是自己从中收获了不少。不仅是技术水平的提升,还收获了项目管理的经验。

部门解散前,有一个多月时间是比较闲的。利用这段时间自己研究了Android Framework层的源码,搭建了自己的个人技术博客并且接触了开源社区github。贡献了图片选择库PhotoPicker
部门解散后,到新部门做cocos2dx游戏开发,学习了C++以及cocos2dx引擎。利用下班在家的时间学习了Material Design等知识,并且开发了基于Material Design和MVP模式的新闻客户端SimpleNews

阅读全文

MVP模式在Android项目中的使用

以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MVC模式,只是简单将网络请求与界面分离,然后通过Handle通知更新界面)。这种写法,在后面随着项目越来越大,Activty或者Fragment中代码也会越来越多,导致项目的维护变的越来越复杂。所以需要另外一种架构模式来解决这个问题,在网上浏览了一圈,发现适合Android开发的架构模式非MVP莫属了。

网上一搜,讲MVP模式的文章比比皆是。但是大多都是讲理论,稍微好点的会附带一个简单的登录的demo。一个简单的demo很难让初次接触MVP模式的人掌握它的使用。所以我决定写一个稍微复杂一点的新闻客户端SimpleNews(当然只是相对登录的demo)来展示MVP在具体项目中的使用。另外SimpleNews还使用了Material Design,也是学习Material Design的一个好Demo。

阅读全文