Android开发各类常见错误解决方案

本文属于个人平时项目开发过程遇到的一些问题,记录下来并总结解决方案,希望能帮到大家解决问题,有些问题的解决方案是在StackoverFlow上找到的,建议大家遇到问题多去上面找,基本上都能找到解决方案的。

(1)将Eclipse项目导入到Android studio 中 很多点9图出现问题解决方法: 在build.gradle里添加以下两句:

com.android.bui" data-snippet-id="ext.fe2015d4a16367e45ed83e2595c5311a" data-snippet-saved="false" data-codota-status="done">Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.bui
  • 解决方法:
    在build.grade中添加以下代码:
  1. android{
  2. packagingOptions {
  3. exclude ‘META-INF/DEPENDENCIES.txt’
  4. exclude ‘META-INF/NOTICE’
  5. exclude ‘META-INF/NOTICE.txt’
  6. exclude ‘META-INF/LICENSE’
  7. exclude ‘META-INF/LICENSE.txt’
  8. }
  9. }

(4)未知错误

  1. Error:Timeout waiting to lock cp_proj class cache for build file ‘/Users/Mr.xiao/Desktop/AndroidShopNC2014MoblieNew/androidShopNC2014Moblie/build.gradle’
  2. (/Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj).
  3. It is currently in use by another Gradle instance.
  4. Owner PID: unknown
  5. Our PID: 1412
  6. Owner Operation: unknown
  7. Our operation: Initialize cache
  8. Lock file: /Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj/cache.properties.lock
  • 解决方案
    以上是错误提示。
    解决的思路很简单只需要把cache.properties.lock文件删除了就可以了。当时我们删除的时候会被占用这时候需要进入任务管理器结束关于java的进程就行比如 java 的jdk 删除后重启让java jdk启动 启动Android Studio就能启动APK了。

(5)修改了Android项目的*小SDK版本之后出现很多stysle文件找不到

  • 解决方案
  1. compileSdkVersion 23
  2. buildToolsVersion “23.0.3”
  3. defaultConfig {
  4. applicationId “net.mmloo2014.android”
  5. minSdkVersion 14
  6. targetSdkVersion 23
  7. }

compileSdkVersion 是多少版本的

那么compile ‘com.android.support:appcompat-v7:23.2.1’ 就是啥版本的。

(6)Android studio 编译问题:finished with non-zero exit value 2

  • 问题:
  1. Error:Execution failed for task ‘:androidShopNC2014Moblie:transformClassesWithDexForDebug’.
  2. >
  3. com.android.build.api.transform.TransformException:
  4. com.android.ide.common.process.ProcessException:
  5. java.util.concurrent.ExecutionException:
  6. com.android.ide.common.process.ProcessException:
  7. org.gradle.process.internal.ExecException:
  8. Process ‘command ‘/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java finished with non-zero exit value 2
  • 解决方案
    这个错误在app的build.gradle里面添加下面这句就好了。
  1. android {
  2. defaultConfig {
  3. multiDexEnabled true
  4. }
  5. }

(7)Android studio 编译问题:finished with non-zero exit value 1(由于导入的依赖出现重复造成的)

  • 问题:
  1. Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
  2. > com.[Android](http://lib.csdn.net/base/15).build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘F:\Program Files (x86)\[Java](http://lib.csdn.net/base/17)\jdk1.8.0_31\bin\java.exe” finished with non-zero exit value 1
  • 解决方案
    这个是因为依赖包重复了 (像v4和nineoldandroids),app中实现了对easeUI的依赖,但是app和easeUI都添加了对这个包的依赖。所以就报这个错误,修改之后再报,就clean,rebuild一下。

(8)问题

  1. Error:Execution failed for task
  2. ‘:app:transformClassesWithJarMergingForDebug’.>
  3. com.android.build.api.transform.TransformException:
  4. java.util.zip.ZipException:
  5. duplicate entry: org/apache/http/ConnectionClosedException.class
  • 解决方案
    这个是在我们启动的时候报错的,而不是在编译的时候,原因是这样的,报这个错是因为有2个库中存在相同的类。大家可以看到stackoverflow上有人也提了这样的问题。只需要删除其中的一个就可以解决了。

(9)添加第三方依赖出现的问题

  1. Error:Execution failed for task ‘:app:processDebugManifest’.
  2. >
  3. Manifest merger failed :
  4. uses-sdk:minSdkVersion 14 cannot be smaller than version 19 declared in library [com.github.meikoz:basic:2.0.3]
  5. /AndroidStudioCode/EnjoyLife/app/build/intermediates/exploded-aar/
  6. com.github.meikoz/basic/2.0.3/AndroidManifest.xml
  7. Suggestion: use tools:overrideLibrary=“com.android.core” to force usage
  • 错误原因
    出现这个错误的原因是我引入的第三方库*低支持版本高于我的项目的*低支持版本,异常中的信息显示:我的项目的*低支持版本为14,而第三方库的*低支持版本为19,所以抛出了这个异常。
  • 解决方案
    在AndroidManifest.xml文件中标签中添加
  1. <uses-sdk tools:overrideLibrary=“xxx.xxx.xxx”/>

其中的xxx.xxx.xxx为第三方库包名,如果存在多个库有此异常,则用逗号分割它们,例如:

<uses-sdk tools:overrideLibrary="xxx.xxx.aaa, xxx.xxx.bbb"/>

这样做是为了项目中的AndroidManifest.xml和第三方库的AndroidManifest.xml合并时可以忽略*低版本限制。

(10)Android studio 编译问题:finished with non-zero exit value 1(由于buildtools版本太高造成的)

  • 错误
  1. Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’.
  2. > com.android.ide.common.process.ProcessException:
  3. org.gradle.process.internal.ExecException:
  4. Process ‘command ‘/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java finished with non-zero exit value 1
  • 错误原因
    buildToolsVersion版本太高,我原来的 buildToolsVersion “24.0.0” 需要jdk1.8,而我的是jdk1.7,所以一直报这个错,刚开始以为是v4包和V7包冲突,因为之前遇到这样的问题,而这次删除V4包之后依然报这个错,上stackoverflow搜了一下,把buildTools版本降下来就好了。
  • 解决方案
  1. android {
  2. compileSdkVersion 23
  3. buildToolsVersion “23.0.3”
  4. }

(11)Android studio 编译问题:Gradle DSL not found ‘android()’

  • 问题
clipboard.png

clipboard.png
  • 解决方案
  • 配置build.gradle:
  1. buildscript {
  2. repositories {
  3. jcenter()
  4. }
  5. dependencies {
  6. classpath ‘com.android.tools.build:gradle:2.1.2’
  7. }
  8. }
  9. allprojects {
  10. repositories {
  11. jcenter()
  12. }
  13. }
  14. buildscript {
  15. repositories {
  16. jcenter()
  17. }
  18. dependencies {
  19. classpath ‘com.android.tools.build:gradle:2.1.2’
  20. }
  21. }
  22. allprojects {
  23. repositories {
  24. jcenter()
  25. }
  26. }
  • 配置app/build.gradle:
  1. apply plugin: ‘com.android.application’android {
  2. compileSdkVersion 23
  3. buildToolsVersion ‘23.0.3’
  4. defaultConfig {
  5. minSdkVersion 9
  6. targetSdkVersion 23
  7. versionCode 1
  8. versionName ‘1.0’
  9. }
  10. }
  11. dependencies {
  12. compile ‘com.android.support:appcompat-v7:23.2.1’
  13. }

*后再同步一下sync即可。

(12)Android studio 编译问题:Gradle DSL not found ‘android()’

  • 问题描述
  1. Error:(51, 52) 错误: -source 1.6 中不支持 diamond 运算符
  2. (请使用 -source 7 或更高版本以启用 diamond 运算符)
  • 解决方案
  • 方案一
将标红处设置为1.7.png

将标红处设置为1.7.png
修改soure为1.7.png

修改soure为1.7.png
  • 方案二
    在build gradle中进行配置如下代码:
  1. android {
  2. compileOptions {
  3. sourceCompatibility JavaVersion.VERSION_1_7
  4. targetCompatibility JavaVersion.VERSION_1_7
  5. }
  6. }

*后同步一下即可

(13)Glide使用问题:使用Glide加载圆角图片,*次显示占位图

  • 问题描述
    *近在项目中使用Glide加载圆形图片,并且设置placehloder和error两个占位图,运行发现,*次加载图片只显示占位图,需要第二次进入的时候才会正常显示。
    如果你刚好使用了这个圆形Imageview库或者其他的一些自定义的圆形Imageview,而你又刚好设置了占位的话,那么,你就会遇到*个问题。如何解决呢?
  • 方案一
    不设置占位图
  • 方案二
    使用Glide的Transformation API自定义圆形Bitmap的转换
  1. /**
  2. * Glide圆形图片处理
  3. */
  4. static class CircleTransform extends BitmapTransformation {
  5. public CircleTransform(Context context) {
  6. super(context);
  7. }
  8. @Override
  9. protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
  10. return circleCrop(pool, toTransform);
  11. }
  12. private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
  13. if (source == null) return null;
  14. int size = Math.min(source.getWidth(), source.getHeight());
  15. int x = (source.getWidth() – size) / 2;
  16. int y = (source.getHeight() – size) / 2;
  17. Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
  18. Bitmap result = pool.get(size, size, Bitmap.Config.RGB_565);
  19. if (result == null) {
  20. result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
  21. }
  22. Canvas canvas = new Canvas(result);
  23. Paint paint = new Paint();
  24. paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
  25. paint.setAntiAlias(true);
  26. float r = size / 2f;
  27. canvas.drawCircle(r, r, r, paint);
  28. return result;
  29. }
  30. @Override
  31. public String getId() {
  32. return getClass().getName();
  33. }
  34. }

使用方法:

 Glide.with(context).load(imageUrl).placeholder(placeholder).error(errorImage).transform(new CircleTransform(context)).into(imageView);

方案三
重写Glide的图片加载监听方法,具体如下:

  1. Glide.with(mContext)
  2. .load(url)
  3. .placeholder(R.drawable.loading_drawable)
  4. .into(new SimpleTarget<Bitmap>(width, height) {
  5. @Override public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
  6. // setImageBitmap(bitmap) on CircleImageView
  7. }
  8. });

注意事项:
该方法在listview上复用有问题的bug,如果在listview中加载CircleImageView,请不要使用该方法。

方案四:不使用Glide的默认动画:

  1. Glide.with(mContext)
  2. .load(url)
  3. .dontAnimate()
  4. .placeholder(R.drawable.loading_drawable)
  5. .into(circleImageview);

(14)json数据解析问题:json串头部出现字符:”\ufeff” 解决方法
异常信息

org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject

解析服务器返回 的json格式数据时,我们可能会发现,数据格式上是没有问题的,但是仔细对比会发现,在json串头部发现字符:”\ufeff”

客户端解决方案:

  1. /**
  2. * 异常信息:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
  3. * json串头部出现字符:”\ufeff” 解决方法
  4. * @param data
  5. * @return
  6. */
  7. public static final String removeBOM(String data) {
  8. if (TextUtils.isEmpty(data)) {
  9. return data;
  10. }
  11. if (data.startsWith(“\ufeff”)) {
  12. return data.substring(1);
  13. }
  14. else {
  15. return data;
  16. }
  17. }

服务器端解决方案:
将输出此json的php源码重新用editplus之类用utf-8无BOM的编码保存。不要用windows系统自带的记事本编辑php源码,这个BOM就是记事本这些windows自带的编辑器引入的。

(15)Android studio编译问题:not found ndk()
问题

Error:(15, 0) Gradle DSL method not found: 'ndk()' method-not-found-ndk

解决方案
出现该问题,可能是由于ndk配置在build.gradle配置文件中位置弄错导致的

  1. apply plugin: ‘com.android.application’
  2. android {
  3. compileSdkVersion 23
  4. buildToolsVersion “23.0.2”
  5. defaultConfig {
  6. applicationId “com.guitarv.www.ndktest”
  7. minSdkVersion 17
  8. targetSdkVersion 23
  9. versionCode 1
  10. versionName “1.0”
  11. ndk {
  12. moduleName = “HelloJNI”
  13. }
  14. sourceSets.main {
  15. jni.srcDirs = []
  16. jniLibs.srcDir “src/main/libs”
  17. }
  18. }
  19. buildTypes {
  20. release {
  21. minifyEnabled false
  22. proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
  23. }
  24. }
  25. }

(16)Android studio导入其他的项目:UnsupportedMethodException
问题

  1. UnsupportedMethodException
  2. Unsupported method: AndroidProject.getPluginGeneration().
  3. The version of Gradle you connect to does not support that method.
  4. To resolve the problem you can change/upgrade the target version of Gradle you connect to.
  5. Alternatively, you can ignore this exception and read other information from the model.
错误截图

错误截图

解决方案

将根目录中的build.gradle文件中的gradle版本号,出现错误之前,我的是1.3.0,修改成2.2.0之后重新编译一下就可以运行了。

  1. dependencies {
  2. classpath ‘com.android.tools.build:gradle:1.3.0’
  3. }

将这个版本号改成你其他项目能够运行成功的版本号即可

(17)Android studio更新到2.1.1之后使用CollapsingToolbarLayout出现Error inflating class CollapsingToolbarLayout
之前在项目中使用了CollapsingToolbarLayout,效果还是可以的,但是Android stuido更新到2.1.1版本之后出现Error inflating class CollapsingToolbarLayout 异常崩溃
异常信息如下所示:

  1. com.test.android/com.test.android.ui.activity.RandomActivity}: android.view.InflateException: Binary XML file line #22: Error inflating class android.support.design.widget.CollapsingToolbarLayout
  2. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
  3. at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
  4. at android.app.ActivityThread.access$800(ActivityThread.java:151)
  5. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
  6. at android.os.Handler.dispatchMessage(Handler.java:102)
  7. at android.os.Looper.loop(Looper.java:135)
  8. at android.app.ActivityThread.main(ActivityThread.java:5254)
  9. at java.lang.reflect.Method.invoke(Native Method)
  10. at java.lang.reflect.Method.invoke(Method.java:372)
  11. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
  12. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
  13. Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class android.support.design.widget.CollapsingToolbarLayout
  14. at android.view.LayoutInflater.createView(LayoutInflater.java:633)
  15. at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
  16. at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
  17. at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
  18. at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
  19. at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
  20. at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
  21. at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
  22. at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
  23. at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
  24. at com.test.android.ui.activity.RefreshableActivity.onCreate(RefreshableActivity.java:31)
  25. at android.app.Activity.performCreate(Activity.java:5990)
  26. at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
  27. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
  28. at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
  29. at android.app.ActivityThread.access$800(ActivityThread.java:151)
  30. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
  31. at android.os.Handler.dispatchMessage(Handler.java:102)
  32. at android.os.Looper.loop(Looper.java:135)
  33. at android.app.ActivityThread.main(ActivityThread.java:5254)
  34. at java.lang.reflect.Method.invoke(Native Method)
  35. at java.lang.reflect.Method.invoke(Method.java:372)
  36. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
  37. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
  38. Caused by: java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Drawable;I)V in class Landroid/support/v4/graphics/drawable/DrawableCompat; or its super classes (declaration of ‘android.support.v4.graphics.drawable.DrawableCompat’ appears in /data/app/com.test.android-1/base.apk)
  39. at android.support.design.widget.CollapsingToolbarLayout.setStatusBarScrim(CollapsingToolbarLayout.java:663)
  40. at android.support.design.widget.CollapsingToolbarLayout.<init>(CollapsingToolbarLayout.java:197)
  41. at android.support.design.widget.CollapsingToolbarLayout.<init>(CollapsingToolbarLayout.java:132)
  42. at java.lang.reflect.Constructor.newInstance(Native Method)
  43. at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
  44. at android.view.LayoutInflater.createView(LayoutInflater.java:607)
  45. at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
  46. at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
  47. at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
  48. at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
  49. at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
  50. at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
  51. at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
  52. at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
  53. at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
  54. at com.test.android.ui.activity.RefreshableActivity.onCreate(RefreshableActivity.java:31)
  55. at android.app.Activity.performCreate(Activity.java:5990)
  56. at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
  57. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
  58. at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
  59. at android.app.ActivityThread.access$800(ActivityThread.java:151)
  60. at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
  61. at android.os.Handler.dispatchMessage(Handler.java:102)
  62. at android.os.Looper.loop(Looper.java:135)
  63. at android.app.ActivityThread.main(ActivityThread.java:5254)
  64. at java.lang.reflect.Method.invoke(Native Method)
  65. at java.lang.reflect.Method.invoke(Method.java:372)

解决方案
在项目的build.gradle文件中添加下面一行,同步一下即可

  1. compile (‘com.android.support:support-v4:23.4.0’){
  2. force = true;
  3. }

StackOverFlow解决方案

(18)Android studio gradle编译异常

java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0

很显然是class版本不支持。经查询,Android Studio2.2必须使用JDK8及以上版本,而且是强制的。
所以呢,赶紧下了个JDK8*新版的。安装完毕,把JAVA_HOME指向了JDK8,实测JDK7和8是可以共存的。
那么,重启Android Studio后问题解决,Build Successful !

(19)电脑突然断电,Android studio 工程代码全部报错,找不到android sdk 的依赖包,clean、重启都没有用
前几天公司搬家,正准备同步代码,突然断电、等把电脑搬到新办公楼,打开AS发现所有的项目代码报错,找不到android 依赖包,clean、重启都没有用,

(20)recycleview嵌套列表项显示不全问题
解决方案:

*个RecyclerView的Adapter(即父RecyclerView):

  1. @Override
  2. public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  3. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item,null); 解决条目显示不全
  4. MyHolder holder = new MyHolder(view);
  5. return holder;
  6. }

第二个RecyclerView的Adapter(即子RecyclerView):

  1. @Override
  2. public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  3. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.check_item, parent,false);//解决宽度不能铺满
  4. MyHolder holder = new MyHolder(view);
  5. return holder;
  6. }

(21)Android手机真机调试,日志不打印的解决方案:

  1. 1、在拨号界面输入:*#*#2846579#*#* 进入测试菜单界面。
  2. 2、Project Menu–后台设置–LOG设置
  3. 3LOG开关–LOG打开 LOG级别设置–VERBOSE
  4. 4、Dump&Log– 全部选中
  5. 5、重启手机

(22)java.lang.IndexOutOfBoundsException Inconsistency detected. Invalid item position 2(offset:2).state:4
解决方案:
Recyclerview在下拉刷新时,如果在数据没更新到之前将list clear 之后,迅速滑动会造成crash,所以一般在下拉刷新之前,等数据刷新回来再把之前的数据进行清除。

(23)**使用友盟分享——微信、朋友圈分享出现java.lang.NoClassDefFoundError: org.apache.http.entity.mime.MultipartEntity
**
解决方案: 造成这样的原因是因为缺少httpmime_jar,添加是httpmime_jar包之后即可正常分享

(24)Fragment中调用getActivity()出现空指针异常
解决方案:

  1. 对于上面的问题,可以考虑下面这两种解决办法:
  2. 1、不保存fragment的状态:在MyActivity中重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到fragment随MyActivity一起销毁的目的。
  3. 2、重建时清除已经保存的fragment的状态:在恢复Fragment之前把Bundle里面的fragment状态数据给清除。方法如下:
  4. if(savedInstanceState!= null)
  5. {
  6. String FRAGMENTS_TAG = “android:support:fragments”;
  7. savedInstanceState.remove(FRAGMENTS_TAG);
  8. }

(25)RecyclerView嵌套使用切换页面出现自动滚动问题
原因:

造成这样的原因是由于子RecyclerView抢占焦点导致的,如果你去查看RecyclerView的源码会发现,它会在构造方法中调用setFocusableInTouchMode(true),所以,设为false可以解决这个问题。
解决方案
在子RecyclerView中调用如下方法

  1. //设置焦点不需要
  2. secondRvList.setFocusableInTouchMode(false);
  3. secondRvList.requestFocus();

(26)Android 7.0设备拍照闪退问题
原因:

Android 7.0 做了一些系统权限更改,为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问,此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。而此权限更改有多重副作用,其中之一就是当传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。在应用间共享文件对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。要在应用间共享文件,应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的*简单方式是使用 FileProvider 类。点击查看Android官方说明
解决方案
1.在清单文件添加如下代码

  1. <provider
  2. android:name=“android.support.v4.content.FileProvider”
  3. android:authorities=“你的应用包名.fileProvider”
  4. android:exported=“false”
  5. android:grantUriPermissions=“true”>
  6. <meta-data
  7. android:name=“android.support.FILE_PROVIDER_PATHS”
  8. android:resource=“@xml/provider_paths”/>
  9. </provider>
android:authorities="com.alex.demo.FileProvider" 自定义的权限  
android:exported="false" 是否设置为独立进程  
android:grantUriPermissions="true" 是否拥有共享文件的临时权限  
android:resource="@xml/external_storage_root" 共享文件的文件根目录,名字可以自定义  

2.在xml文件夹目录下新建provider_paths文件,名字自定义,添加如下代码

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <resources>
  3. <paths>
  4. <external-path
  5. name=“camera_photos”
  6. path=“” />
  7. </paths>
  8. </resources>

3.调用系统相机处代码处理

  1. //调用系统相机拍照
  2. Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  3. if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
  4. cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, parUri(tempFile));
  5. startActivityForResult(cameraIntent, REQUEST_CAMERA);
  6. }
  7. /**
  8. * 生成uri
  9. *
  10. * @param cameraFile
  11. * @return
  12. */
  13. private Uri parUri(File cameraFile) {
  14. Uri imageUri;
  15. String authority = getContext().getPackageName()+ “.provider”;
  16. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  17. //通过FileProvider创建一个content类型的Uri
  18. imageUri = FileProvider.getUriForFile(getContext(), authority, cameraFile);
  19. } else {
  20. imageUri = Uri.fromFile(cameraFile);
  21. }
  22. return imageUri;
  23. }

Android Studio下配置和使用Lambda

和朋友讨论 JAVA8 的新特性,聊到Lambda,正好在掘金上看到一篇相关的文章,结合资料,作一个总结,特别是记录下实际使用中遇到的问题。

什么是Lambda表达式

lambda表达式,它将允许我们将行为传到函数里。在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码。而定义行为*重要的那行代码,却混在中间不够突出。Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。

— Java8 lambda表达式10个示例

阅读完上面的文字估计也不是特别明白,对于我们日常开发Android,就是简化了匿名函数的使用,可以简单通过下面的示例来感受一下,如果你有更深的兴趣,文末有更多搜集的资料供你阅读。

Lamdba示例

用lambda表达式实现Runnable

使用lambda表达式可以替换匿名类,而实现Runnable接口是匿名类的*好示例。Java 8之前的runnable实现方法,需要4行代码,而使用lambda表达式只需要一行代码。只需要用() -> {}代码块替代整个匿名类。

  1. // Java 8之前:
  2. new Thread(new Runnable() {
  3. @Override
  4. public void run() {
  5. System.out.println(“在Java8之前, 需要写很多代码”);
  6. }
  7. }).start();
  8. //Java 8方式:
  9. new Thread( () -> System.out.println(“使用Java8, Lambda表达式一目了然”) ).start();

 

输出:

  1. 在Java8之前, 需要写很多代码
  2. 使用Java8, Lambda表达式一目了然

 

这个例子展示了Java 8 lambda表达式的语法,可以使用lambda写出如下代码:

  1. (params) -> expression
  2. (params) -> statement
  3. (params) -> { statements }

 

例如,如果你的方法不对参数进行修改、重写,只是在控制台打印点东西的话,那么可以这样写:

() -> System.out.println("Hello World");
  • 1

如果你的方法接收两个参数,那么可以写成如下这样:

(int a, int b) -> a + b
  • 1

使用lambda表达式进行事件处理

在Android日常开发中,我们常常会设置各种事件,比如setOnClickListenersetOnItemClickListener等等,下面对比下前后的写法变化:

  1. //之前
  2. viewA.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. //Do something
  6. }
  7. });
  8. //使用lambda
  9. viewA.setOnClickListener(v -> {
  10. //Do something
  11. });
  12. //或者
  13. viewA.setOnClickListener(View v -> {
  14. //Do something
  15. });

 

这样一对比是不是简洁很多?那么对于多个参数的setOnItemClickListener怎么写呢?

  1. //之前
  2. xxxListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  3. @Override
  4. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  5. //Do something
  6. }
  7. });
  8. //使用lambda后
  9. xxxListView.setOnItemClickListener((parent,view,position,id)->{
  10. //Do something
  11. });
  12. //或者
  13. xxxListView.setOnItemClickListener((AdapterView<?> parent, View view, int position, long id)->{
  14. //Do something
  15. });
  16. //甚至
  17. xxxListView.setOnItemClickListener((a,b,c,d)->{
  18. //Do something
  19. });

 

以上两种例子大概是日常Android开发中*为常用的,更多示例请访问 :Java8 lambda表达式10个示例

启用Lambda

启用Lamdba目前有两种方式,一个是使用Google官方的,一个是使用第三方Java8兼容插件,推荐使用第三方兼容插件 。

基本要求如下:

  • Android Studio 2.1+
  • 安装好 JAVA 8

方式一:Google官方方式

要使用新的 Java 8 语言功能,还需使用新的 Jack 工具链。新的 Android 工具链将 Java 源语言编译成 Android 可读取的 Dalvik 可执行文件字节码,且有其自己的 .jack 库格式,在一个工具中提供了大多数工具链功能:重新打包、压缩、模糊化以及 Dalvik 可执行文件分包。

以下是构建 Android Dalvik 可执行文件可用的两种工具链的对比:

旧版 javac 工具链:
javac (.java --> .class) --> dx (.class --> .dex)
新版 Jack 工具链:
Jack (.java --> .jack --> .dex)
配置 Gradle
如需为您的项目启用 Java 8 语言功能和 Jack,请在模块层级的 build.gradle 文件中输入以下内容:

  1. android {
  2. defaultConfig {
  3. jackOptions {
  4. enabled true
  5. }
  6. }
  7. compileOptions {
  8. sourceCompatibility JavaVersion.VERSION_1_8
  9. targetCompatibility JavaVersion.VERSION_1_8
  10. }
  11. }

 

已知问题
Instant Run 目前不能用于 Jack,在使用新的工具链时将被禁用。

Java 8 语言功能

方式二:使用第三方Java8兼容插件

下面是插件的ReadMe的配置:添加下面的内容到项目的build.gradle文件中

  1. buildscript {
  2. repositories {
  3. mavenCentral()
  4. }
  5. dependencies {
  6. classpath 'me.tatarka:gradle-retrolambda:3.2.5'
  7. }
  8. }
  9. // Required because retrolambda is on maven central
  10. repositories {
  11. mavenCentral()
  12. }
  13. apply plugin: 'com.android.application' //or apply plugin: 'java'
  14. apply plugin: 'me.tatarka.retrolambda'

在本人的项目中,是如下配置,可以避免很多不必要的错误:

build.gradle文件在项目根目录有一个,在Module下也有一个:

/build.gradle

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. mavenCentral()
  5. }
  6. dependencies {
  7. classpath ‘com.android.tools.build:gradle:2.1.2’
  8. classpath ‘me.tatarka:gradle-retrolambda:3.2.5’
  9. classpath ‘me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2’
  10. }
  11. configurations.classpath.exclude group: ‘com.android.tools.external.lombok’
  12. }
  13. allprojects {
  14. repositories {
  15. jcenter()
  16. mavenCentral()
  17. }
  18. }

 

/app/build.gradle

  1. apply plugin: ‘com.android.application’
  2. apply plugin: ‘me.tatarka.retrolambda’
  3. android {
  4. compileOptions {
  5. sourceCompatibility JavaVersion.VERSION_1_8
  6. targetCompatibility JavaVersion.VERSION_1_8
  7. }
  8. }

 

可以看到我在使用中多了几个配置,不过都是在这个插件的issue里查到的。建议仔细阅读下配置说明 ,可以适应一些实际项目中的一些特别需求。

常见Error及解决方式

Couldnot find property ‘options’ on task ‘:app:compileDebugJavaWithJack’.

原因:使用Google官方的方式有一定的兼容性,使用Jack时不能同时使用APT,如果使用butterknife、Dagger等使用了APT的注解框架就不行了

解决方案:使用retrolambda的兼容插件的方式启用lambda

Doesn’t seem to correctly use modified lombok version

原因:参见这里

解决方案:按照我上面写的就不会出现这个问题了。

总结

对于想尝鲜的的开发者,启用Lamdba是个不错的选择,毕竟这个东西会慢慢普及的。

服务器远程端口是什么?远程端口怎么设置?

服务器端口是什么?
随着计算机网络技术的发展,原来物理上的接口(如键盘、鼠标、网卡、显示卡等输入/输出接口)已不能满足网络通信的要求,TCP/IP协议作为网络通信的标准协议就解决了这个通信难题,TCP/IP协议集成到操作系统的内核中,这就相当于在操作系统中引入了一种新的输入/输出接口技术,因为在TCP/IP协议中引入了一种称之为”Socket(套接字)“应用程序接口,有了这样一种接口技术,一台计算机就可以通过软件的方式与任何一台具有Socket接口的计算机进行通信,端口在计算机编程上也就是”Socket接口”

一台服务器为什么可以同时是Web服务器,也可以是FTP服务器,还可以是邮件服务器等,其中一个很重要的原因是各种服务采用不同的端口分别提供不同的服务,比如:通常TCP/IP协议规定Web采用80号端口,FTP采用21号端口等,而邮件服务器是采用25号端口。这样,通过不同端口,计算机就可以与外界进行互不干扰的通信

服务器端口数*大可以有65535个,但是实际上常用的端口才几十个,由此可以看出未定义的端口相当多,端口所对应的服务可以参考百度服务器端口的解答,这是那么多黑客程序都可以采用某种方法,定义出一个特殊的端口来达到入侵的目的的原因所在

为了定义出这个端口,就要依靠某种程序在计算机启动之前自动加载到内存,强行控制计算机打开那个特殊的端口,这个程序就是”后门”程序,这些后门程序就是常说的木马程序,简单的说,这些木马程序在入侵前是先通过某种手段在一台个人计算机中植入一个程序,打开某个(些)特定的端口,俗称”后门”(BackDoor),使这台计算机变成一台开放性*高(用户拥有*高权限)的FTP服务器,然后从后门就可以达到侵入的目的

远程端口怎么设置?
Windows服务器
1、打开注册表,进入以下路径: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp],看见PortNamber值了吗?先选择十进制,其默认值是3389,然后修改成希望的端口即可
2、再打开==[HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro1Set\Control\Tenninal Server\WinStations\RDP\Tcp]==,将PortNumber的默认值(也是先选择十进制)修改成希望的端口,和*步的端口号一致
3、修改完毕,需要重新启动服务器才能生效,以后远程登录的时候要在IP地址后面加上新的端口号,比如1.1.1.1:6001

Linux服务器
1、通过putty远程进入系统

2、修改配置文件,操作命令为:
vi /etc/ssh/sshd_config
找到#Port 22一段,这里是默认使用22端口,把前面的#注释符号去掉,再添加一个新的端口号,比如5000:
Port 22
Port 5000
然后用:wq保存退出,再重启SSH服务,使得SSH端口将同时工作在22和新端口5000上
service sshd restart

3、用putty远程连接5000端口,测试是否成功。如果成功了,则再次编辑sshd_config的设置,将里边的Port 22这行删除即可,上述操作的目的是为了防止设置新端口号时,出现断网或误操作等未知情况造成无法连接。如果您已经熟练了,则可以省去这个步骤,直接把22改成您需要的端口号,删除#注释符号,再重启SSH服务即可

现在你知道如何修改服务器端口了吗?

选择正规服务器供应商,在服务器出现问题时可*时间得到处理,7*24小时售后服务,定期为用户坚持常用软件的运行情况和故障排查,驰网idc02为您保驾护航!

tomcat批量修改端口,shell脚本的实现

tomcat批量修改端口,shell脚本的实现

t.sh

  1. #!/bin/bash
  2. #
  3. TFILE=$1
  4. TPORT=$2
  5. if [ $# -lt 2 ] ;then
  6. echo $0: /usr/local/tomcat/conf/server.xml 8090″
  7. exit 1
  8. fi
  9. echo “—-“
  10. echo $TFILE
  11. echo $TPORT
  12. let “port0=$TPORT-8080″
  13. echo $port0
  14. let “port1=8005+$port0
  15. let “port2=8080+$port0
  16. let “port3=8009+$port0
  17. echo port0:$port0
  18. echo port1:$port1
  19. echo port2:$port2
  20. echo port3:$port3
  21. str1=“<Server port=\”$port1\” shutdown=\”SHUTDOWN\”>”
  22. str2=“<Connector port=\”$port2\” protocol=\”HTTP/1.1\””
  23. str3=“<Connector port=\”$port3\” protocol=\”AJP/1.3\” redirectPort=\”8443\” />”
  24. str01=“<Server port=\”8005\” shutdown=\”SHUTDOWN\”>”
  25. str02=“<Connector port=\”8080\” protocol=\”HTTP/1.1\””
  26. str03=“<Connector port=\”8009\” protocol=\”AJP/1.3\” redirectPort=\”8443\” />”
  27. echo $str1
  28. echo $str2
  29. echo $str3
  30. echo $str01
  31. echo $str02
  32. echo $str03
  33. #sed -i ‘s/原字符串/替换字符串/’
  34. sed -i “s#$str01#$str1#” $TFILE
  35. if [ $? -ne 0 ];then
  36. echo “修改1 失败!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”
  37. exit 1
  38. else
  39. echo “修改1 成功”
  40. fi
  41. sed -i “s#$str02#$str2#” $TFILE
  42. if [ $? -ne 0 ];then
  43. echo “修改2 失败!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”
  44. exit 1
  45. else
  46. echo “修改2 成功”
  47. fi
  48. sed -i “s#$str03#$str3#” $TFILE
  49. if [ $? -ne 0 ];then
  50. echo “修改3 失败!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!”
  51. exit 1
  52. else
  53. echo “修改3 成功”
  54. fi

运行如下:

%title插图%num

查看:

%title插图%num

sed -n ‘1p;4p;7p;9p’ file
awk ‘NR==1||NR==4||NR==7||NR==9’ file

修改Linux主机ssh远程默认端口号

众所周知,Linux主机ssh远程默认端口号22,没毛病

现在需求就是修改默认端口号,加固主机远程安全

就下面这条命令,搞定
vim /etc/ssh/sshd_config

%title插图%num

只需要在此修改就行了

Port 1234
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

修改以后,:wq 保存

然后重启sshd服务

systemctl restart sshd.service

然后测试连接

over

更多精彩,敬请期待!

注:
(*近这段时间有点忙,但是也要坚持输出丫)

快速修改Linux服务器远程端口方法

关于安全端口的一些说明,Linux远程端口默认22,很多破解机,等模拟猜测系统都是以默认端口22来模拟的 而22的端口是非常危险的,下面56云为大家带来的是修改Linux默认端口的方法!

*种:01假如要改LinuxSSH的默认端口(22),那么你只要修改:/etc/ssh/sshd_config中Port22,这里把22改成自己要设的端口就行了,不过千万别设和现已有的端口相同哦,以防造成未知后果。02假如要限制SSH登陆的IP,那么可以如下做:先:修改/etc/hosts.deny,在其中加入sshd:ALL然后:修改:/etc/hosts.allow,在其中进行如下设置:sshd:192.168.0.241这样就可以限制只有192.168.0.241的I

*种:
01假如要改Linux SSH的默认端口(22),那么你只要修改:/etc/ssh/sshd_config中Port 22,这里把22改成自己要设的端口就行了,不过千万别设和现已有的端口相同哦,以防造成未知后果。
02假如要限制SSH登陆的IP,那么可以如下做:
先:修改/etc/hosts.deny,在其中加入sshd:ALL
然后:修改:/etc/hosts.allow,在其中进行如下设置:sshd:192.168.0.241

这样就可以限制只有192.168.0.241的IP通过SSH登陆上LINUX机器了。当然在做为服务器方面,我都不装gnome和KDE的,而且很多东东都不装,这样增加安全系数。

第二种:
首先修改配置文件
vi /etc/ssh/sshd_config
找到#Port 22一段,这里是标识默认使用22端口,修改为如下:
Port 22
Port 50000
然后保存退出
执行/etc/init.d/sshd restart
这样SSH端口将同时工作与22和50000上。
现在编辑防火墙配置:vi /etc/sysconfig/iptables
启用50000端口。
执行/etc/init.d/iptables restart
现在请使用ssh工具连接50000端口,来测试是否成功。如果连接成功了,则再次编辑sshd_config的设置,将里边的Port22删除,即可。

之所以先设置成两个端口,测试成功后再关闭一个端口,是为了方式在修改conf的过程中,万一出现掉线、断网、误操作等未知情况时候,还能通过另外一个端口连接上去调试以免发生连接不上必须派人去机房,导致问题更加复杂麻烦。

修改服务器端口号

windows 2003远程终端服务基于默认端口3389。入侵者一般先扫描主机开放端口,一旦发现其开放了3389端口,就会进行下一步的入侵,所以我们只需要修改该务默认端口就可以避开大多数入侵者的耳目。

步骤:

一、打开“开始→运行”,输入“regedit”,打开注册表,进入以下路径:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp],看见PortNamber值了吗?其默认值是:0xd3d,这个是16进制,点击右边的十进制,显示的就是3389了,修改成所希望的端口即可,例如12351。

二、再打开[HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro1Set\Control\Tenninal Server\WinStations\RDP-Tcp],将PortNumber的值(也是3389)修改成端口12351。

三、注意:更改后注意开放防火墙12351端口,否则重起后连不上。记住,两个地方的端口号一定得一样才行,要不到时候连接不上 。

重启系统生效,下次连接时只要在你的远程桌面客户端登陆地址后面加冒号加端口号就OK了!

注意:如果设置的是十六进制的 登录时要把十六进制的转化为十进制的才可以。

查看远程端口开放状态

说到端口,这确实是个老话题,但一切都是从它开始的,不得不说。何谓端口,打个比方,你住在一座房子里,想让别人来拜访你,得在房子上开个大门,你养了个可爱的小猫,为了它的进出,专门给它修了个小门,为了到后花园,又开了个后门……所有这些为了进到这所房子里而开的门叫端口,这些为了别人进来而开的端口称它为“服务端口”。

你要拜访一个叫张三的人,张三家应该开了个允许你来的门–服务端口,否则将被拒之门外。去时,首先你在家开个“门”,然后通过这个“门”径直走进张三家的大门。为了访问别人而在自己的房子开的“门”,称为“客户端口”。它是随机开的而且是主动打开的,访问完就自行关闭了。它和服务端口性质是不一样的,服务端口是开了个门等着别人来访问,而客户端口是主动打开一个门去打开别人的门,这点一定要清楚。

下面从专业的角度再简单解释一下端口的概念。联网的计算机要能相互通信必须用同一种协议,协议就是计算机通信的语言,计算机之间必须说一种语言才能彼此通信,Internet的通用语言是TCP/TP,它是一组协议,它规定在网络的第四层运输层有两种协议TCP、UDP。端口就是这两个协议打开的,端口分为源端口和目的端口,源端口是本机打开的,目的端口是正在和本机通信的另一台计算机的端口,源端口分主动打开的客户端口和被动连接的服务端口两种。在Internet中,你访问一个网站时就是在本机开个端口去连网站服务器的一个端口,别人访问你时也是如此。也就是说计算机的通讯就像互相串门一样,从这个门走进哪个门。

当装好系统后默认就开了很多“服务端口”。如何知道自己的计算机系统开了那些端口呢?这就是下面要说的。

二)、查看端口的方法

1、命令方式

下面以Windows XP为例看看新安装的系统都开了那些端口,也就是说都预留了那些门,不借助任何工具来查看端口的命令是netstat,方法如下:

a、在“开始”的“运行”处键入cmd,回车

b、在dos命令界面,键入netstat -na,图2显示的就是打开的服务端口,其中Proto

代表协议,该图中可以看出有TCP和UDP两种协议。Local Address代表本机地址,该地址冒号后的数字就是开放的端口号。Foreign Address代表远程地址,如果和其它机器正在通信,显示的就是对方的地址,State代表状态,显示的LISTENING表示处于侦听状态,就是说该端口是开放的,等待连接,但还没有被连接。就像你房子的门已经敞开了,但此时还没有人进来。以*行为例看看它的意思。

TCP 0.0.0.0:135 0.0.0.0:0 LISTENING

这一行的意思是本机的135端口正在等待连接。注意:只有TCP协议的服务端口才能处于LISTENING状态。

图1 用netstat命令查看端口状态

2、用TCPView工具

为了更好的分析端口,*好用TCPView这个软件,该软件很小只有93KB,而且是个绿色软件,不用安装。

图3是TCPView的运行界面。*次显示时字体有些小,在“Options”->“Font”中将字号调大即可。TCPView显示的数据是动态的。图3中Local Address显示的就是本机开放的哪个端口(:号后面的数字),TCPView可以看出哪个端口是由哪个程序发起的。从图3可以看出445、139、1025、135、5000等端口是开放的,445、139等端口都是system发起的,135等都是SVCHOST发起的。

图2 用TCPView查看端口状态

三)、研究端口的目的

1、知道本机开了那些端口,也就是可以进入到本机的“门”有几个,都是谁开的?

2、目前本机的端口处于什么状态,是等待连接还是已经连接,如果是已经连接那就要特别注意看连接是个正常连接还是非正常连接(木马等)?

3、目前本机是不是正在和其它计算机交换数据,是正常的程序防问到一个正常网站还是访问到一个陷阱?

当你上网时就是本机和其它机器传递数据的过程,要传递数据必须要用到端口,即使是有些非常高明的木马利用正常的端口传送数据也不是了无痕迹的,数据在开始传输、正在传输和结束传输的不同阶段都有各自的状态,要想搞明白上述3个问题,就必须清楚端口的状态变化。下面结合实例先分析服务端口的状态变化。只有TCP协议才有状态,UDP协议是不可靠传输,是没有状态的。

四)、服务端口的状态变化

先在本机(IP地址为:192.168.1.10)配置FTP服务,然后在其它计算机(IP地址为:192.168.1.1)访问FTP服务,从TCPView看看端口的状态变化。

下面黑体字显示的是从TCPView中截取的部分。

1、LISTENING状态

FTP服务启动后首先处于侦听(LISTENING)状态。

State显示是LISTENING时表示处于侦听状态,就是说该端口是开放的,等待连接,但还没有被连接。就像你房子的门已经敞开的,但还没有人进来。

从TCPView可以看出本机开放FTP的情况。它的意思是:程序inetinfo.exe开放了21端口,FTP默认的端口为21,可见在本机开放了FTP服务。目前正处于侦听状态。

inetinfo.exe:1260 TCP 0.0.0.0:21 0.0.0.0:0 LISTENING

2、ESTABLISHED状态

现在从192.168.1.1这台计算机访问一下192.168.1.10的FTP服务。在本机的TCPView可以看出端口状态变为ESTABLISHED。

ESTABLISHED的意思是建立连接。表示两台机器正在通信。

下面显示的是本机的FTP服务正在被192.168.1.1这台计算机访问。

inetinfo.exe:1260 TCP 192.168.1.10:21 192.168.1.1:3009 ESTABLISHED

注意:处于ESTABLISHED状态的连接一定要格外注意,因为它也许不是个正常连接。后面要讲到这个问题。

3、 TIME_WAIT状态

现在从192.168.1.1这台计算机结束访问192.168.1.10的FTP服务。在本机的TCPView可以看出端口状态变为TIME_WAIT。

TIME_WAIT的意思是结束了这次连接。说明21端口曾经有过访问,但访问结束了。

[System Process]:0 TCP 192.168.1.10:21 192.168.1.1:3009 TIME_WAIT

4、小技巧

a、可以telnet一个开放的端口,来观察该端口的变化。比如看1025端口是开放的,在命令状态(如图1运行cmd)运行:

telnet 192.168.1.10 1025

b、从本机也可以测试,只不过显示的是本机连本机

c、在Tcpview中双击连接可看出程序的位置,右键点击该连接,选择End Process即可结束该连接

五)、客户端口的状态变化

客户端口实际上就是从本机访问其它计算机服务时打开的源端口,*多的应用是上网,下面就以访问baidu.com为例来看看端口开放以及状态的变化情况。

1、SYN_SENT状态

SYN_SENT状态表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为ESTABLISHED,此时SYN_SENT状态非常短暂。但如果发现SYN_SENT非常多且在向不同的机器发出,那你的机器可能中了冲击波或震荡波之类的病毒了。这类病毒为了感染别的计算机,它就要扫描别的计算机,在扫描的过程中对每个要扫描的计算机都要发出了同步请求,这也是出现许多SYN_SENT的原因。

下面显示的是本机连接baidu.com网站时的开始状态,如果你的网络正常的,那很快就变为ESTABLISHED的连接状态。

IEXPLORE.EXE:2928 TCP 192.168.1.10:1035 202.108.250.249:80 SYN_SENT

2、ESTABLISHED状态

下面显示的是本机正在访问baidu.com网站。如果你访问的网站有许多内容比如访问 www.yesky.com,那会发现一个地址有许多ESTABLISHED,这是正常的,网站中的每个内容比如图片、flash等都要单独建立一个连接。看ESTABLISHED状态时一定要注意是不是IEXPLORE.EXE程序(IE)发起的连接,如果是EXPLORE.EXE之类的程序发起的连接,那也许是你的计算机中了木马了。

IEXPLORE.EXE:3120 TCP 192.168.1.10:1045 202.108.250.249:80 ESTABLISHED

3、TIME_WAIT状态

如果浏览网页完毕,那就变为TIME_WAIT状态。

[System Process]:0 TCP 192.168.1.10:4259 202.108.250.249:80 TIME_WAIT

六)、端口详细变迁图

以上是*主要的几个状态,实际还有一些,图4是TCP的状态详细变迁图(从TCP/IP详解中剪来),用粗的实线箭头表示正常的客户端状态变迁,用粗的虚线箭头表示正常的服务器状态变迁。这些不在本文的讨论范围。有兴趣的朋友可以好好研究一下。

图3 TCP的状态变迁图

七)、要点

一般用户一定要熟悉(再啰嗦几句):

1、服务端口重点要看的是LISTENING状态和ESTABLISHED状态,LISTENING是本机开了哪些端口,ESTABLISHED是谁在访问你的机器,从哪个地址访问的。

2、客户端口的SYN_SENT状态和ESTABLISHED状态,SYN_SENT是本机向其它计算机发出的连接请求,一般这个状态存在的时间很短,但如果本机发出了很多SYN_SENT,那可能就是中毒了。看ESTABLISHED状态是要发现本机正在和哪个机器传送数据,主要看是不是一个正常程序发起的。

二、木马

什么是木马,简单的说就是在未经你许可偷偷在你的计算机中开个后门,木马开后门主要有两种方式。

1、有服务端口的木马

这类木马都要开个服务端口的后门,成功后该后门处于LISTENING状态,它的端口号可能固定一个数,也可能变化,还有的木马可以与正常的端口合用,例如你开着正常的80端口(WEB服务),木马也用80端口。这种木马*大的特点就是有端口处于LISTENING状态,需要远程计算机连接它。这种木马对一般用户比较好防范,将防火墙设为拒*从外到内的连接即可。比较难防范的是反弹型木马。

2、反弹型木马

反弹型木马是从内向外的连接,它可以有效的穿透防火墙,而且即使你使用的是内网IP,他一样也能访问你的计算机。这种木马的原理是服务端主动连接客户端(黑客)地址。木马的服务端软件就像你的Internet Explorer一样,使用动态分配端口去连接客户端的某一端口,通常是常用端口,像端口80。而且会使用隐避性较强的文件名,像iexpiore.exe、explorer(IE的程序是IEXPLORE.EXE)。如果你不仔细看,你可能会以为是你的Internet Explorer。这样你的防火墙也会被骗过。如果你在TcpView中看到下面这样的连接一定要注意,很有可能是种木马了。 iexpiore.exe 192.168.1.10(本机IP):1035(你的端口) Y.Y.Y.Y(远程IP):80(远程端口)

或 Rundll32.exe 192.168.1.10(本机IP):1035(你的端口) Y.Y.Y.Y(远程IP):80(远程端口)

或 explorer.exe 192.168.1.10(本机IP):1035(你的端口) Y.Y.Y.Y(远程IP):80(远程端口)

三、安全

分析端口的目的就是要保证上网安全,根据以上的思路可以从以下几个方面来防范。

一)、关闭不需要的端口

对一般上网用户来说只要能访问Internet就行了,并不需要别人来访问你,也就是说没有必要开放服务端口,在WIN 98可以做到不开放任何服务端口上网,但在Win XP、Win 2000、Win 2003下不行,但可以关闭不必要的端口。图3是安装完WIN XP系统默认开的端口,以此为例关闭不必要的端口。

1、关闭137、138、139、445端口

这几个端口都是为共享而开的,是NetBios协议的应用,一般上网用户是不需要别人来共享你的内容的,而且也是漏洞*多的端口。关闭的方法很多,*近从网上学了一招非常好用,一次全部关闭上述端口。

开始-> 控制面板-> 系统-> 硬件-> 设备管理器-> 查看-> 显示隐藏的设备-> 非即插即用驱动程序-> Netbios over Tcpip。

找到图5界面后禁用该设备重新启动后即可。

图4 关闭137、138、139、445端口

2、关闭123端口

有些蠕虫病毒可利用UDP 123端口,关闭的方法:如图6停止windows time服务。

图5 关闭123端口

3、关闭1900端口

攻击者只要向某个拥有多台Win XP系统的网络发送一个虚假的UDP包,就可能会造成这些Win XP主机对指定的主机进行攻击(DDoS)。另外如果向该系统1900端口发送一个UDP包,令”Location”域的地址指向另一系统的chargen端口,就有可能使系统陷入一个死循环,消耗掉系统的所有资源(需要安装硬件时需手动开启)。

关闭1900端口的方法如图7所示——停止SSDP Discovery Service 服务。

图6 关闭1900端口

通过上面的办法关闭了一些有漏洞的或不用的端口后是不是就没问题了呢?不是。因为有些端口是不能关掉的。像135端口,它是RPC服务打开的端口如果把这个服务停掉,那计算机就关机了,同样像Lsass打开的端口500和4500也不能关闭。冲击波病毒利用的就是135端口,对于不能关闭的端口*好的办法一是常打补丁,端口都是相应的服务打开的,但是对于一般用户很难判断这些服务到底有什么用途,也很难找到停止哪些服务就能关闭相应的端口。*好的办法就是下面要讲的安装防火墙。安装防火墙的作用通俗的说就像你不管住在一所结实的好房子里还是住在一所千疮百孔的破房子里,只要你在房子的四周建了一堵密不透风的墙,那对于墙里的房子就是安全的。

二)、安装防火墙

对于一般用户来讲有下面三类防火墙

1、 自带的防火墙

关于Win XP 与Win 2003自带防火墙的设置请参阅天*网中拙作,不再赘述。

2、ADSL猫防火墙

通过ADSL上网的,如果有条件*好将ADSL猫设置为地址转换方式(NAT),也就是大家常说的路由模式,其实路由与NAT是不一样的,权且这么叫吧。用NAT方式*大的好处是设置完毕后,ADSL猫就是一个放火墙,它一般只开放80、21、161等为了对ADSL猫进行设置开放的端口。如果不做端口映射的话,一般从远程是攻击不到ADSL猫后面的计算机的。ADSL猫*大的安全隐患就是很多用户都不改变默认密码。这样黑客如果进到你的猫做个端口映射就有可能进入到你的计算机,一定把默认密码改掉。

用自带的放火墙和ADSL猫的NAT方式基本可以抵御从外到内的攻击,也就是说即使服务端口开放(包括系统开放的端口和中了开个服务端口的木马),黑客和类似震荡波一类的病毒也奈何不了你的计算机。上述防火墙只能防止从外到内的连接,不能防止从内到外的连接,当你打开网页和用QQ聊天时就是从内到外的连接,反弹型木马就是利用放火墙的这一特性来盗取你机器的数据的。反弹型木马虽然十分隐蔽,但也不是没有马脚,防范这类木马*好的办法就是用第三方防火墙。

3、第三方防火墙

前面说过,反弹型木马而且会使用隐避性较强的文件名,像iexpiore.exe、explorer等与IE的程序IEXPLORE.EXE很想的名字或用一些rundll32之类的好像是系统文件的名字,但木马的本质就是要与远程的计算机通讯,只要通讯就会有连接。如下所示:正常连接是IEXPLORE.EXE发起的,而非正常连接是木马程序explorer发起的。

图7 正常连接

图8 木马连接

一般的防火墙都有应用程序访问网络的权限设置,如图8所示,在防火墙的这类选项中将不允许访问网络的应用程序选择X,即不允许访问网络。

在写这篇文章之前笔者中了一个反弹型木马,就是explorer程序向外连接,用了好几个查毒软件也没有杀掉,当时就先用天网放火墙阻止它访问网络,然后手工费了很大的劲才清除掉。可惜没有做截图。没有勇气为了写这篇文章再牺牲一把了。

4、用Tcpview结束一个连接

当你用Tcpview观察哪个连接有可能是不正常的连接,可在Tcpview中直接鼠标右键点击该连接,选择End Process即可结束该连接。

四、扫描

谈起扫描又是个大话题了,有端口扫描(Superscan)、漏洞扫描(X-scan)等,关于扫描的话题以后再论,本文只对一般用户简单说一下在线安全检测。如果你按上面的说得作了相应的安全措施,就可以在网上找个在线测试安全的网站测试一下你目前系统的安全情况,如到下面网站:

1、千禧在线–在线检测

2、蓝盾在线检测

3、天网安全在线

4、诺顿在线安全检测

说明一点,测试机器时开了21、23、80端口,但这都是ADSL的服务端口,MODEM没有提供修改和关闭的地方,不过没关系,只要把密码设的复杂点就行了。

五、震荡波

如果你按上述关闭了445端口或者开启了放火墙那就不会受到震荡波及类似的病毒骚扰了,关于震荡波病毒的文章太多了,此处就不多谈。只要做好了安全防护,不管是震荡大波还是冲击小波只能在你的计算机门前掠过而奈何不了你。

六、后记

关于计算机的安全还有很多要设置,但对于一般用户来说,太多的安全设置就等于没有了安全,因为即使对于专业从事计算机安全的人员对于安全的设置也不是件容易的事,何况对于对计算机的知识还不够的一般用户。如果要作很多设置才能保证安全,那肯定就有很多人不做了。对一般用户个人的建议是力所能及的事一定要做,比如:

1、上网时一定要安装防病毒软件并及时升级。

2、至少安装一个防火墙,ADSL用户*好用路由方式上网,改掉默认密码。

3、经常打补丁,Windows用户*好将系统设为自动升级。

4、自己要做的就是用Tcpview 常常看看连接,防止反弹型木马。常常看看,时间长了也许就看成专家了。

5、Udp协议是不可靠传输,没有状态,从Tcpview中很难看出它是不是在传输数据,感兴趣的朋友可以用iris、sniffer这类的协议分析工具看看是不是有Udp的数据。关于这个话题以后再聊。

6、本文题目起的很大,但写起来又觉得很多问题都是别人说了再说的,也就没有深谈。

道高一尺,魔高一丈。网络安全将是一个永恒的话题,没有*对的安全,但有了防范意识总比敞开了大门还不知道好吧。

2020年云计算会有哪些趋势 怎么掌握企业技术

随着互联网技术的革新以及国家政策对云计算的大力支持,我国进入云计算时代,企业上云的数量进一步增多,云计算人才也成为企业高薪招聘的对象。很多人想要加入云计算行业,那2020年云计算发展会出现哪些趋势呢?下面千锋小编整理相关资料给大家解答。

%title插图%num

1、支持开源。如果企业查看云计算领域的主要竞争对手,那么企业采用Amazon和Microsoft的云计算服务,那么也会采用谷歌云。他们将提供更好的服务,为客户而战,进而使其变得更容、更快捷。

2、多云:“多云”在过去的两年中获得了很多关注,但是很少有组织采用真正的多云策略。但到2020年,这种情况将会改变,因为越来越多的应用程序将分别部署在两个或更多的公共云中。这种真正的多云方法使组织能够更好地采用微服务,并使他们能够利用每个云平台中的独特功能来优化应用程序。

3、使用Kubernetes。Kubernetes*近超越Docker,成为*受关注的容器技术。将来,每种数据技术都将在Kubernetes上运行。人们可能不会在2020年实现这一目标,但随着越来越多的主要供应商在其旗舰平台上建立基础,Kubernetes将继续被采用。还有一些需要解决的问题,例如持久性存储问题,但目前正在通过BlueK8等举措来解决。

4、公共云的采用将增加,并使企业更容易利用其他新技术,因为它们可以通过以下方式更容易,更快,更经济地被采用云平台,而不是通过定制数据中心测试和实施人工智能、智联网等技术的公司。

5、中小企业将需要采用经常性收入业务模型,许多中小企业都不具备允许他们在云计算世界中把握收入的业务模型,因此要在2020年保持竞争力,他们需要采用基于经常性收入的业务模型。

了解云计算未来的发展趋势很重要,但更重要的是你需要掌握企业所需的技术、具备较多的实战经验。如果你想快速掌握企业所需的云计算技术,可以选择专业学习一下,让自己求职起点更高、就业速度更快!

云计算运维工程师怎样才能更好的进阶?

云计算的就业前途,某种意义上也可以理解为云计算为我们提供的服务,存在一定的必然性,也就是说云计算对于社会、云计算使用者有哪些优势,也同时可以理解为,云计算的优势就是云计算的就业优势。

关于“云计算”带给我们生活的改变已经深深植入到我们生活中的点点滴滴,每一天我们浏览的手机APP或着网站,基本都已经离不开“云计算”作为背后的强大服务支持,像很多购物网站和社交软件一样,改变着我们的生活。这种改变不仅仅改变的是平常百姓生活,越来越多的企业开始使用基于云的企业服务,生活因“云计算”正在发生着革命性的变革和改变!

运维linux工程师如何更好的进阶,依我看来有两个维度的进阶方向:

其一:就是说linux的技能进阶,在本职工作的基础之上,强化自己的技能属性,做到一种精益求精的效果

就拿看书来举例,我们常说:“先把书读厚,再把书读薄”

工作也是同样的道理,把本职工作从平凡做到非凡,从而达到技能进阶的目的。

就好比我们学习Linux,*初接触的应该就是命令了,随着时间的推移我们会慢慢展开学习命令里面的基础操作代码,*后通过对代码的不同属性和结构搭配组织整理,从而实现不同的操作效果。

其二:就是说linux运维方向的决策

再好的运维工程师做到头也只是一个运维工程师

*后就是深入,基本的服务的搭建和配置,例如Apache,nginx,bind,DHCP FTP等,还有shell脚本一定要会,有能力一定要学Python,进阶,一些集群的搭建,负载均衡,高可用,数据库,常见的自动化运维工具和监控的使用等,集群高可用比如lvs,keepalived,heartbeat,brdb,memcached,然后MySQL数据库一定要会,常见的MySQL集群什么的也要会,自动化运维工具有:puppet,ansible,saltstack,监控工具有:zabbix,nagios。
————————————————