您的位置:首页 > 移动开发 > Android开发

Android技术选型或整体框架(开源库或第三方SDK)

2016-09-25 23:47 363 查看
在Android App中,哪些是我们需要的横切关注点?个人认为主要包括以下几个方面:Http, SharedPreferences, Json, Xml, File, Device, System, Log, 格式转换等。

Android App整体架构设计的思考(1,2)- http://blog.csdn.net/luyi325xyz/article/details/43085409    http://www.zhihu.com/question/27645587/answer/37579829  http://blog.csdn.net/luyi325xyz/article/details/43482123

Android工程师角度分析App使用的开源框架-2.手淘- http://yeungeek.com/2017/06/28/Android%E5%B7%A5%E7%A8%8B%E5%B8%88%E8%A7%92%E5%BA%A6%E5%88%86%E6%9E%90App%E4%BD%BF%E7%94%A8%E7%9A%84%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6-2-%E6%89%8B%E6%B7%98/  ; https://h5.m.taobao.com/other/android_legal.html
 一个Nice的Android 工具类- https://github.com/l123456789jy/Lazy
 android 工具- http://blog.csdn.net/h416756139/article/details/51489984
> Android技术选型或整体框架图:如下



> 日志打印与收集

demo地址:https://github.com/luxiaoming/TimberDemo

android Log封装库- https://github.com/orhanobut/logger :简单、漂亮、强大的Android logger,github上3000+ Star 
https://github.com/JakeWharton/timber :基于Android原生Log的logger,小巧易扩展。

 Thread.currentThread().getStackTrace()[5];为什么用5?我们可以知道0,1是vm,和thread调用的方法,从2开始才是我们调用的方法

 Thread.currentThread().getStackTrace()[5]所在的getCallerStackTraceElement方法是在logger()中调用的,而logger是在public static void d/i/e/w 中调用。

  vm->thread->getCallerStackTraceElement->logger->i/e/w/d->目标层

  0      1               2                  3        4      5

> App加固

Android常见App加固厂商脱壳方法的整理- http://blog.csdn.net/qq1084283172/article/details/53572446 http://www.zhimengzhe.com/Androidkaifa/172675.html

脱壳Android-unpacker- https://github.com/strazzere/android-unpacker
drizzleDumper https://github.com/DrizzleRisk/drizzleDumper
dumpDex https://github.com/CvvT/dumpDex
inotifywait-for-Android https://github.com/mkttanabe/inotifywait-for-Android
DumpApk https://github.com/CvvT/DumpApk http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp
修改安卓源码并刷机-针对无抽取代码- https://github.com/bunnyblue/DexExtractor
DexHunter-最强大的二代壳脱壳工具- https://github.com/zyq8709/DexHunter
自定义linker脱so壳- https://github.com/devilogic/udog
Android安全专项-AndBug动态调试工具,https://github.com/swdunlop/AndBug

Andbug 有两种启动方式,一种是以进程id方式启动,一种是以包名方式启动;

Smali汇编器,bakSmali反编器

26款优秀的Android逆向工程工具- http://www.freebuf.com/sectool/111532.html
  Obfuscator-LLVM 可以混淆C代码- https://github.com/obfuscator-llvm/obfuscator/tree/llvm-4.0
  LLVM是lowlevel virtual machine的简称,是一个编译器框架。苹果公司的Xcode 4.0之后用的都是LLVM编译器。目的是为了增加逆向工程的难度。Obfuscator-llvm最新版本集成了LLVM-3.4编译器,并且兼容LLVM支持的所有语言(C,C++, Objective-C, Ada and Fortran)和平台(x86, x86-64, PowerPC, PowerPC-64,ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430,
SystemZ,and XCore)。

使用O-LLVM和NDK对Android应用进行混淆- http://blog.csdn.net/asce1885/article/details/47175621
OLLVM(Obfuscator-LLVM)- https://github.com/Fuzion24/AndroidObfuscation-NDK 
OLLVM(Obfuscator-LLVM)- https://github.com/obfuscator-llvm/obfuscator 
Android代码混淆技术总结(一)- http://bobao.360.cn/learning/detail/3704.html
> 图片压缩处理

图片无损压缩:ImageOptim ; 图片有损压缩:TinyPNG/ImageAlpha

TinyPNG支持对 PNG/JPEG 文件做压缩处理,效果不错- https://tinypng.com/
pngquant支持 PNG 压缩,有时候 TinyPNG 处理过的图片噪点会稍多,可以考虑用 pngquant 来处理- https://pngquant.org/
ImageOptim支持压缩 PNG/JPEG/GIF,只支持 Mac- https://imageoptim.com/mac
mozjpeg:ImageOptim online用于 PNG 转 JPEG、JPEG 压缩- https://imageoptim.com/online
  facebook buck加快构建App,Buck 的侵入性太强了,微信已经切换到了Buck;buck 是Facebook推出的一款高效率的Android App/Java项目构建工具,目前仅支持 Unix/Linux 平台。因为它使用多线程编译方式,所以相对于其他的构建工具而言编译时间可以缩短50%甚至更多。

  从 Gradle 切换过去的成本挺高的,现在 Android Studio 2.0 Preview 版已经出了,支持 Instant Run Feature,Instant run,android studio 2.0 后推出的 Instant run,支持三种 swap,各有特点,但是功能最强大的 cold swap 仅仅支持 5.0以上版本;

  阿里 Freeline,目前正在用的动态编译,八月份开源的。

  watchman文件监控,用来监视文件并且记录文件的改动情况,当文件变更它可以触发一些操作,例如执行一些命令等等。

内存泄露工具LeakCanary;

  facebook stetho安卓调试工具,网络请求,sqlite,preference,一切都是可视化的操作,无须自己在去使用adb,也不需要root你的设 备。

> Android换肤技术

Android换肤技术总结- http://blog.zhaiyifan.cn/2015/09/10/Android%E6%8D%A2%E8%82%A4%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93/
Android的主题换肤-https://github.com/burgessjp/MaterialDesignDemo https://github.com/burgessjp/ThemeSkinning
Android 主题切换的一个Demo - http://download.csdn.net/download/u012814963/9493559
Android 进程保活招式大全- http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577617&idx=1&sn=623256a2ff94641036a6c9eea17baab8&scene=0#wechat_redirect
> 崩溃统计分析

Fabric 是一个先进的移动平台平台。 Crashlytics 是Fabric提供的一个崩溃统计分析平台,允许你监控你的应用的状态。

> 监控 推送 

----------------------------------

Android使用Fragment打造万能页面切换框架-http://blog.csdn.net/sbsujjbcy/article/details/47060211

  支付宝支付--App支付DEMO&SDK:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1

  友盟统计: http://dev.umeng.com/analytics/android-doc/integration
  Android集成微信支付功能-- http://www.jianshu.com/p/22659205eb8b
  单点登录的cookies Session,Token

----------------------------------

Android EventBus实战 没听过你就out了-- http://blog.csdn.net/lmj623565791/article/details/40794879
Android EventBus源码解析 带你深入理解EventBus-- http://blog.csdn.net/lmj623565791/article/details/40920453
Google相关MVP架构的工程代码:https://github.com/googlesamples/android-architecture

> ORM对象关系映射之使用GreenDAO进行CRUD操作-http://blog.csdn.net/u010687392/article/details/48444417
https://github.com/youxin11544/mvp_hybride_framwork (这是一个Android MVP模型良好的架构设计,同时也做了Android和HTML 5交互架构,用到了RxJava+Retrofit+MVP+泛型缩减mvp+模板模式+命令模式+观察者模式+管理者模式 +简单工厂模式。。

  EventBus定义:是一个发布 / 订阅的事件总线。这么说应该包含4个成分:发布者,订阅者,事件,总线。

  RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

ButterKnife+RxJava+Rxtrofit+OkHttp+Dagger2+aFinal

网络框架:okhttp、volley、android-async-http

图片框架:Picasso、Fresco、Glide、Android-Universal-Image-Loader

缓存框架:DiskLruCache、 RobospiceJson

解析:Gson、Jackson、Fastjson

事件总线:EventBus、Otto

ORM框架:GreenDAO

RxJava

 1.Observable和Subscriber可以做任何事情

Observable可以是一个数据库查询,Subscriber用来显示查询结果;Observable可以是屏幕上的点击事件,Subscriber用来响应点击事件;Observable可以是一个网络请求,Subscriber用来显示请求结果。

 2.Observable和Subscriber是独立于中间的变换过程的。

在Observable和Subscriber中间可以增减任何数量的map。整个系统是高度可组合的,操作数据是一个很简单的过程。

---------------------

EventBus的作用是发布/订阅事件总线,因为项目中用到RxJava、RxAndroid,所以完全可以使用RxJava、RxAndroid来实现EventBus。

---------------------

Rx是响应式编程的意思, 本质是观察者模式, 是以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式. 在Android编程时, 经常会使用后台线程, 那么就可以使用这种方式. 

--------------------

OKHttp兼容http与https

基于OKHttp实现对Https的支持- http://blog.csdn.net/u013347784/article/details/70168043
Okhttp对http2的支持简单分析- http://m.blog.csdn.net/chunqiuwei/article/details/76098827
Retrofit/Okhttp Https兼容到Http降级处理实践(信任所有https)- http://blog.csdn.net/sk719887916/article/details/70216791
使用okHttp支持https- http://www.jianshu.com/p/cd34b8e97e19
Android Https相关完全解析 当OkHttp遇到Https http://blog.csdn.net/lmj623565791/article/details/48129405
 使用OkHttp而不再使用HttpURLConnection或者是HttpClient,使用OkHttp之前,需要先下载OkHttp.jar包,大家可以在https://github.com/square/okhttp去下载OkHttp的最新jar包以及源码,同时因为OkHttp内部依赖okio,所以大家还要自行下载okio.jar包,下载地址在这里https://github.com/square/okio

1.一般的get同步阻塞请求和异步请求

2.一般的post同步阻塞请求和异步请求

3.实现了文件上传功能(包含文件上传进度回调显示)

4.实现了大文件下载功能,只需要指定文件下载路径即可,也包含了下载进度的回调显示

5.实现了请求结果的自动解析,用户也可以根据需求扩展自定义结果解析类

6.对所有请求都支持直接将结果解析转换为JavaBean对象或集合

7.支持对返回结果结构的自定义,例如设置返回结果结构为:{flag:1|0,error:错误信息,result:请求结果},结果解析的时候会按照此结构进行结果解析

----------------------

Retrofit

 Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton。

--------------------

bufferknife

 是注解中相对简单易懂的很不错的开源框架

-----------------

Dragger2 依赖注入框架,注解

 Dragger2解决问题的基本思想是:利用生成和写的代码混合达到看似所有的产生和提供依赖的代码都是手写的样子。

-----------------------------

Android 开源库 集锦-- http://geek.csdn.net/news/detail/113690
> 搭建App框架可引用的开源包:

http://www.techug.com/15-android-framework?ref=myread

http://www.kuqin.com/shuoit/20160509/351926.html

1. 缓存

DiskLruCache  
 Java实现基于LRU的磁盘缓存

2.图片加载

Android
Universal Image Loader  一个强大的加载,缓存,展示图片的库

Picasso 一个强大的图片下载与缓存的库

Fresco  一个用于管理图像和他们使用的内存的库

Glide  
一个图片加载和缓存的库   
imageLoader  

3. 图片处理

Picasso-transformations 一个为Picasso提供多种图片变换的库

Glide-transformations  
一个为Glide提供多种图片变换的库

Android-gpuimage  
 基于OpenGL的Android过滤器

4. 网络请求

Android
Async HTTP  Android异步HTTP库

AndroidAsync  
 异步Socket,HTTP(客户端+服务器),WebSocket,和socket.io库。基于NIO而不是线程。

OkHttp  一个Http与Http/2的客户端

Retrofit  
 类型安全的Http客户端

Volley  Google推出的Android异步网络请求框架和图片加载框架

5. 网络解析

Gson  
 一个Java序列化/反序列化库,可以将JSON和java对象互相转换

Jackson Jackson可以轻松地将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象

Fastjson  
 Java上一个快速的JSON解析器/生成器

HtmlPaser  
一种用来解析单个独立html或嵌套html的方式

Jsoup  
一个以最好的DOM,CSS和jQuery解析html的库

6. 数据库

OrmLite JDBC和Android的轻量级ORM
java包

Sugar  
用超级简单的方法处理Android数据库

GreenDAO  
 一种轻快地将对象映射到SQLite数据库的ORM解决方案

ActiveAndroid  
以活动记录方式为Android SQLite提供持久化

SQLBrite
   SQLiteOpenHelper 和ContentResolver的轻量级包装

Realm  
移动数据库:一个SQLite和ORM的替换品

7. 依赖注入

ButterKnife 将Android视图和回调方法绑定到字段和方法上

Dagger2 一个Android和java快速依赖注射器。

AndroidAnotations  
快速安卓开发。易于维护

RoboGuice  
Android平台的Google Guice

8. 图表

WilliamChart  
 创建图表的Android库

HelloCharts 兼容到API8的Android图表库

MPAndroidChart  一个强大的Android图表视图/图形库

9. 后台处理

Tape  
 一个轻快的,事务性的,基于文件的FIFO的库

Android
Priority Job Queue  一个专门为Android轻松调度任务的工作队列

10. 事件总线

EventBus  
 安卓优化的事件总线,简化了活动、片段、线程、服务等的通信

Otto  
 一个基于Guava的增强的事件总线

11. 响应式编程

RxJava  JVM上的响应式扩展

RxJavaJoins 为RxJava提供Joins操作

RxAndroid  
Android上的响应式扩展,在RxJava基础上添加了Android线程调度

RxBinding  
提供用RxJava绑定Android UI的API

Agera  
Android上的响应式编程

12. Log框架

Logger  简单,漂亮,强大的Android日志工具

Hugo  
 在调试版本上注解的触发方法进行日志记录

Timber  一个小的,可扩展的日志工具

13. 测试框架

Mockito Java编写的Mocking单元测试框架

Robotium  
 Android UI 测试

Robolectric Android单元测试框架

Android自带很多测试工具:JUnit,Monkeyrunner,UiAutomator,Espresso等

14. 调试框架

Stetho  调试Android应用的桥梁,使得可以利用Chrome开发者工具进行调试

15. 性能优化

LeakCanary  内存泄漏检测工具

ACRA 
Android应用程序崩溃报告
-------------------
  构建 Android 应用程序一定要绕过的 30 个坑-https://github.com/xitu/gold-miner/blob/master/TODO/building-android-apps-30-things-that-experience-made-me-learn-the-hard-way.md

  android经常用的orm框架主要有greenDAO、OrmLite、AndrORM。 综合了网上的各种评价,greenDAO的运行效率最高,内存消耗最少,性能最佳。因此决定采用greenDAO框架,对项目的orm框架进行改进。

Picasso框架:获取并显示远程图片,强大的图片下载和缓存的第三方库。

Picasso的基本用法:Picasso.with(context).load(imageUrl).into(imageView);

剪裁大小:Picasso.with(context).load(imageUrl).resize(50,50).centerCrop().into(imageView);

占位符图片:

Picasso.with(context).load(imageUrl).placeholder(R.drawable.image_placeholder).error(R.drawable.image_error_placeholder);

载入本地资源:Picasso.with(context).load(R.drawable.icon).into(imageView);

                     Picasso.with(context).load("file:///android_asset/Adnroid.png").into(imageView);

                     Picasso.wiht(context).load(new File(...)).into(imageView);

 调试:为了方便调试,可以通过调用Picasso的setIndicatiorEnabled(true);可以让不同来源的图片显示一个不同的色彩标记.

解决问题:

            自动将图像缓存在本地。

            通过图片压缩转换以减少内存消耗。

            自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载。

            在适配器中自动发现和重用以前取消的下载。

            图像格式转换:很多时候需要将图片进行格式转换或者剪裁以节省内存或者达到我们的布局效果。

            占位符图片:当图片未正常显示时默认的图片,通过placeholder()设置,Picasso也支持设置图片显示错误时显示的默认图片,通过error()设置。

设置图片圆角:

步骤1:

public class CircleTransform implements Transformation {

        @Override

        public Bitmap transform(Bitmap source) {

            int size = Math.min(source.getWidth(), source.getHeight());

            int x = (source.getWidth() - size) / 2;

            int y = (source.getHeight() - size) / 2;

            Bitmap squaredBitmap = Bitmap

                    .createBitmap(source, x, y, size, size);

            if (squaredBitmap != source) {

                source.recycle();

            }

            Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());

            Canvas canvas = new Canvas(bitmap);

            Paint paint = new Paint();

            BitmapShader shader = new BitmapShader(squaredBitmap,

                    BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);

            paint.setShader(shader);

            paint.setAntiAlias(true);

            float r = size / 2f;

            canvas.drawCircle(r, r, r, paint);

            squaredBitmap.recycle();

            return bitmap;

        }

        @Override

        public String key() {

            return "circle";

        }

    }

步骤2:

Picasso.with(this).load(R.drawable.meinv2).transform(new CircleTransform()).into(img);

--------------
> Gson解析问题:
Gson解析null替换为空字符串- http://blog.csdn.net/tmacsky/article/details/50497521
                                                       http://stackoverflow.com/questions/9483348/gson-treat-null-as-empty-string/24252578#24252578

android代码混淆之Gson解析为null- http://blog.csdn.net/u011275767/article/details/46501037
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐