StrictMode使用详解
http://hb.qq.com/a/20110914/000054.htm
http://www.android100.org/html/201204/25/1097.html
http://www.2cto.com/kf/201503/381354.html
- StrictMode使用详解
-
StrictMode
StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。除了主线程,我们还可以在Handler,AsyncTask,AsyncQueryHandler,IntentService等API中使用StrictMode。
检查策略
StrictMode的线程策略主要用于检测磁盘IO和网络访问,而虚拟机策略主要用于检测内存泄漏现象。Android已经在磁盘IO访问和网络访问的代码中已经加入了StrictMode。当监视的线程发生策略的违例时,就可以获得警告,例如写入LogCat,显示一个对话框,闪下屏幕,写入DropBox日志文件,或让应用崩溃。最通常的做法是写入LogCat或让应用崩溃。下面的代码展示了如何使用StrictMode的检查策略:
123456789101112131415161718public
void
onCreate() {
if
(DEVELOPER_MODE) {
StrictMode.setThreadPolicy(
new
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.penaltyDialog()
.detectNetwork()
// or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(
new
StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
super
.onCreate();
}
使用方法
如果不指定检测函数,也可以用detectAll()来替代。penaltyLog()表示将警告输出到LogCat,你也可以使用其他或增加新的惩罚(penalty)函数,例如使用penaltyDeath()的话,一旦StrictMode消息被写到LogCat后应用就会崩溃。
在正式版本中,我们并不希望使用StrictMode来让用户的应用因为一个警告而崩溃,所以在应用正式发布时,需要移出这些监视。你可以通过删除代码来实现,不过这里提供一个更好的方式来解决这个问题,即使用AndroidMainifest文件中的debuggable属性来实现,代码如下所示:
1android:debuggable=
true
在代码中,使用方法如下所示:
1234567891011// Return if this application is not in debug mode
ApplicationInfo appInfo = context.getApplicationInfo();
int
appFlags = appInfo.flags;
if
((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) !=
0
) {
// Do StrictMode setup here
StrictMode.setVmPolicy(
new
StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
StrictMode实例
我们在测试代码的主线程中去访问网络,这样就一定会触发StrictMode的线程监测,代码如下所示:
1234567891011121314151617181920212223242526272829303132333435363738394041public
class
MainActivity
extends
Activity {
private
HttpResponse httpResponse =
null
;
private
HttpEntity httpEntity =
null
;
private
TextView mTextView;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
StrictMode.setThreadPolicy(
new
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyDialog()
.penaltyLog()
.build());
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.text);
HttpGet httpGet =
new
HttpGet(http:
//www.baidu.com);
HttpClient httpClient =
new
DefaultHttpClient();
InputStream inputStream =
null
;
try
{
httpResponse = httpClient.execute(httpGet);
httpEntity = httpResponse.getEntity();
if
(httpResponse.getStatusLine().getStatusCode() ==
200
) {
inputStream = httpEntity.getContent();
BufferedReader reader =
new
BufferedReader(
new
InputStreamReader(inputStream));
mTextView.setText(reader.readLine());
}
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
try
{
inputStream.close();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}
}
运行代码,并将Log信息保存到本地,在Log中,我们可以搜索D/StrictMode(15454): StrictMode policy violation关键字。这里截取一段,如下所示:
12345678910111213141516171819202122232425262728293031D/StrictMode(
15454
): StrictMode policy violation; ~duration=
461
ms:
android.os.StrictMode$StrictModeNetworkViolation: policy=
55
violation=
4
D/StrictMode(
15454
): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:
1153
)
D/StrictMode(
15454
): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:
249
)
D/StrictMode(
15454
): at libcore.io.IoBridge.recvfrom(IoBridge.java:
553
)
D/StrictMode(
15454
): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:
485
)
D/StrictMode(
15454
): at java.net.PlainSocketImpl.access$
000
(PlainSocketImpl.java:
37
)
D/StrictMode(
15454
): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:
237
)
D/StrictMode(
15454
): at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:
103
)
D/StrictMode(
15454
): at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:
134
)
D/StrictMode(
15454
): at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:
161
)
D/StrictMode(
15454
): at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:
175
)
D/StrictMode(
15454
): at org.apache.http.impl.io.ChunkedInputStream.exhaustInputStream(ChunkedInputStream.java:
289
)
D/StrictMode(
15454
): at org.apache.http.impl.io.ChunkedInputStream.close(ChunkedInputStream.java:
262
)
D/StrictMode(
15454
): at org.apache.http.conn.BasicManagedEntity.streamClosed(BasicManagedEntity.java:
179
)
D/StrictMode(
15454
): at org.apache.http.conn.EofSensorInputStream.checkClose(EofSensorInputStream.java:
266
)
D/StrictMode(
15454
): at org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:
213
)
D/StrictMode(
15454
): at com.imooc.strictmodetest.MainActivity.onCreate(MainActivity.java:
53
)
D/StrictMode(
15454
): at android.app.Activity.performCreate(Activity.java:
5976
)
D/StrictMode(
15454
): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:
1105
)
D/StrictMode(
15454
): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
2262
)
D/StrictMode(
15454
): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:
2371
)
D/StrictMode(
15454
): at android.app.ActivityThread.access$
800
(ActivityThread.java:
149
)
D/StrictMode(
15454
): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:
1289
)
D/StrictMode(
15454
): at android.os.Handler.dispatchMessage(Handler.java:
102
)
D/StrictMode(
15454
): at android.os.Looper.loop(Looper.java:
135
)
D/StrictMode(
15454
): at android.app.ActivityThread.main(ActivityThread.java:
5260
)
D/StrictMode(
15454
): at java.lang.reflect.Method.invoke(Native Method)
D/StrictMode(
15454
): at java.lang.reflect.Method.invoke(Method.java:
372
)
D/StrictMode(
15454
): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:
898
)
D/StrictMode(
15454
): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:
693
)
Log中可以显示出StrictMode提示的原因,通过这里的TraceLog我们就可以来找到优化的方法。除了在Logcat中查看StrictMode的日志信息,如果你使用了penaltyDropbox()方法,那么你还可以通过如下所示的命令来调用DropBoxManager观察StrictMode日志:
1adb shell dumpsys dropbox data_app_strictmode --print
输出日志文件如下所示:
123456789101112131415161718192021222324252627282930313233343536========================================
2015
-
03
-
09
17
:
47
:
14
data_app_strictmode (text,
2177
bytes)
Process: com.imooc.strictmodetest
Flags:
0x88be46
Package: com.imooc.strictmodetest v1 (
1.0
)
Build: TCL/idol347/idol347:
5.0
.
2
/LRX22G/
1040
:userdebug/release-keys
System-App:
false
Uptime-Millis:
389545133
Loop-Violation-Number:
4
Duration-Millis:
520
android.os.StrictMode$StrictModeNetworkViolation: policy=
183
violation=
4
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:
1153
)
at java.net.InetAddress.lookupHostByName(InetAddress.java:
418
)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:
252
)
at java.net.InetAddress.getAllByName(InetAddress.java:
215
)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:
137
)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:
164
)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:
119
)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:
360
)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
555
)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
487
)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:
465
)
at com.imooc.strictmodetest.MainActivity.onCreate(MainActivity.java:
43
)
at android.app.Activity.performCreate(Activity.java:
5976
)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:
1105
)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
2262
)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:
2371
)
at android.app.ActivityThread.access$
800
(ActivityThread.java:
149
)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:
1289
)
at android.os.Handler.dispatchMessage(Handler.java:
102
)
at android.os.Looper.loop(Looper.java:
135
)
at android.app.ActivityThread.main(ActivityThread.java:
5260
)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:
372
)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:
898
)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:
693
)
同时,如果使用了penaltyDialog()方法,在应用中还会弹出 提示框:
暂停监测
如果在程序运行中无法避免的会违反StrictMode中的一些定义好的策略,而我们又希望能够暂时忽略这些策略的监视,我们可以使用permitXXXXX方法来暂停这些内容的监测,在做完需要忽略的监测之后,再起用监测,代码如下所示:
123456StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(
new
StrictMode.ThreadPolicy.Builder(old)
.permitDiskWrites()
.build());
//doSomethingWriteToDisk();
StrictMode.setThreadPolicy(old);
################################################
Android最佳实践之:StrictMode介绍
第1页:
【IT168技术
】最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode)。这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码。
StrictMode有多种不同的策略,每一种策略又有不同的规则,当开发者违背某个规则时,每个策略都有不同的方法去显示提醒用户。在本文中,将举例子说明如何使用在Android 中使用 StrictMode。
StrictMode的策略和规则
目前,有两大类的策略可供使用,一类是关于常用的监控方面的,另外一类是关于VM虚拟机等方面的策略。常用的监控方面的策略有如下这些:
Disk Reads 磁盘读
Disk Writes 磁盘写
Network access 网络访问
Custom Slow Code 自定义的运行速度慢的代码分析
前面三种的意思读者应该很清楚,就是正如它们的名字所示,分别对磁盘的读和写,网络访问进行监控。而第四种的自定义慢代码分析,是仅当访问调用类的时后才触发的,可以通过这种方法去监视运行缓慢的代码。当在主线程中调用时,这些验证规则就会起作用去检查你的代码。比如,当你的应用在下载或者解析大量的数据时,你可以触发自定义运行速度慢代码的查询分析,作用很大。StrictMode可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用,可以帮助开发者使其改进程序,使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑,避免主线程被阻塞的发生。
而VM方面的策略重点关注如下几类:
内存泄露的Activity对象
内存泄露的SQLite对象
内存泄露的释放的对象
其中,内存泄露的Activity对象和内存泄露的SQLite对象都比较好理解,而所谓对关闭对象的检查,主要是去监那些本该释放的对象,比如应该调用close()方法的对象。
当开发者违反某类规则时,每种策略都会有不同的方法令开发者知道当时的情况。相关的违反情况可以记录在LogCat中或者存储在DropBox中(android.os.DropBox)服务中。而常用监控类的策略还会在当违规情况发生时显示相关的对话框和当时的上下文环境,所有的这些都为了能让开发者尽快地了解程序的瑕疵,以提交程序的质量。下面分步讲解如何使用stritctmode。
第一步 启用strictmode
第2页:第一步 启用strictmode
为了能在应用中启用和配置StrictMode,开发者最好尽可能在应用程序的生命周期的早段使用,方法是调用StrictMode的方法setThreadPolicy。当使用常用监控类的时候,一个最好的调用时机,是在应用中入口和activities被调用前进行。比如在一个应用程序中,可以把代码放在启动Activity类的onCreate()方法中,下面是一个代码示例,启用了当前情况下的所有策略及规则,当程序中出现违背常用的规则时,将会显示相关的提示信息窗口:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDialog() ////打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
.penaltyLog()
.build());
当然,以上代码只应在未发布上线的测试版本的应用中运行以方便监视相关的运行情况,当在生产版本上时不应该启用strictmode。因此,最佳的代码实践应该为如下的样子:
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build());
super.onCreate();
第3页:第二步 运行strictmode
当应用启用了strictmode模式时,其实跟普通的应用没什么两样,在测试和运行时,跟平时运行普通应用程序一样就可以了。当启用了Strictmode模式时,会监视所有的程序运行情况,当发现出现重大问题或违背策略规则时,会提示用户。下面是当运行启用了strictmode模式的应用时,当发现违背规则时,显示给用户的信息,细心观察下跟普通的出错信息有什么不同吧。
09-04 16:15:34.592: DEBUG/StrictMode(15883): StrictMode policy violation; ~duration=319 ms: android.os.StrictMode$StrictModeDiskWriteViolation: policy=31 violation=1
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:1041)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:219)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:83)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1829)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1780)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at com.mamlambo.tutorial.tutlist.data.TutListProvider.update(TutListProvider.java:188)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.content.ContentProvider$Transport.update(ContentProvider.java:233)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.content.ContentResolver.update(ContentResolver.java:847)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at com.mamlambo.tutorial.tutlist.data.TutListProvider.markItemRead(TutListProvider.java:229)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at com.mamlambo.tutorial.tutlist.TutListFragment.onListItemClick(TutListFragment.java:99)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:53)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.widget.AdapterView.performItemClick(AdapterView.java:282)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.widget.AbsListView.performItemClick(AbsListView.java:1037)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2449)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.widget.AbsListView$1.run(AbsListView.java:3073)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.os.Handler.handleCallback(Handler.java:587)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.os.Handler.dispatchMessage(Handler.java:92)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.os.Looper.loop(Looper.java:132)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at android.app.ActivityThread.main(ActivityThread.java:4123)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at java.lang.reflect.Method.invokeNative(Native Method)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at java.lang.reflect.Method.invoke(Method.java:491)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
09-04 16:15:34.592: DEBUG/StrictMode(15883): at dalvik.system.NativeStart.main(Native Method
并且会出现如下的提示窗口,提示用户:
|
忽略某些规则
应该说大部分由StrictMode产生的规则警示都应去遵守,但有时也不是所有产生的信息都表明你的程序有错误。比如,在应用程序的主线程中去快速读写磁盘其实不会对应用的性能产生太大的影响,又或者你在调试程序阶段有一些调试的代码违反了设定的规则,这些都可以忽略掉这些规则。
忽略规则有两种方法,一种是单纯在代码中把Strictmode的代码注释掉,另外一种比较好的方法是,在需要忽略的时候和地方,增加相应的代码去让系统停止使用这些规则去检查,等开发者认为有必要检查时,再重新应用这些规则,比如:
StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)
.permitDiskWrites()
.build());
doCorrectStuffThatWritesToDisk();
StrictMode.setThreadPolicy(old);
这里首先用old来保存了当前的策略规则,然后doCorrectStuffThatWritesToDisk();
这里,执行了一些向磁盘快速读写的操作,最后又重新启用了这些规则。
小结
StrictMode是一个十分有用的类,它可以很方便地应用于检查Android应用程序的性能和存在的问题。当开启这个模式后,开发者能很好地检查应用中存在的潜在问题,更多的请参考Android文档中的相关API说明。
StrictMode使用详解的更多相关文章
- Android严苛模式StrictMode使用详解
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了 ...
- StrictMode 详解
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题.比如,如果你在UI线程中进行了网络或者磁盘操作,StrictMode就会 ...
- Android application 和 activity 标签详解
extends:http://blog.csdn.net/self_study/article/details/54020909 Application 标签 android:allowTaskRep ...
- Context知识详解
Context知识详解 建议配合context知识架构图食用. 一.什么是Context 贴一个官方解释: Interface to global information about an appli ...
- Android之Activity启动流程详解(基于api28)
前言 Activity作为Android四大组件之一,他的启动绝对没有那么简单.这里涉及到了系统服务进程,启动过程细节很多,这里我只展示主体流程.activity的启动流程随着版本的更替,代码细节一直 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
随机推荐
- Oracle技术整理(转载)
- JavaScript高级程序设计:第八章
1.window对象——BOM的核心 BOM的核心对象时window,它表示浏览器的一个实例.在浏览器中,window对象有双重角色,它既是通过javascript访问浏览器窗口的一个接口,又是ECM ...
- hdu_2141_Can you find it?(二分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2141 题意:叫你找三个数,使得这三个数的值为X,如果找得到就输出YES否则输出NO,注意两个32位数相 ...
- 网络请求 get post
1.新建一个网络请求工具类,负责整个项目中所有的Http网络请求 提示:同步请求会卡住线程,发送网络请求应该使用异步请求(这意味着类方法不能有返回值) 2.工具类的实现 YYHttpTool.h文件 ...
- ios 视频播放
#import "ViewController.h"@import MediaPlayer; @interface ViewController (){ MPMoviePla ...
- App Store 升级问题
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- Ansible3:ansible.cfg配置说明【转】
Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码.是否开启sudo认证.actio ...
- jquery datatable 参数api
jQuery 的插件 dataTables 是一个优秀的表格插件,提供了针对表格的排序.浏览器分页.服务器分页.筛选.格式化等功能.dataTables 的网站上也提供了大量的演示和详细的文档进行说明 ...
- MPEG1的码流层次与各层次的作用
1. 序列层(Sequence layer) 序列层主要用于为随机播放提供全局参数支持,这些参数包括图像宽高.像素高宽比.帧率.码率.VBV大小.帧内量化矩阵.帧间量化矩阵. 2. 图像组层(Grou ...
- libevent linux安装
wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gzwget http://downloads.sourceforge.net/le ...