整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Fiddler查看服务器响应数据有乱码,怎么办?解决

Fiddler查看服务器响应数据有乱码,怎么办?解决方案全在这里了

用Fiddler捕获数据包的同学对Fiddler中出现乱码的问题不少见,如何来解决查看服务器中响应返回数据中出现的乱码问题呢?笔者通过多次尝试总算找到了解决方案,下面笔者与大家分享下解决方案。

乱码案例分享

第1步:捕获一个带乱码文件的数据包,这一步请查看往期文章《Fiddler入门教程全家桶,建议收藏(一)》

乱码案例分享:

解决方案

(1)打开注册表,快捷键win+r,操作如下图所示:

(2) 在运行输入框中输入:regedit。

第2步:进入注册页主界面,如下图所示:

第3步:在注册表中添加字符串值,键名为:HeaderEncoding,键值为:GBK。

注意事项

第4步:修改配置文件后,需要重启Fiddler,系统才会生效。

检验结果

通过解决方案中的四个步骤操作,再次捕获数据打开网页视频(WebView功能),页面不再显示乱码啦,效果如下图所示:

总结:解决乱码的方案有三种,由于时间的关系,老师今天在这里仅跟大家分享一种效率更高的方法进行讲解,还可基于工具栏中的”Decode”设置选项来解决Fiddler出现乱码的Bug,同学们掌握好这一种方法最靠谱,更多关于测试技术的文章敬请期待。

、筛选请求

  1. 使用过滤,需勾选User Filter才会生效,运行当前的过滤规则,需点击Run Filterset now

  1. Hosts:主机过滤之局域网过滤

  • No Zone Filter:默认选项,不设置区域过滤器
  • show only Intranet Hosts:只显示内网的Hosts,即过滤掉外网的Hosts。此时,只显示URL请求目标服务器在内网的请求
  • show only internet Hosts:与上相对应,只显示外网的Hosts
  1. Hosts:主机过滤之广域网过滤

  • No Host Filter:默认选项,不设置过滤主机IP条件
  • Hide the following Hosts:隐藏输入到下面文本框中的Hosts
  • Show only the following Hosts:仅显示输入到下面文本框中的Hosts
  • Flag the following Hosts:标识下边输入的主机名的会话(加粗)
  1. Client process:客户端进程过滤

  • Show only traffic from:指定只显示哪个Windows进程中的请求,右侧会列出当前所有的 Windows 进程。
  • Show only Internet Explorer traffic:只显示IE发出的请求。
  • Hide trafficfrom service host:隐藏来自service
  1. Request header:请求头过滤

  • Show only if URL contains:仅显示URL中包含指定字符串的请求,字符串可以是URL中的一部分,多个字符串用空格分开,也可以使用EXACT:前缀来限定大小写,或者使用REGEX:前缀正则表达式或完整的URL。
  • Hide if URL contains:仅隐藏URL中包含指定字符串的请求,字符串可以是URL中的一部分,多个用空格分开,可以是正则或完整的URL。
  • Flag requests with headers:标记带有特定header的请求,如果在websession列表中存在该请求,会加粗显示。
  • Delete request headers:删除请求中指定的Header字段
  • Set request Header:在URL请求中添加头字段,与上一条对应。前面输入字段,后面输入值。
  1. Breakpionts:设置断点

  • Break request on Post:对所有Post请求设置断点
  • Break request on GET with query string:对所有带参数的 GET 请求设置断点
  • Break on XMLHttpRequest:对所有Ajax请求设置断点
  • Break response on Content-type:对响应报文中header字段中,Content-Type属性匹配成功的请求设置断点
  1. Response Status Code:响应状态码过滤

  • Hide success(2xx):隐藏响应状态码为2xx的URL请求
  • Hide non-2xx:隐藏响应状态码不是2xx的URL请求
  • Hide Authentication demands(401,407):隐藏认证(响应状态码为:401 407)的URL请求
  • Hide redirects(300,301,302,303,307):隐藏重定向(响应状态码为:300,301,302,303,07)的URL请求
  • Hide Not Modifield(304):隐藏不是缓存的状态码(304)的URL请求
  1. Response Type and Size :响应类型和报文大小过滤

  • 下拉类别选择显示类型
Show all Content-Type:显示所有类型Content-Type的请求,Content-Type即为响应结果header信息中Content-Type字段
Show only IMAGE/*:仅显示响应类型为图片的请求
Show only HTML:仅显示响应类型为HTML的请求
Show only TEXT/CSS:仅显示响应类型为text/css的请求
Show only SCRIPTS:仅显示响应类型为Scripts的请求
Show only XML:仅显示响应类型为XML的请求
Show only JSON:仅显示响应类型为Json的请求
Hide IMAGE/*:隐藏所有响应类型为图片的请求
  • Hide smaller than:隐藏小于指定大小响应结果的请求。
  • Hide larger than:隐藏大于指定大小响应结果的请求。
  • Time HeatMap:时间热图。
  • Block script files:阻止返回正常JS文件,如果响应是脚本文件,那么响应 404。
  • Block image files:阻止返回正常图片文件,如果响应是图片文件,那么响应 404。
  • Block SWF files:阻止返回正常SWF文件,如果响应是SWF 文件,那么响应 404。
  • Block CSS files:阻止返回正常CSS文件,如果响应是 CSS 文件,那么响应 404。
  1. Response Header:响应头过滤

  • Flag responses that set cookies:会话列表的响应中有cookies信息的加上标识(斜体)。
  • Flag responses with headers:会话列表里标记响应中带有特定header的请求(即加粗)。
  • Delete response headers:会话列表里删除响应信息中,有指定的Header字段的会话。
  • Set response header:在响应中添加header字段,第一个输入框是header 的key,第二个输入框是对应value

二、修改请求参数之临时修改参数

  1. 临时修改参数,可通过urlreplace SeekStr ReplaceWithStr命令,做参数替换
  2. 打开Fiddler,再打开百度,搜索csdn,在Fiddler中查看参数,wd是查询参数

  1. Fiddler命令行输入urlreplace wd=csdn wd=js回车,回到浏览器点击百度一下,会发现虽然搜索的是csdn,但是查出来的是js相关的信息,这种方法关闭Fiddler之后就会失效

三、断点修改请求参数

  1. 在请球之前拦截请求,以刚才的csdn为例

  1. 点击百度一下,会发现已经进入Fiddler断点

  1. 点击请求,点击Inspectors>WebForms,修改参数中的wd为js,点击Run to Complation,会发现虽然搜索的是csdn,但是查出来的是js相关的信息

  1. 这种方法修改参数,如果遇到请求参数中有时间戳的很容易造成请求失败,而且断点会断住所有请求,如果想断某个请求,最好还是做个请求筛选

四、通过Composer修改参数

  1. 先通过浏览器百度csdn,Fiddler中查看Inspectors>WebView会看到搜索出来的是csdn,如果是乱码点击Decode解码一下

  1. 鼠标左键把请求拖到Composer,在Url中找到wd,修改为js,点击执行,查看Inspectors>WebView会看到搜索出来的是js

  1. 这种方法修改参数,如果遇到请求参数中有时间戳的很容易造成请求失败,而且不会在浏览器上体现出来,相当于postman创建了一个请求,好处就是会有历史记录下次使用可以直接在历史记录里找

五、修改请求参数之永久修改参数,FiddlerScript修改参数

  1. 找到FiddlerScript编辑脚本,也可以在工具栏Rules > Customize Rules中修改脚本

  1. 找到static function OnBeforeRequest,添加oSession.uriContains("web=csdn")代码,点击save script保存脚本

  1. 打开浏览器搜索csdn,会发现虽然搜索的是csdn,但是查出来的是js相关的信息,这种方法关闭浏览器不会失效、也不用打断点,缺点是需要熟悉.Net,不过需要什么代码,度娘应该会给你答案

六、修改请求脚本代码

  1. 拦截post请求,并修改JSON格式参数
if (oSession.HTTPMethodIs("POST") && oSession.uriContains("example.com")) {
    // 获取请求的 Body 数据
    var requestBody=oSession.GetRequestBodyAsString();

    // 解析 JSON
    var json=Fiddler.WebFormats.JSON.JsonDecode(requestBody);


    // 修改 JSON 参数
    json.JSONObject["Body"]["kwy"]="value";
    // 删除 JSON 参数
    json.JSONObject.Remove('key');
    json.JSONObject["Body"].Remove("key");
    
    // 将修改后的 JSON 转换回字符串
    var modifiedRequestBody=Fiddler.WebFormats.JSON.JsonEncode(json.JSONObject);
    // 更新请求的 Body 数据
    oSession.utilSetRequestBody(modifiedRequestBody);
}
  1. 拦截post请求,并修改普通参数,非JSON格式
if (oSession.HTTPMethodIs("POST") && oSession.uriContains("example.com")) {
    // 获取请求的 Body 数据
    var requestBody=oSession.GetRequestBodyAsString();

    // 修改参数
    requestBody=requestBody.replace("param1=value1", "param1=newValue");

    // 更新请求的 Body 数据
    oSession.utilSetRequestBody(requestBody);
}
  1. 拦截get请求,并修改url参数,如果post请求url中带有参数,可以把GET换成POST
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
    // 获取请求的 URL
    var url=oSession.fullUrl;

    // 修改参数
    url=url.replace("param1=value1", "param1=newvalue");

    // 更新请求的 URL
    oSession.fullUrl=url;
}
  1. 拦截get请求,并删除url参数,如果post请求url中带有参数,可以把GET换成POST
import System.Web;

if (oSession.HTTPMethodIs("GET") & & oSession.uriContains("example.com")) {
    // 获取请求的 URL
    var url=oSession.fullUrl;
    
    // 解析 URL 中的参数
    var uri=new System.Uri(url);
    var queryString=System.Web.HttpUtility.ParseQueryString(uri.Query);
    
    // 删除指定的参数
    queryString.Remove("dt");
    
    // 构建新的 URL
    var newUrl=uri.GetLeftPart(System.UriPartial.Path) + "?" + queryString.ToString();
    
    // 更新请求的 URL
    oSession.fullUrl=newUrl;
}
  1. 拦截get请求,并修改请求头,如果需要修改POST请求头,可以把GET换成POST
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
    // 获取请求的头部对象
    var headers=oSession.oRequest.headers;

    // 修改头部的值
    headers["key"]="value";

    // 删除指定的头部
    headers.Remove("key");
}
  1. 拦截get请求,并修改cookie,如果需要修改POST请求cookie,可以把GET换成POST
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
    // 获取请求的 Cookie 值
    var cookieValue=oSession.oRequest["Cookie"];
    
    // 添加cookie
    cookieValue+=";key=value";
    
    // 修改cookie
    cookieValue=cookieValue.Replace("key=value", "key=newValue");
    
    // 删除cookie
    cookieValue=cookieValue.Replace("key=value", "");

    oSession.oRequest["Cookie"]=cookieValue
}
  1. 正则替换字符串,以修改cookie为例
if (oSession.HTTPMethodIs("GET") && oSession.uriContains("example.com")) {
    // 获取请求的 Cookie 值
    var cookieValue=oSession.oRequest["Cookie"];
    
    var pattern="key=([^&]*)";
    var regex=new System.Text.RegularExpressions.Regex(pattern);
    var cookieValue=regex.Replace(cookieValue, "key=newValue");

    oSession.oRequest["Cookie"]=cookieValue
}
  1. 输出cookie到控制台,可通过log查看
FiddlerApplication.Log.LogString("cookie: " + cookieValue);

,Android UI体系

1) 三层架构、MVC、MVP、MVVM

对于小项目可以按如下分法(mvp选用);对于大项目可以按模块分,然后模块内再按如下分发。

分包(按功能分):

basal:基类;

surface(fragment、activity、broadcast、listener):界面类;

adapter:适配器类;

mvp(presenter、constract、view):mvp层类;

util:通用工具类;

widget:自定义View类;

entity:实体类;

Config.class

MyApplication

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2)xml(Extensible Markup Language,可扩展标记语言)

字体一般是34px、30px、28px、26px、24px、22px

小细线1px dddddd 粗线10px f5f5f5 背景色f5f5f5、app的左右距离是20px

主题色

3)控件

①View

【Android学习】android.view.ViewStub

【android学习】EditText

【android学习】Toast(消息弹框)

【android学习】Dialog对话框

【android学习】webView(网络视图)

【Android学习】列表(ListView、RecyclerView)和adapter

【Android学习】android.view.ViewStub

【Android学习】Android常用框架

②标题栏

4)Window和WindowManager

5)图片

①Drawable

②Bitmap的加载和Cache

6)动画

7)Splash界面

①作用

展现产品的logo

初始化操作(创建数据库,读取配置文件)

连接服务器检查软件授权

连接服务器检查软件的更新

②实现

用handler延迟,在SplashActivity界面中写如下代码 ,并禁用返回键。

private final int SPLASH_DISPLAY_LENGHT=3000;

……

handler=new Handler();

// 延迟SPLASH_DISPLAY_LENGHT时间然后跳转到MainActivity

handler.postDelayed(new Runnable() {

@Override

public void run() {

Intent intent=new Intent(SplashActivity.this,

MainActivity.class);

startActivity(intent);

SplashActivity.this.finish();

}

}, SPLASH_DISPLAY_LENGHT);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2,Android基础

1)四大组件-Activity

①Fragment相关

2)四大组件-Service

3)四大组件-Content Provider

4)四大组件-BroadcastReceiver(广播接收者)

5)重要组件-intent

6)Context类和Application类

7)【Android学习】Android Studio学习

项目结构

gradle

jar和arr

8)Android系统优缺点

五大不足:

①安全与隐私

②首先开卖Android手机的不是最大运营商

③运营商仍然能影响到Android手机

④同类机型用户减少:缺少统一机型的程序

⑤过分依赖开发商缺少标准配置:开发依赖第三方,缺少产品统一性。

优点:

①市场份额大

②应用程序发展迅速

③智能厂家助力

④手机价廉但性能不低

⑤机型多,硬件配置优

⑥系统开源:利于创新,开发者多,方便开发。

9)常用Manager

3,Android底层

1)存储方式(数据持久化)

数据持久化:将内存中的数据模型转化为存储模型。、

其他存储方式:

redis:一个开源使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。

sessionStorage:生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。

file, sqlite3, Preferences, ContentResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据。

①SQLite数据库

存储结构化数据。

②File(文件存储、I/O存储)

常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

分为内部存储和外部存储(SD卡)两种存储方式。

File.mkdirs和File.mkdir的区别

File.mkdirs在多层目录底下创建文件。

File.mkdir能在二层目录只能一层创建文件,仅能在已有目录下创建. 对于路径实际不存在的,调用File.mkdirs()方法。

③SharedPreferences

本质就是一个xml文件,常用于存储较简单的参数设置。

共享参数,键值对形式存储。

④网络存储

将数据存储到服务器上。

⑤ContentProvider存储

查看四大组件-Content Provider。

ContentProvider的目的是对外暴露数据供其他程序查询。

每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。

2)【Java学习】Java内存

3)【Android学习】DVM——apk生成、安装、启动、反汇编

4)【Android学习】NDK编程——JNI(Java Native Interface,java本地接口)编程

5)【Android学习】Android安全机制

6)【Android学习】Android系统架构

4,进程和同步

1)【android 】进程、守护进程的实现及进程拉活

2)【java学习】进程、线程、程序

3)【Android学习】IPC(跨进程通信,Inter-Process Communication)

4)【Android学习】Android网络:Socket、HTTP

①socket传输中,流的关闭

②android端通过socket接收到数据产生乱码

③socket ECONNRESET 异常

④socket长连接,造成数据粘包问题

⑤【Android学习】断线重连、长连接心跳机制

5)【Android学习】序列化:Serializable和Parcelable

6)【Android学习】消息机制Handler

7)【Android学习】线程的其他方式:AsyncTask、IntentService、HandlerThread、ThreadPoolExecutor

8)【java学习】多线程并发

9)【java学习】java锁

10)资源池

Android中提供了资源池的对象有:

–Message

提供了消息池,有静态方法Obtain从消息池中取对象。

–AsynTask

AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数 * 2 + 1)个线程,超过后会丢弃其他任务。

–ThreadPool

Thread默认不提供资源池,除非使用线程池ThreadPool管理。

对于Looper,每个Looper创建时创建一个消息队列和线程对象,但不是资源池。

5,数据结构和算法

【数据结构】排序算法

【数据结构】查找

【数据结构】树

【数据结构】图

【数据结构】数组

【数据结构】队列和栈

【数据结构】线性表:顺序表、单链表

【算法】电梯调度算法/磁盘扫描算法

6,设计模式

编程素质】多线程编程之设计模式

1.复合模式:三层架构、MVC、MVP、MVVM

2.设计模式-单例模式

配置类的使用。

3.设计模式-模板方法

通过抽象类或接口提前定义要实现的方法。

4.设计模式-观察者模式

消息的通知。

5.设计模式-装饰模式:处于安全目的,保护被访问者

对一个已有的接口进行功能扩展。

如,继承父类,并增加扩展新的方法。

6.设计模式-策略模式

MVC中:

控制器是视图的策略。

视图只关心系统中可视的部分,对于任何界面行为,都委托给控制器处理。

控制器负责和模型交互来传递用户请求,对于工作是怎么完成的,视图毫不知情。

7.设计模式-工厂模式(Factory Pattern)、 控制反转(IoC)与依赖注入(DI)

简单工厂、工厂方法、抽象工厂。创建新对象。

8.设计模式-命令模式

支持撤销。

9.设计模式-适配器模式(Adapter)

adpater的使用。

10.设计模式-外观模式

如用一个spManager管理所有的sp对象获得的数据。

11.设计模式-桥接模式

将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。

举例:汽车和公路问题。

12.设计模式-代理模式(委托模式、Proxy Pattern):动态扩充对象功能

传入对象,并调用对应的方法。如接口回调。

13.迭代器模式

Iterator。

14.组合模式(合成模式)

允许将对象组合成树形结构来表现“整体/部分”层次结构。树节点可以对子节点进行增删改查等操作。

View和ViewGroup就是一种很标准的组合模式。

15.状态模式

机器取糖果,允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

16.生成器模式Builder Pattern

如AlertDialog.Builder。

17.责任链模式

经常被使用在窗口系统中,处理鼠标和键盘之类的事件。

18.蝇量模式Flyweight Pattern

19.解释器模式Interpreter Pattern

20.中介者模式Mediator Pattern

21.备忘录模式MementoPattern

当你需要让对象返回之前的状态时(例如:用户请求撤销操作),就使用备忘录模式

22.原型模式Prototype Pattern

23.访问者模式Visitor Pattern

7,网络基础、操作系统基础

【网络基础】TCP/UDP

【数据结构】位运算

【网络基础】IP计算

8,数据库

9,java基础

【java学习】java基础语法

【java学习】String字符串

【java学习】类Class

【java学习】集合框架

【java学习】JVM学习

【java学习】面向对象三大特性:封装,继承,多态

【Android学习】缓存

【java学习】修饰符

【java学习】数据类型

【java学习】装箱与拆箱、泛型

【java学习】异常

【java学习】反射机制

【java学习】java基础语法

【java学习】正则表达式(Regular Expression)

【java学习】Json框架

【Java学习】JAVA和C++区别

10,Android性能优化

1)布局优化、自定义View优化

删除布局中无用的控件和层级

有选择地使用性能较高的ViewGroup

用<include>标签、<merge>标签、ViewStub

2)activity启动优化

耗时操作优化

布局文件优化

视图加载优化。如:Fragment的懒加载,只有显示时才去加载。

3)列表优化

尽量复用convertview历史的缓存,减少创建新的view对象。

尽量的减少子孩子的id的查询次数,定义一个viewHolder。

4)内存优化

5)图片缓存

图片的三级缓存机制

11,项目管理

项目管理-Git使用

项目管理-SVN学习

12,应用

1)token登录

①定义

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

②作用

Token的目的是为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,这样增加了服务器负担。

③应用

i>用户首次登录成功之后, 服务器端就会生成一个 token 值,保存在数据库并返回给客户端.

ii>客户端拿到 token 值之后,使用sp进行保存。

iii>客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器.

iv>服务器接收到客户端的请求之后,取出token值与保存在本地(数据库)中的token值做对比

如果两个 token 值相同, 说明用户处于登录状态。

如果没有这个 token 值, 没有登录成功。

如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录。

2)登录验证

通过.requestFocus()获得焦点,提高用户体验

String Str_name=et_username.getText().toString().trim();

String Str_psw=et_password.getText().toString().trim();

if (null !=Str_name && Str_name.equals("")) {

showCustomToast("用户名不能为空");

et_username.requestFocus();

} else if (null !=Str_psw && Str_psw.equals("")) {

showCustomToast("密码不能为空");

et_password.requestFocus();

} else if (Str_psw.contains("卍")) {

showCustomToast("密码不能含有特殊字符");

et_password.requestFocus();

} else if (Str_psw.length() < 6) {

showCustomToast("密码不能少于6位");

et_password.requestFocus();

} else {

tryLogin(Str_name, Str_psw);

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3)GPS开启

检测GPS是否开启,如果没有则跳到GPS界面供用户开启。

LocationManager locationManager=(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

// 判断GPS是否正常启动

if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {

ToastUtil.showShort(context, "未开启位置服务,请开启GPS导航");

// 返回开启GPS导航设置界面

Intent intent=new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivityForResult(intent, 0);

return;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4)其他demo

android离线日志文件打印

检测android主屏,并把app从后台切换置前台

保持屏幕常亮

断线重连机制

13,问题解决

1)eclipse找不到设备,adb需要重启

写一个.bat文件,内容如下:

(注意:cd /d D:\android-sdks\platform-tools 请替换为自己的adb.exe路径)

@echo off

taskkill /F /IM adb.exe

echo Kill完成...

pause

echo 重启开始...

cd /d D:\android-sdks\platform-tools

adb devices

pause. & exit

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2)其它

①android中使用Menu时可能需要重写的方法有:onCreateOptionMenu()和onOptionItemSelected().

②eclipse编辑器乱码解决

configChanges详解-之解决问题:手机切换字体后,app异常崩溃

eclipse创建app时多出appcompat_v7

android开发误删appcompat_v7

Replace “…” with ellipsis character (…, &&;#8230;) ?

eclipse ‘Launching Hello’has encountered a problem