Stetho简化Android调试(二)
Stetho简化Android调试(一) 一文中讲述了如何使用Stetho
结合Chrome
远程调试Android App
。
Stetho
给我们调试带来很大的便利,效率显著提升的同时也产生一个问题:如果release版本中依然使用Stetho就会造成应用程序数据的泄露。因此我们只需在调试阶段(debug)
中使用。因此有了下面这段代码:
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
if(BuildConfig.DEBUG){
// Debug模式下才初始化
Stetho.initializeWithDefaults(this);
}
}
}
是的,这样确实可以解决release
版本中造成的应用程序数据泄露的问题。但是,对于 ‘只在调试阶段(debug)
中使用’ 这个问题,依然没有很好的解决。Stetho
相关的代码,jar
包会被打包进我们最终的apk
中,造成apk
的体积变大。而这些完全是没有必要的。
当然,也有朋友会说:我发版的时候,把相关的代码删掉就行了。这样虽然可行,但是偶尔也会忘记,并且相对麻烦。下面我就给出两种方式来解决这一问题:
方法一:
- 修改
Stetho
的依赖方式为debugCompile
dependencies {
debugCompile 'com.facebook.stetho:stetho:1.3.1'
debugCompile 'com.facebook.stetho:stetho-okhttp3:1.3.1'
}
- 写一个接口
StethoHelper
public interface StethoHelper {
void init(Context context);
OkHttpClient configureInterceptor(OkHttpClient httpClient);
}
StethoHelper
的实现类ReleaseStethoHelper
public class ReleaseStethoHelper implements StethoHelper {
@Override
public void init(Context context) {
}
@Override
public OkHttpClient configureInterceptor(OkHttpClient httpClient) {
return httpClient;
}
}
- 新建一个
debug
文件夹,如下图:



StethoHelper
的实现类DebugStethoHelper
(位于新建的debug
文件夹下)
public class DebugStethoHelper implements StethoHelper {
@Override
public void init(Context context) {
Stetho.initializeWithDefaults(context);
}
@Override
public OkHttpClient configureInterceptor(OkHttpClient httpClient) {
return httpClient.newBuilder().addNetworkInterceptor(new StethoInterceptor()).build();
}
}
- 修改
build.gradle
文件
android {
// ...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField 'com.upd.stethosample.common.stetho.StethoHelper', 'STETHO', 'new com.upd.stethosample.common.stetho.ReleaseStethoHelper()'
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField 'com.upd.stethosample.common.stetho.StethoHelper', 'STETHO', 'new com.upd.stethosample.DebugStethoHelper()'
}
}
}
- 使用姿势
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
BuildConfig.STETHO.init(this);
}
}
方法二:
- 修改
Stetho
的依赖方式为debugCompile
dependencies {
debugCompile 'com.facebook.stetho:stetho:1.3.1'
debugCompile 'com.facebook.stetho:stetho-okhttp3:1.3.1'
}
- 利用反射机制编写StethoUtils
public class StethoUtils {
public static void init(Context context) {
try {
Class<?> stethoClass = Class.forName("com.facebook.stetho.Stetho");
Method initializeWithDefaults = stethoClass.getMethod("initializeWithDefaults", Context.class);
initializeWithDefaults.invoke(null, context);
} catch (Exception e) {
e.printStackTrace();
}
}
public static OkHttpClient configureInterceptor(OkHttpClient httpClient) {
try {
Class<?> aClass = Class.forName("com.facebook.stetho.okhttp3.StethoInterceptor");
return httpClient.newBuilder().addNetworkInterceptor((Interceptor) aClass.newInstance()).build();
} catch (Exception e) {
e.printStackTrace();
}
return httpClient;
}
}
- 使用姿势
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
if(BuildConfig.DEBUG) {
StethoUtils.init(this);
}
}
}
作者:WaitingAnd
链接:https://www.jianshu.com/p/b4571fa3b001
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
Stetho简化Android调试(二)的更多相关文章
- Stetho简化Android调试(一)
在开发 Android 应用的时候,有时候我们需要查看数据库.SharePreference等.通常的做法是把相关文件pull出来,而前提必须是手机得root.如果没有root,那就只能通过打印或其它 ...
- 【转】Android LCD(二):LCD常用接口原理篇
关键词:android LCD TFT TTL(RGB) LVDS EDP MIPI TTL-LVDS TTL-EDP 平台信息:内核:linux2.6/linux3.0系统:android/ ...
- 【转】android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
关键词:android camera CMM 模组 camera参数 CAMIF平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者 ...
- Android进阶(二十)AndroidAPP开发问题汇总(四)
· Android进阶(二十)AndroidAPP开发问题汇总(四) android:layout_width和android:width的区别 基中的android:layout_width和and ...
- Android调试桥 adb安装详解
Android调试桥(adb) 一.简介 Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Uni ...
- 在 MAC OS X 安装 ADB (Android调试桥)
什么是 ADB? Android调试桥( adb )是一个开发工具,帮助安卓设备和个人计算机之间的通信. 这种通信大多是在USB电缆下进行,但是也支持Wi-Fi连接. adb 还可被用来与电脑上运行的 ...
- 2.[WP Developer体验Andriod开发]Andriod Studio结合Visual Studio Emulator for Android调试Android App
0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...
- Android 开发笔记 “android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程 ”
资源来源:http://blog.csdn.net/wangdong20/article/details/20839533 做Android调试的时候经常会遇到,程序写好了,准备接上手机调试,可不一会 ...
- [Android学习笔记]Android调试
Eclipse Debug 快捷键: [Ctrl + Shift + B]: 添加/取消断点 [F5]:进入方法中 [F6]:单步执行 [F7]:执行完毕此方法 [F8]:继续执行,直接跳到下一个断点 ...
随机推荐
- Div Height设置高度后不能自适应
解决方法$("#div1").css("height", "");
- transitionEnd不起作用解决方法
var show = function(html, className) { className = className || ""; var mask = $("< ...
- IDApython教程(五)
我们继续IDAPython让生活更美好序列,这一部分我们解决逆向工程师日常遇到的问题:提取执行的内嵌代码. 恶意软件会用各种方式存储内嵌可执行代码,有些恶意软件将内嵌代码加到文件附加段,包括PE资源区 ...
- 小程序开发 从简单的 crud 开始
关键字:“小程序 API” [WXML 完成布局] <view> == <div> {{}} == <%= %> ejs | jsp2 <block wx: ...
- hashMap源码解析(五)
---恢复内容开始--- 首先抛出一个问题: 为什么hashMap一般使用String作为key? 这是我学习前辈们的博文时看到的一个问题,觉着很有意思,所以记录下来. 原因1: 我当时的第一反应是: ...
- DWT在栅格数据嵌入不可见水印的应用
1.1.1 嵌入水印 有意义的文字->二值图像->二值序列->置乱.加密->二值水印信息. 读取栅格数据,并进行M*M的分块处理,M为偶数.设分块区域,尺寸为偶数,满足DWT的 ...
- 采用shell脚本定时清理Tomcat日志
1 Shell脚本案例 删除超过30天的日志文件 #!/bin/bash log_path=/mnt/software/apache-tomcat-.M22/logs d=`date +%Y-%m-% ...
- GitHub贡献第一的公司是谁?微软开源软件列表
参考:http://www.infoq.com/cn/news/2017/03/GitHub-first-Microsoft-open-sour 提起微软公司,不少人第一反应是老牌巨头专注于私有化软件 ...
- 电路板上的元件R,T,D,C,U
参考链接: https://zhidao.baidu.com/question/194132005.html
- sockaddr_in 与 in_addr的区别
struct sockaddr_in {short int sin_family; /* 地址族 */unsigned short int sin_port; /* 端口号 */struct in_a ...