安卓开发各种问题汇总

概览

安卓开发各种问题汇总

破解、反编译

查看Manifest

可以使用apktool

apktool d /Users/zhangruquan/Downloads/com.sina.weibo3829.apk

查壳

查壳工具

反编译

360加固过的apk

需要一台root过的安卓机器,我手里的是小米3,直接使用开发版本系统就默认带root。

查看手机是32还是64位系统

在命令行输入 adb shell getprop ro.product.cpu.abi 命令查看当前手机的CPU是32位还是64位;输入x86表示是32位,x64则为64位

上传drizzleDumper到手机上

drizzleDumper使用adb push 命令将对应版本的破解工具上传到手机的/data/local/tmp/ 目录;

adb push drizzleDumper /data/local/tmp/
在手机端破解

进入手机端控制台

adb root  
adb shell 命令进入android手机的命令行;

cd /data/local/tmp

su

chmod 777 drizzleDumper

./drizzleDumper com.xxx 5

破解成功后执行 exit

adb pull /data/local/tmp/com.xxxx_dumped_38.dex 可将刚刚破解得到的dex文件下载到电脑上。

未加固的apk

如果apk里有多个dex则可能使用过混淆,并未加固,下载并解压dex2jar.

sh ./d2j-dex2jar.sh weibo.apk

执行完,会在dex-tools文件夹里发现com.sina.weibo3829-dex2jar.jar

查看源码

查看jar源码

使用 jd-gui

查看dex源码

使用 jadx

适配问题

全面屏的适配

从小米MIX 1发布以来,越来越多所谓“全面屏”手机发布,如三星S8,小米MIX2,VIVO X20,Google Pixel2等等,全面屏手机大致思路都是压缩额头与下巴,屏幕比例从传统的16:9变为18:9,提高屏占比以及屏幕内的虚拟导航键。如果不适配则上下会有黑边。适配的两种方法如下:

第一种方法targetSdkVersion==24(Android7.0)及以上默认支持了分屏模式,即Manifest文件中配置Activity的android:resizeableActivity默认属性为true

android:resizeableActivity="true"

采用此方法的有腾讯视频、腾讯新闻

第二种方法 在应用配置文件AndroidManifest.xml中显式声明支持的最大屏幕高宽比(maximum aspect ratio)。其中 ratio_float 为高宽比:   传统屏幕:ratio_float = 16/9 = 1.778 ;   三星S8屏幕:ratio_float = 18.5/9 = 2.056。   红米6pro屏幕:ratio_float = 19/9 = 2.111。   鉴于目前全面屏屏幕比例,将ratio_float设置为2.2即可适配一众全面屏手机。

<meta-data
            android:name="android.max_aspect"
            android:value="2.2"/>

采用此方法的有 网易新闻

<meta-data android:name="android.max_aspect" android:value="2.4"/>

叽里呱啦、新浪微博

<meta-data android:name="android.max_aspect" android:value="2.5"/>

图标兼容 Android8.0 及旧版本

drawable和mipmap的区别

drawable : 位图文件(.png、.9.png、.jpg、.gif)或编译为以下可绘制对象资源子类型的 XML 文件:

位图文件 九宫格(可调整大小的位图) 状态列表 形状 动画可绘制对象 其他可绘制对象

mipmap : 适用于不同启动器图标密度的可绘制对象文件

启动图标到底要放到哪里?

要放到哪里取决于产品经理,现在用androidstudio 创建默认放在mipmap,而且安卓8.0以后app图标的圆角还是方角可以交给系统来决定。如果你放在mipmap就要坐Android8.0的适配,把图标分为前后两个图标,后面的图标为背景图标,前面为主logo。这样在Android 8.0上如果交给系统来决定app图标,那么有可能为圆形,也有可能为圆角的正方形。

不过如果产品经理要求无论在什么版本系统上都要圆角的正方形,那么你就要舍弃 mipmap。我们来看看各个APP的实现。

新浪微博:android:icon=”@drawable/logo”

腾讯新闻:android:icon=”@mipmap/icon”

腾讯视频:android:icon=”@drawable/icon”

网易新闻:android:icon=”@drawable/icon”

叽里呱啦:android:icon=”@drawable/ic_launcher”

第三方网络库的选型

xutils  

   此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一以后这个库不维护了,或者中间某个模块出问题了,这个影响非常大,所以在项目开发时,一般会更喜欢选择专注某一领域的框架。

参考一款学英语的APP 《多纳学英语》

OkHttp

    Android 开发中是可以直接使用现成的api进行网络请求的,就是使用HttpClient、HttpUrlConnection 进行操作,目前HttpClient 已经被废弃,而 android-async-http 是基于HttpClient的,可能也是因为这个原因作者放弃维护。 而OkHttp是Square公司开源的针对Java和Android程序,封装的一个高性能http请求库,它的职责跟HttpUrlConnection 是一样的,支持 spdy、http 2.0、websocket ,支持同步、异步,而且 OkHttp 又封装了线程池,封装了数据转换,封装了参数使用、错误处理等,api使用起来更加方便。可以把它理解成是一个封装之后的类似HttpUrlConnection的东西,但是在使用的时候仍然需要自己再做一层封装,这样才能像使用一个框架一样更加顺手。

使用此库的APP超级多,举个简单的例子,《新浪微博》里面有视频部分使用的一下科技,其中集成sdk的代码部分使用了OkHttp,而其自己的核心代码还是使用的HttpURLConnection来实现。

Volley

   Volley是Google官方出的一套小而巧的异步请求库,该框架封装的扩展性很强,支持HttpClient、HttpUrlConnection, 甚至支持OkHttp,而且Volley里面也封装了ImageLoader,所以如果你愿意你甚至不需要使用图片加载框架,不过这块功能没有一些专门的图片加载框架强大,对于简单的需求可以使用,稍复杂点的需求还是需要用到专门的图片加载框架。Volley也有缺陷,比如不支持post大数据,所以不适合上传文件。不过Volley设计的初衷本身也就是为频繁的、数据量小的网络请求而生。

《腾讯视频》里面有电视相关部分,可以从下面看到用到了Volley来实现

Retrofit

   Retrofit是Square公司出品的默认基于OkHttp封装的一套RESTful网络请求框架,RESTful是目前流行的一套api设计的风格, 并不是标准。Retrofit的封装可以说是很强大,里面涉及到一堆的设计模式,可以通过注解直接配置请求,可以使用不同的http客户端,虽然默认是用http ,可以使用不同Json Converter 来序列化数据,同时提供对RxJava的支持,使用Retrofit + OkHttp + RxJava + Dagger2 可以说是目前比较潮的一套框架,但是需要有比较高的门槛。 

Volley VS OkHttp

  Volley的优势在于封装的更好,而使用OkHttp你需要有足够的能力再进行一次封装。而OkHttp的优势在于性能更高,因为 OkHttp基于NIO和Okio ,所以性能上要比 Volley更快。IO 和 NIO这两个都是Java中的概念,如果我从硬盘读取数据,第一种方式就是程序一直等,数据读完后才能继续操作这种是最简单的也叫阻塞式IO,还有一种是你读你的,程序接着往下执行,等数据处理完你再来通知我,然后再处理回调。而第二种就是 NIO 的方式,非阻塞式, 所以NIO当然要比IO的性能要好了,而 Okio是 Square 公司基于IO和NIO基础上做的一个更简单、高效处理数据流的一个库。理论上如果Volley和OkHttp对比的话,更倾向于使用 Volley,因为Volley内部同样支持使用OkHttp,这点OkHttp的性能优势就没了,  而且 Volley 本身封装的也更易用,扩展性更好些。 

OkHttp VS Retrofit

   毫无疑问,Retrofit 默认是基于 OkHttp 而做的封装,这点来说没有可比性,肯定首选 Retrofit。 

Volley VS Retrofit 

  这两个库都做了不错的封装,但Retrofit解耦的更彻底,尤其Retrofit2.0出来,Jake对之前1.0设计不合理的地方做了大量重构, 职责更细分,而且Retrofit默认使用OkHttp,性能上也要比Volley占优势,再有如果你的项目如果采用了RxJava ,那更该使用  Retrofit 。所以这两个库相比,Retrofit更有优势,在能掌握两个框架的前提下该优先使用 Retrofit。但是Retrofit门槛要比Volley稍高些, 要理解他的原理,各种用法,想彻底搞明白还是需要花些功夫的,如果你对它一知半解,那还是建议在商业项目使用Volley吧。 

总结

  综上,如果以上三种网络库你都能熟练掌握,那么优先推荐使用Retrofit,前提是最好你们的后台api也能遵循RESTful的风格, 其次如果不想使用或者没能力掌握Retrofit ,那么推荐使用Volley ,毕竟Volley不需要做过多的封装,如果需要上传大数据, 那么不建议使用 Volley,该采用 OkHttp 。

Written on February 14, 2019