-
iz3d 3D立体游戏的软件
2010-07-14 17:25:42举个简单的例子,游戏角色往更远的地方跑时你甚至会不由得伸长脖子,生怕走远了会找不到人来,这在现实生活中是很平常的一个动作,但这个动作在以往游戏中是无论如何都不会做出来的! 另外不得不说的是,打开3D模式... -
要说修复哪家强,山东技术带你找蓝翔
2020-01-03 08:44:55图一为我们手机上安装的软件,假设是你第一次打开的情况,那么在这个过程中我完全可以偷偷下载一个patch.dex的dex包放到固定的一个目录下,图三是放在/sdcard/patch.dex这个路径中,那么当你第二个打开应用的时候就...你知道你安装的APP在你不知情的情况下偷偷更新吗,下面带大家看下案例
图一为我们手机上安装的软件,假设是你第一次打开的情况,那么在这个过程中我完全可以偷偷下载一个patch.dex的dex包放到固定的一个目录下,图三是放在/sdcard/patch.dex这个路径中,那么当你第二个打开应用的时候就会发现,你的应用页面变成图二所示的页面,这是什么原理呢,下面我们在分析下。
先看下MyApplication代码,自己创建一个MyApplication继承Application,然后初始化,别忘了在AndroidManifest.xml中添加name属性
public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); EnjoyFix.installPatch(this, new File("/sdcard/patch.dex")); } }
attachBaseContext方法中就做了一个操作,加载sdcard目录下的patch.dex,至于这个patch.dex包是如何生成的,我们后面会说到,在看下主界面代码:
public class MainActivity extends AppCompatActivity { TextView tv1; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv1 = (TextView)findViewById(R.id.tv1); havaBug(); // repairBug(); } private void havaBug(){ tv1.setText("Bug Bub Bug"); Toast.makeText(this,"Bug Bub Bug",Toast.LENGTH_LONG).show(); } private void repairBug(){ tv1.setText("修复修复"); Toast.makeText(this,"修复修复",Toast.LENGTH_LONG).show(); } }
页面创建时调用了havaBug()方法,将页面文字设置为了Bug Bug Bug,然后我们将havaBug()方法注释,将repairBug()方法放开,这个方法将页面提示改为 修复修复,然后将修改后的类打成一个patch.dex的dex包,那么在应用启动的时候就会加载这个dex包,你的应用就偷偷完成更新功能了。
patch.dex这个dex包是如何产生的呢,我们知道写的原生的代码是.java的形式,我们在编译的过程会将.java文件编译成.class文件,android把所有.class文件合并优化,然后生成一个classes.dex,classes.dex可以直接在 android 运行环境执行,一般可以通过 PathClassLoader 去加载 dex 文件,具体如何加载后面会介绍到,我们的patch.dex文件的生成可以借助sdk目录中的dx.bat来生成,修改代码编译后我已经拿到了MainActivity.class,借助dx.bat将其转为patch.dex,具体使用方法如下图:
进入到build-tools目录下,选择任意一个版本即可,里面均有dx.bat,我jdk使用的1.8版本的,所以在将class转成dex中加了参数
--no-strict,得到dex文件后放到我们初始化时要加载的dex文件路径即可。
我们可以对生成的dex文件反编译一下,看看里面是不是修复后的代码,反编译后代码如下:
毫无疑问,onCreate中执行了repairBug()方法。
看到这相信有个疑问一直在大家心中,installPatch(this, new File("/sdcard/patch.dex"))方法里面做了什么操作就能自动加载dex文件,更新项目呢,下面我们具体看一看:
public static void installPatch(Application application, File patch) { File hackFile = initHack(application); ClassLoader classLoader = application.getClassLoader(); List<File> files = new ArrayList<>(); if (patch.exists()) { files.add(patch); } files.add(hackFile); File dexOptDir = application.getCacheDir(); try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { V23.install(classLoader, files, dexOptDir);//23+ 6.0及以上 } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { ... //19+ 4.4以上 } else { // 18- 4.3以下 ... } } catch (Exception e) { e.printStackTrace(); } }
首先初始化原本的文件,判断patch.dex是否存在,若存在就加载到数组最前面,然后在加载原本存在的其他dex文件,后面根据api版本不同执行不同方法,例如在api23+版本中执行install方法,并传递了三个参数,这里注意这三个参数的区别,实际上不同版本主要就是这里的传参不同,后面会具体介绍,先看api23+版本的方法:
private static final class V23 { private static void install(ClassLoader loader, List<File> additionalClassPathEntries, File optimizedDirectory) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IOException { Field pathListField = ShareReflectUtil.findField(loader, "pathList"); Object dexPathList = pathListField.get(loader); ArrayList<IOException> suppressedExceptions = new ArrayList<>(); Object[] objects = makePathElements(dexPathList, new ArrayList<>(additionalClassPathEntries), optimizedDirectory, suppressedExceptions); ShareReflectUtil.expandFieldArray(dexPathList, "dexElements", objects); if (suppressedExceptions.size() > 0) { for (IOException e : suppressedExceptions) { Log.w(TAG, "Exception in makePathElement", e); throw e; } } } /** * 把dex转化为Element数组 */ private static Object[] makePathElements( Object dexPathList, ArrayList<File> files, File optimizedDirectory, ArrayList<IOException> suppressedExceptions) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { //通过阅读android6、7、8、9源码,都存在makePathElements方法 Method makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements", List.class, File.class, List.class); return (Object[]) makePathElements.invoke(dexPathList, files, optimizedDirectory, suppressedExceptions); } }
看到这段代码是不是一头晕,哈哈,我们一点一点来分析下,介绍到这里了就不得不说我们本篇的重点之一:android类加载,先上一张图:
PathClassLoader.java代码如下:
public class PathClassLoader extends BaseDexClassLoader {
public PathClassLoader(String dexPath, ClassLoader parent) {
super(dexPath, null, null, parent);
}public PathClassLoader(String dexPath, String libraryPath,
ClassLoader parent) {
super(dexPath, null, libraryPath, parent);
}
}DexClassLoader.java代码如下:
public class DexClassLoader extends BaseDexClassLoader {
public DexClassLoader(String dexPath, String optimizedDirectory,
String libraryPath, ClassLoader parent) {
super(dexPath, new File(optimizedDirectory), libraryPath, parent);
}
}BaseDexClassLoader.java代码如下:
public class BaseDexClassLoader extends ClassLoader {
private final DexPathList pathList;public BaseDexClassLoader(String dexPath, File optimizedDirectory,
String libraryPath, ClassLoader parent) {
super(parent);
this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
}......
}DexPathList.java(api23)代码如下:
final class DexPathList { /** * List of dex/resource (class path) elements. * Should be called pathElements, but the Facebook app uses reflection * to modify 'dexElements' (http://b/7726934). */ private final Element[] dexElements; ...... public DexPathList(ClassLoader definingContext, String dexPath, String libraryPath, File optimizedDirectory) { ...... ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>(); // save dexPath for BaseDexClassLoader //不同api版本中方法名及参数是不同的,前文中的installPatch方法中根据这里做适配,后面会出一个各个api版本中差别介绍 this.dexElements = makePathElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions); ...... } /** * Makes an array of dex/resource path elements, one per element of * the given array. */ private static Element[] makePathElements(List<File> files, File optimizedDirectory, List<IOException> suppressedExceptions) { List<Element> elements = new ArrayList<>(); /* * Open all files and load the (direct or contained) dex files * up front. */ for (File file : files) { File zip = null; File dir = new File(""); DexFile dex = null; String path = file.getPath(); String name = file.getName(); if (path.contains(zipSeparator)) { String split[] = path.split(zipSeparator, 2); zip = new File(split[0]); dir = new File(split[1]); } else if (file.isDirectory()) { elements.add(new Element(file, true, null, null)); } else if (file.isFile()) { if (name.endsWith(DEX_SUFFIX)) { // Raw dex file (not inside a zip/jar). try { dex = loadDexFile(file, optimizedDirectory); } catch (IOException ex) { System.logE("Unable to load dex file: " + file, ex); } } else { zip = file; try { dex = loadDexFile(file, optimizedDirectory); } catch (IOException suppressed) { suppressedExceptions.add(suppressed); } } } else { System.logW("ClassLoader referenced unknown path: " + file); } if ((zip != null) || (dex != null)) { elements.add(new Element(dir, false, zip, dex)); } } return elements.toArray(new Element[elements.size()]); } /** * Constructs a {@code DexFile} instance, as appropriate depending * on whether {@code optimizedDirectory} is {@code null}. */ private static DexFile loadDexFile(File file, File optimizedDirectory) throws IOException { if (optimizedDirectory == null) { return new DexFile(file); } else { String optimizedPath = optimizedPathFor(file, optimizedDirectory); return DexFile.loadDex(file.getPath(), optimizedPath, 0); } } ...... }
android内部使用的是BaseDexClassLoader、PathClassLoader、DexClassLoader三个类加载器实现从dex文件中读取类数据,其中PathClassLoader和DexClassLoader都是继承自BaseDexClassLoader,PathClassLoader只能加载已经安装到Android系统中的apk文件(/data/app),DexClassLoader可以加载任意目录下的dex/jar/apk/zip文件。在BaseDexClassLoader中new了一个DexPathList,DexPathList中将dex文件转换成dexFile对象,存入Element[]数组,findclass顺序遍历Element数组获取DexFile,然后执行DexFile的findclass。ClassLoader的findClass是通过遍历dexElements[]中的dex来寻找类的,越靠前的Dex优先被系统使用。我们最初开始是怎么做的呢,先生成一个.dex文件,在installPatch方法中将这个dex文件添加数组中,然后在将其他的dex文件添加,就是为了让系统首先加载我们修复后的dex文件。
上面说到,在不同的api中,makePathElements这个方法方法名及参数是不同的,查阅了多个api版本后整理了下面一份表格:
看到这个表我相信大部分人会有疑问的,不是说6+版本之后在反射方法时候都是用的makePathElements,怎么上面的是makeDexElements方法呢,以api24版本为例,this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions, definingContext);确实没错,那我们看下makeDexElements做了什么
/**
* Makes an array of dex/resource path elements, one per element of
* the given array.
*/
private static Element[] makeDexElements(List<File> files, File optimizedDirectory,
List<IOException> suppressedExceptions,
ClassLoader loader) {
return makeElements(files, optimizedDirectory, suppressedExceptions, false, loader);
}makeDexElements最终返回了makeElements方法,那我们在看看makePathElements方法:
private static Element[] makePathElements(List<File> files,
List<IOException> suppressedExceptions,
ClassLoader loader) {
return makeElements(files, null, suppressedExceptions, true, loader);
}
private static Element[] makePathElements(List<File> files, File optimizedDirectory,
List<IOException> suppressedExceptions) {
return makeElements(files, optimizedDirectory, suppressedExceptions, false, null);
}我们通过
Method makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements", List.class, File.class, List.class)
获取makePathElements方法,传递的三个参数分别为List、File、List是不是与makePathElements方法第二个参数完全一致,并且最后均调用了makeElements,所以6+版本之后通过makePathElements来反射方法完全没有问题。
总结下过程:我们先获取当前应用的PathClassLoader,ClassLoader classLoader = application.getClassLoader(),然后通过反射获取DexPachList的属性pathList,Field pathListField = ShareReflectUtil.findField(loader, "pathList"),在将我们的修复包patch.dex转为Element[],Object[] objects = makePathElements(dexPathList,new ArrayList<>(additionalClassPathEntries), optimizedDirectory, suppressedExceptions),最后将makePathElements生成的objects与原本的dexElements合并。
如何将dex文件转为Element呢,篇幅刚开始给出了PathClassLoader的源码,他做了啥操作呢,仅仅是继承了父类,然后传了一个dexPath,在其父类BaseDexClassLoader中,通过this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory)将dexPath传递到DexPathList中,在DexPathList中做了啥呢,将参数传递给了makePathElements这个方法,this.dexElements = makePathElements(splitDexPath(dexPath), optimizedDirectory,suppressedExceptions),那我们是不是也将patch.dex传递给makePathElements方法就能转为Element呢
我们看下makePathElements 这个方法在DexPathList中的定义 private static Element[] makePathElements,是一个私有的方法,那么我们可以通过反射getDeclaredMethod来获取,注意不同版本的方法名及参数适配(本例api23)
Method makePathElements = ShareReflectUtil.findMethod(dexPathList, "makePathElements",
List.class, File.class,
List.class);findMethod方法中主要操作:Method method = clazz.getDeclaredMethod(name, parameterTypes);
Class<?> clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()
为了更直观的的说明classLoader、pathList、dexElements的关系,上一张图如下:
至此,这个demo算是完成了。
-
《豆瓣资源下载大师》是一款好用的搜索聚合工具,让用户以作品的豆瓣评论详情页为入口,直达各种资源网站的作品下载页,极大减轻了找资源的工作量! 086《CSDN开发助手》CSDN官方合法免广告工具,内含大量实用开发...
-
不推荐为什么要说出来?经典的书如果不提,你们又要说我菜。(害) 这几本书都要看吗?当然不是,如果你是在准备面试,我个人建议是读其中一本就够了。至于说看哪一本,你可以找对应的电子书,挑一个章节试读一下,...
-
对于希望从 macOS Catalina 更新到 macOS Big Sur 而在软件更新中搜索不到推送的用户,请前往 AppStore 搜索 "macOS Big Sur" 并点击获取即可。 更新配置文件 / 从 Clover 迁移至 OpenCore 请直接在 macOS 环境下...
-
身为小菜鸟的我,每逢看源码时就找不到个准头,看着看着就迷糊了。恰巧今天逛知识星球时,看一个球友的回答觉得非常好,特此转录一下 如何写好注释 请停止代码注释 如何写Java文档注释(Java Doc Comments) ...
-
需要特定的ruby1.9.2等环境,但gem源里只有低版本,有没有什么办法解决本地安装rails3的依赖问题或如何更新...
2011-12-11 22:41:201.在安装bundle install --path vendor/bundle时,总是提示rake-0.9.2在源中找不到(bundle的安装过程中总是有一步,feching source index from rubygems.org)。所以,我单独下载安装了rake0.9.2。并且修改了 /usr/... -
读写分离主要是为了将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。 读写分离可以大幅提高读性能,小幅提高写的性能。因此,读写分离更适合...
-
读写分离主要是为了将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。 读写分离可以大幅提高读性能,小幅提高写的性能。因此,读写分离更适合...
-
读写分离主要是为了将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写,从服务器负责读。另外,一主一从或者一主多从都可以。 读写分离可以大幅提高读性能,小幅提高写的性能。因此,读写分离更适合...
-
✅为什么我新建布局文件后直然后findComponentById一直报红色找不到的问题? 目前这个2.0.8.203有些bug,官方已收到反馈,后续会修复。 目前在新建布局文件的时候,ResourceTable一定找不到你的布局文件和id,此时...
-
我在这个issue里写明了为什么 oc的图形化os选择页面无用的理由也同上 因为你不用oc去引导windows并且直接省略选择页面,所以图形化的oc界面也就没用 一定要先改三码再用,具体的教程自己百度 icloud中的查找我的...
-
如果不是远程依赖,而是下载的例子程序,那么还需要将例子程序中的config.gradle放入你的主项目根目录中,然后在根目录build.gradle的第一行加入: apply from: "config.gradle" 注意: config.gradle中的 android =...
-
1. 为什么有这个表 作为开发者其实比较好奇其他人在做什么业余项目(不管目的是做到盈利/玩票/试试看) 所以特意建了这个库。欢迎各位开发者把自己的项目加进来~ 发 Pull Request 或 Issue 即可 (入选标准:必须是...
-
开发工具idea或eclipse还需要安装lombok插件,否则会提示找不到实体类的的get/set方法 运行KvfAdminApplication.java,启动项目【kvf-admin】 idea启动访问:http://localhost/【一般idea都会自动去掉项目名】【这里...
-
在入门到熟悉NLP的过程中,用到了很多github上的包,遂整理了一下,分享在这里。 很多包非常有趣,值得收藏,满足大家的收集癖! 如果觉得有用,请分享并star,谢谢! 长期不定时更新,欢迎watch和fork! 涉及内容...
-
超级有影响力霸气的Java面试题大全文档
2012-07-18 09:47:04当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例... -
国内用户如果访问GitHub比较慢的话,也可以关注我的知乎号Python-Jack上的“从零开始学Python”专栏,专栏会持续更新,还有大家比较期待的“数据分析”的内容也即将上线,欢迎大家关注我在知乎的专栏、文章和回答。...
-
Eclipse开发PHP环境配置
2011-05-17 15:26:00到这里下载注意:DLTK是所谓动态语言开发包,PDT依赖于它,不知为什么现在官方主页上的稳定版本从1.0版降到了0.95,而PDT必须在1.0上运行,所以请选择最新的Integration版本(在页面最下面),而不是Release或Stable...首先准备好软件:
1. Apache,到这里找个最新版本
2. PHP,到这里下载
注意:DLTK是所谓动态语言开发包,PDT依赖于它,不知为什么现在官方主页上的稳定版本从1.0版降到了0.95,而PDT必须在1.0上运行,所以请选择最新的Integration版本(在页面最下面),而不是Release或Stable版本。
3. EclipsePHP,到这里下载
4. Zend Debugger,到这里下载
下面开始安装配置这些软件。
首先,安装配置Apache和php环境。
安装不多说,Apache是个msi文件,php只要解压缩就可以了。
配置比较烦,步骤如下:
1. 编辑php.ini
1) extension_dir = "./" 修改为 extension_dir = "C:/php-5.2.6/ext"
2) ;extension=php_mysql.dll”和“;extension=php_gd2.dll”,去掉前面的分号,即把 ;extension=php_mysql.dll 改为 extension=php_mysql.dll
把 ;extension=php_gd2.dll 改为 extension=php_gd2.dll
3).保存好php.ini,然后重起apache2. 修改Apache/conf下的httpd.conf,在文件尾部添加:
LoadModule php5_module "C:/php-5.2.6/php5apache2_2.dll"
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Action application/x-httpd-php "/php/php-cgi.exe"
AddType application/x-httpd-php .html
AddType application/x-httpd-php .htm
AddDefaultCharset UTF8PHPIniDir "C:/php-5.2.6"
3.在环境变量的Path设置下添加:
C:/php-5.2.6;C:/php-5.2.6/ext
经过上述配置,在Apache/htdocs目录下创建一个php测试文件index.php如下:
<?php
phpinfo();
?>记得重新启动Apache。
打开IE在地址栏输入:http://localhost/index.php,如果能工作就表示php和apache能工作了。
然后,配置Eclipse的PHP开发,调试环境。
1. 安装Eclipse.就是解压缩到一个目录
2. 安装DLTK.
把下载到的文件解压缩到某目录下,如:F:"PHP"PDT"dltk-core-I-I200809081043-200809081043-incubation,启动Eclipse->Help->Software Updates->Available Software -> Add Site -> Local -> 选择刚才的解压缩目录,安装之。
3. 安装PDT2.0
根DLTK安装类似。
4. 安装ZDebugger
把下载到的ZendDebugger-5.2.14RC9-cygwin_nt-i386.zip解压缩,目录下有一个readme.txt,按照上面说的安装就行了,根据我安装的实际情况执行readme.txt的结果如下:
1) 从5_2_x_comp目录下选择ZendDebugger.dll,copy到C:/php-5.2.6/ext下面
2) 在php.ini文件中添加:
zend_extension_ts=C:/php-5.2.6/ext/ZendDebugger.dll
zend_debugger.allow_hosts=localhost,127.0.0.1zend_debugger.expose_remotely=always
3) 将dummy.php文件copy到C:/Program Files/Apache Software Foundation/Apache2.2/htdocs下面
5. 配置Eclipse及Apache
1) 配置Apache:
比如我在 E:/EclipseWorkspace下放置所有的Eclipse工程,那么修改Apache/conf/httpd.conf,在文件结尾添加:
Alias /Workspace/ "E:/EclipseWorkspace/"
<Directory "E:/EclipseWorkspace/">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all</Directory>
这样做的好处是,所有php工程都共享一个apache配置(看下面如何设置)。
2)配置Eclipse:
打开Eclipse->Window->Preferences->PHP:
PHP Executables->Add,如下所示设置:
PHP Servers->New,如下所示设置:
注意URL栏中添加了Workspace,这个是在httpd.conf中添加的目录别名。
PHP Debug,如下图所示,选择合适的Debugger,Server
至此,配置完成。
记得再次重新启动Apache。
最后,建一个测试程序,看看效果如何:
新建一个PHP Project命名叫FirstPHPTest, 当然使用的是我们的E:/EclipseWorkspace作为Eclipse的workspace目录。
在工程中新建PHP File, 比如使用上面的index.php。
当在index.php上右键 Run As->PHP Web Page时就可以看到类似如下画面了:
-
极品ADSL+路由器驱动优化工具cfos_7.52和cfosspeed_5.12汉化特别版
2010-06-29 08:26:00cFosSpeed 官方网站上找不到防火墙的字眼, 可能没有吧~~~~ Q: cFos 所提供的 PPPoE 是什么? 可以给 ADSL or Cable 使用吗? A: 如果你用的 ADSL, Cable 是原本需要安装 PPPoE 或是电信告诉你用 Windows 2K/XP/2003... -
JQuery插件-HighCharts 一个令我蛋疼的事 求教、、
2011-04-15 14:20:22然后在网上找了会,发现一个HighCharts类库,一个JQuery插件,使用这个绘制出来的图形挺好看的,效果也令人满意,但是目前跟AJAX结合之后,highcharts制造出来的内存一直没有删除,PF使用率以每秒3MB的速度网上猛涨... -
电脑常见问题与故障1000例(高清PDF中文版)
2011-05-30 07:13:36113.在BIOS中有时会找不到硬盘 114.硬盘的DMA关闭导致系统运行过慢 115.辨别硬盘的软、硬故障 116.Fdisk无法读取硬盘分区 117.主分区没有激活而不能引导系统 118.坏区造成Fdisk不能通过检测 119.坏道导致硬盘间断... -
实现类似Office助手的小精灵
2004-07-16 00:00:00在Win95/98/NT操作平台上,为其它调用Agent的客户程序提供服务。客户程序可以是利用VB、 C++、Delphi、VFP、PB等开发的应用软件,也可以是HTML文件中的Visual Script、Java Script 脚本语言代码。 安装Agent核心... -
SkinEngine 3.4.7 汉化版
2008-05-16 16:58:07<br>拖一个button到页面上,编译,通不过,提示找不到相关的DCU文件,没办法,重新回到SkinEngine的安装目录中,把sources目录中的所有文件拷贝到delphi6/lib目录下面,再次编译通过了.具体为什么会这样我也不是很清楚.... -
google code 下载地址 https://code.google.com/p/artdialog/downloads/list 贤心弹出层 http://layer.layui.com 响应式用户交互组件库 https://github.com/bh-lay/UI sweetalert-有css3动画弹出层 ...
-
电脑蓝屏对照码
2019-05-05 14:16:40◇解决方案:如果是在安装Windows时出现, 有可能是由于你的电脑达不到安装Windows的最小内存和磁盘要求. 4、0x0000001E:KMODE_EXCEPTION_NOT_HANDLED ◆错误分析:Windows内核检查到一个非法或者未知的进程指令, 这个... -
Oracle DBA突击:帮你赢得一份DBA职位--详细书签版
2013-02-06 15:56:408.1.1 为什么要系统调整 253 8.1.2 方法论——从命中率到等待事件 253 8.1.3 工具:从STATSPACK到AWR 255 8.2 Oracle 10g的自动管理框架 257 8.2.1 AWR概述 258 8.2.2 ADDM概述 258 8.3 负载数据自动... -
SynergyInstaller-1.3.1
2015-09-15 14:40:26在工作中,有一台笔记本和一台个人PC,个人PC的键盘鼠标都相当难用,遂希望能找到一个能让我使用笔记本键盘和鼠标能直接实时操作另一台PC的办法,不负所望,发现了synergy这款软件。这款软件的好处在于:它可以跨... -
x-scan-v3.3-cn
2013-09-23 21:36:561、为什么我找不到扫描器报告的漏洞? 扫描器报告服务器上存在某个存在漏洞的文件,是发送一个GET请求并接收服务器返回值来判断文件是否存在,这个返回值在HTTP的协议中有详细的说明,一般情况下“200”是文件存在,... -
DGSetup_3040E2_20190628.exe
2019-07-28 18:48:23找不到驱动程序?驱动版本太旧,玩新游戏总是出状况?这都不是事儿,驱动精灵帮你搞定 系统补丁 快速安装 操作系统补丁没打齐?缺少各种.Net、VC运行库致使程序无法运行?驱动精灵可让您的系统安全稳定,功能完备。 软件...
-
C/C++反汇编解密
-
AlexNet.zip
-
朱老师鸿蒙系列课程第1期-3.鸿蒙系统Harmonyos源码配置和管理
-
Python lambda用法
-
el-col 里面的内容对齐方式修复
-
MySQL 高可用(DRBD + heartbeat)
-
C和C++课程
-
线性筛质数
-
H5区块链理财学习版源码.zip
-
大学物理第五章.doc
-
零基础极简以太坊智能合约开发环境搭建并开发部署
-
MySQL 数据库的基本操作(数据完整性约束)
-
计算 m 的 n 次幂
-
MySQL 高可用工具 heartbeat 实战部署详解
-
2021年软考系统规划与管理师-下午历年真题解析视频课程
-
Yolov5_tf-master.zip
-
内存管理,比较各种调度算法的优劣
-
RTL8370N交换芯片+H4001CG变压器8口网口交换机ALTIUM设计硬件原理图+PCB+封装库+BOM表文件.zip
-
BLHeliSuite32_32800.zip
-
大学物理第三章.doc