• AndroidStudio


    Google官方的Android集成开发环境(IDE = Integrated Development Environment),Eclipse + Adt插件的代替者。

    实用设置:

    android studio是单工程的开发模式 android studio中的application相当于eclipse里的workspace概念 android studio中的module相当于eclipse里的project概念

    中文乱码—–在窗口中,找到IDE Settings->Appearance,在右侧勾选上“Override default fonts by”,然后在第一个下拉框中选择字体为“simsun”,然后apply,重启IDE,就好了。

    设置快捷键—–在settings窗口中,找到IDE Settings->keymap,右侧打开的就是快捷键了。右键单击要修改的快捷键,会弹出一个菜单,选择“Add keyboard shortcut”就可以修改快捷键了。删除的话,在弹出的菜单中选择remove XXX即可。特别说明,在AS的快捷键设置里可以直接设置使用Eclipse快捷键还是别的IDE快捷键。如果你热衷Eclipse那么也可设置成Eclipse的快捷键。

    修改主题—–在IDE Settings->Appearance,右侧的Theme选择自己喜欢的主题即可。个人比较喜欢Darcula主题,也就是如上截图样式。

    如何将Eclipse工程导入AS使用—–选择File->Import Project,在弹出的菜单中选择要导入的工程即可,选择好以后就直接next,在第二个窗口中也选择默认的第一个选项就可以。需要注意的是,在AS中,有两种工程,一个是Project,一个是Module,上面已经细说过了。

    导入jar包—–选择File->Projcet Structure,在弹出的窗口中左侧找到Libraries并选中,然后点击“+”,并选择Java就能导入Jar包了。或者直接拷贝jar文件到项目的libs文件夹下,然后运行:Sync Project with Gradle Files。然后clean project重新编译。

    删除项目—–AS对工程删除做了保护机制,默认你在项目右键发现没有删除选项。你会发现你的module上面会有一个小手机,这是保护机制。删除的第一步就是去掉保护机制,也就是让手机不见,具体做法就是鼠标放在工程上右键->open module setting,或者F4进入如图界面,选中你要删除的module,然后点击减号,这样就取消了保护机制,然后回到项目工程右键就可发现删除选项。注意:删除会将源文件删除。

    Android Studio目录结构

    新建工程项目后AS的Product目录结构如下所示:

    .idea://AS生成的工程配置文件,类似Eclipse的project.properties。
    app://AS创建工程中的一个Module。
    gradle://构建工具系统的jar和wrapper等,jar告诉了AS如何与系统安装的gradle构建联系。
    External Libraries://不是一个文件夹,只是依赖lib文件,如SDK等。
    

    新建工程项目后AS的Module目录结构如下所示:

    build://构建目录,相当于Eclipse中默认Java工程的bin目录,鼠标放在上面右键Show in Exploer即可打开文件夹,
        编译生成的apk也在这个目录的outs子目录,不过在AS的工程里是默认不显示out目录的,就算有编译结果也
        不显示,右键打开通过文件夹直接可以看。
    libs://依赖包,包含jar包和jni等包。
    src://源码,相当于eclipse的工程。
    main://主文件夹 
        java://Java代码,包含工程和新建是默认产生的Test工程源码。 
        res://资源文件,类似Eclipse。
            layout://App布局及界面元素配置,雷同Eclipse。
            menu://App菜单配置,雷同Eclipse。 
            values://雷同Eclipse。
                dimens.xml://定义css的配置文件。 
                strings.xml://定义字符串的配置文件。 
                styles.xml://定义style的配置文件。
                ......://arrays等其他文件。
            ......://assets等目录
        AndroidManifest.xml://App基本信息(Android管理文件) 
        ic_launcher-web.png://App图标 
    build.gradle://Module的Gradle构建脚本

    对比

    对比项Eclipse + ADTAndroid Studio
    基于 IBM公司的Eclipse JetBrains公司的 IDEA 社区版
    运行速度
    程序界面 漂亮
    编码速度 快(更智能的提示)
    插件 安装繁琐 安装简单,自带很多插件
    版本控制 需额外安装
    内存占用
    编译 ANT gradle
    依赖网络
    其他   内置终端; UI编辑支持多屏预览;多APK打包

    界面

    • 整体
    • 菜单 -File
    • 菜单 - Build

    • 快捷工具

    • Project视窗

    -Structure视窗

    • 代码编辑区域



    • 代码编辑- 布局文件的多屏预览

    • Android 监控

    • Message


    Gradle相关

    概念

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。

    https://zh.wikipedia.org/zh/Gradle

    编译过程

    http://developer.android.com/tools/building/index.html

    Gradle相关文件

    • 重要

    project 中的 settings.gradle 说明

    1. // 这个Project中有2个Module
    2. include ':app', ':percent-23.1.0'

    project 中的build.gradle说明

    1. // 构建脚本
    2. buildscript {
    3. // 仓库
    4. repositories {
    5. // 中央仓库 https://bintray.com/bintray/jcenter
    6. // 通过jar包的字符串包名,就可以下载到jar包了
    7. // 成熟的公司可能会有自己的仓库服务器,需要在此配置
    8. jcenter()
    9. }
    10. dependencies {
    11. // android gradle构建工具,用于处理module下的build.gradle文件,此版本与Gradle版本有配套关系,目前gradle已经到2.8了,但主要使用的是2.4
    12. classpath 'com.android.tools.build:gradle:1.3.0'
    13. // NOTE: Do not place your application dependencies here; they belong
    14. // in the individual module build.gradle files
    15. }
    16. }
    17. // 所有项目都依赖于jcenter
    18. allprojects {
    19. repositories {
    20. jcenter()
    21. }
    22. }
    23. // gradle在执行构建任务时的清理配置
    24. task clean(type: Delete) {
    25. delete rootProject.buildDir
    26. }

    module中的build.gradle详细说明

    1. // 表示这个项目编译完成后,是一个anrdoid应用程序
    2. apply plugin: 'com.android.application'
    3. // 表示这个项目编译完成后,是一个anrdoid的库
    4. //apply plugin: 'com.android.library'
    5. android {
    6. // 编译的sdk版本,见sdkplatforms
    7. compileSdkVersion 23
    8. // 构建工具的版本,见sdkuild-tools
    9. buildToolsVersion "23.0.1"
    10. defaultConfig {
    11. // 包名:用于在市场上区分应用的唯一性的标示
    12. applicationId "cn.itcast.as.helloworld"
    13. // 最小sdk版本、目标sdk版,原先是放在清单文件中的
    14. minSdkVersion 15
    15. targetSdkVersion 23
    16. // 应用程序的版本号,和版本码,原先是放在清单文件中的
    17. versionCode 1
    18. versionName "1.0"
    19. }
    20. // 构建类型
    21. buildTypes {
    22. // debug版默认有配置,没有写在这里
    23. // 发行版
    24. release {
    25. // 是否混淆
    26. minifyEnabled false
    27. // 混淆配置文件
    28. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    29. }
    30. }
    31. }
    32. // 关键:项目的依赖
    33. dependencies {
    34. // 在项目中的libs中的所有的.jar结尾的文件,都是依赖
    35. compile fileTree(dir: 'libs', include: ['*.jar'])
    36. // 依赖于junit测试
    37. testCompile 'junit:junit:4.12'
    38. // 还依赖于appcompat-v7,23.1.0版本
    39. compile 'com.android.support:appcompat-v7:23.1.0'
    40. }
    • 其他
    所属文件类型作用
    Project .gradle 文件夹 配置文件,无需更改、关注
    Project gradle 文件夹 包含了gradle-wrapper相关文件,无需更改、关注
    Project gradle.properties 文件 gradle启动的配置,如java虚拟机的内存占用等,一般无需修改
    Project gradlew/gradlew.bat 文件 初始化gradle相关变量的脚本

    文件和文件夹说明

    • Project根目录
    文件/文件夹说明
    .idea/ IDE的Project相关设置
    app/ 默认建立的module目录
    build/ 打包的临时目录
    gradle/ gradle的相关目录
    .gradle/ gradle的相关目录
    .gitignore git同步时的忽略的文件
    builder.gradle Project的gradle依赖
    gradle.properties project的gradle配置
    gradlew 执行gradle构建的脚本(un*x)
    gradlew.bat 执行gradle构建的脚本(windows)
    local.properties SDK目录设置
    Project.iml 存放module信息
    settings.gradle Project下有哪些Module
    • module目录
    文件/文件夹说明
    build/ 编译的中间数据、最终apk存放目录
    build/source/r/debug/R.java R文件
    build/outputs/apk/ APK文件默认位置
    libs/ 导入的jar包存放的位置
    src/ 源码(java、xml、..)
    src/androidTest/ 测试代码存放位置
    src/main/java/your/package/name java代码
    src/main/jniLibs/ 动态连接库所在目录
    src/main/assets/ 资产文件存放目录
    src/main/res/ 资源目录
    src/AndroidManifest.xml 清单文件
    src/main/res/mipmap/ 一般放置应用图标
    app.iml 存放module信息(由AS创建)
    build.gradle gradle的构建文件
    proguard-rules.pro 混淆设置

    设置

    • 文件编码
    • 程序外观
    • 编辑区域外观

    • logcat外观

    快捷键

    视窗快捷键

    代码补全

    快捷键方案修改 && 编辑快捷键

     

    活动模板

    后缀补全

    乱码问题

    1. tasks.withType(Compile) {  
    2.     options.encoding = "UTF-8"  
    3. }

    dub常用快捷键

    动作按键
    删除行 Ctrl + Y
    复制一行 Ctrl + D
    上下移动代码 Alt + Shift + Up/Down
    格式化代码 Ctrl + Alt + L
    优化导导包 Alt + Ctrl + O
    大小写转换 Ctrl + Shift + U
    打开文件 两次shift
    注释代码(//) Ctrl + /
    注释代码(/**/) Ctrl + Shift + /
    生成代码 Alt + Insert
    快速定位错误 F2
    查找 Ctrl + F
    查看继承关系 Ctrl + H
    查找+替换 Ctrl + R
    快捷覆写方法 Ctrl + O

    序号

    功能

    Eclipse快捷键

    Android Studio

    快捷键

     

    快速修复

    (实现接口方法、强制类型转换、导包)

    Ctrl + 1

    Alt + Enter

     

    删除光标所在行(选中行)

    Ctrl + D

    Ctrl + Y

    Ctrl + X

     

    复制光标所在的行(选中行)

    Ctrl + Alt + Up/Down

    Ctrl + D

     

    格式化代码(java、xml)

    Ctrl + Shift + F

    Ctrl + Alt + L

     

    快速创建局部变量

    Ctrl + 2,L

    Ctrl + Alt + V

     

    局部变量变为成员变量

    Ctrl + 1

    Ctrl + Alt + F

    或者

    alt+enter 选择

     

    上下移动选中的行

    Alt + Up/Down

    Ctrl + Shift + Up / Down

     

    重命名

    Ctrl + Shift + R

    Shift + F6

     

    方法参数提示

    Alt + /

    Ctrl + P

     

    打印输出

    syso

    sout

     

    快速重写方法

     

    Ctrl + O输入方法名上下方向键选择后回车

     

    快速定位到任意的文件

     

    按两次shift

     

    快速定位到某一个类或文件

     

    Ctrl + N:查找类

    Ctrl + Shift + N:查找文件

     

    显示类结构窗口(Outline

     

    Alt + 7

     

    快速定位到类中的方法或属性

    Ctrl + O

    Ctrl + F12

     

    快速查看类继承结构

    Ctrl + T

    Ctrl + H

     

    快速查看方法在哪里被调用

     

    Ctrl + Alt + H

     

    快速定位到当前类报错或警告的地方

     

    F2 或Shift+F2

     

    快速定位到类或方法的定义

     

    Ctrl+B

     

    代码助手,自动补全

    Alt + /

    Ctrl + Alt +空格:属性名、类名或接口名提示

    Ctrl + Shift +空格:

    方法提示

     

    窗口最大化

    ctrl + M

    Ctrl +Shift + F12

     

    快速选中字符串

    双击

    Ctrl + W

     

    最近编辑的文件列表

     

    Ctrl + E

     

    搜索或替换

    Ctrl + F

    Ctrl + F

    Ctrl + R

     

    全局搜索或全局替换

    Ctrl + H --> File Search

    Ctrl + Shift + F

    在选中的文件目录里搜索

    Ctrl + Shift + R

    在选中的文件目录里替换

     

    导入包

    Ctrl + Shift + O

    (导包并自动清除没有用到的包)

    Alt+回车:导入当前包

    Ctrl + Alt + O:删除没用到的包。

    也可设置自动导包,勾选:

    Add unambiguous imports on the fly

     

    选中变量快速跳转到下一个

    Ctrl + K

    Alt + F3, F3

     

    光标所在上一个

    或下一个的位置

    Alt + Left / Right

    Ctrl + Alt + Left / Right

     

    显示JavaDoc(注释文档)

     

    Ctrl + Q

     

    生成 get/set方法、构造方法、toString()

     

    alt + insert

     

    撤销

    Ctrl + Z

    Ctrl+Z

     

    恢复

    Ctrl + Y

    Ctrl+Shift+Z

     

    注释

    Ctr + / 单行

    Ctrl + Shift + / 多行

    同左

     

    回车换行

    (光标定位到下一行)

    Shift + Enter

    同左

     

    回车换行

    (光标定位到上一行)

    Ctrl + Shift + Enter

    Ctrl + Alt + Enter

     

    复制文件名

    选中文件后Ctrl + C

    同左

     

    复制类的全局路径

    (包名加类名)

    右击-->

    Copy Qualified Name

    Ctrl + Shift + Alt + C

    (右击--> Copy Reference)

     

    大写/小写

    Ctrl + Shift + X

    Ctrl + Shift + Y

    Ctrl + Shift + U

     

    回到上一次编辑的位置

    Ctrl + Q

    Ctrl + Shift + Backspace

     

    视图显示与隐藏

     

    Alt + 数字

     

    关闭文件

     

    Shift + 点击

     

     

      自动修正
    Command + N 自动生成代码(Getter Setter)
    Command + Alt + L 格式化代码
    Contral + Shift + F 格式化代码(定制)
    Command + Alt + T 把选中的代码放在 try{} 、if{} 、 else{} 里
    Command + / 注释 //
    Command + Shift + / 注释 /* */
    Command + Shift + Up/Down 语句上下移动
    Option + Shift + Up/Down 内容上下移动
    Option + Command + M 将选中代码块封装成一个方法
    Command + D 复制当前一行(或选择区域),并粘贴到下面
    Command + Z 后退
    Command + Shift + Z 前进
    Control + Alt + O 优化导入的包
    Ctrl(Command)+ - / + 折叠/展开代码
    Ctrl(Command)+Shift+ - / + 折叠/展开全部代码
    Ctrl(Command)+Shift+. 折叠/展开当前花括号中的代码
    Command + Y 快速查看代码实现
    Contral + H 查看继承关系
    Contral + Alt + H 查看调用关系
    Command + [ 返回上一次查看的位置
    Command + ] 前进到返回之前查看的位置
    Command + J 自动生成代码
    Command + E 查看最近打开的文件

    http://www.cnblogs.com/dubo-/

    建议调整的快捷键:

    (1)删除: ctrl + y,一只手能轻易的按下这两个键吗?建议修改为eclipse的ctrl+D

    (2)复制选中的多行:

    默认居然没有快捷键,可以在keymap中的duplicute lines设置为eclipse的ctrl + alt + 向上


    调试

    进入调试的两种方式

    • 以调试模式运行

    • 运行后调试

      需要注意 运行的程序的代码应该与所看到的是同一份,不然点击提示会错位

    如何打断点

    • 代码左侧单击

    • 代码左侧单击时按着shift键

    断点类型

    断点类型什么时候会停下来注意
    行断点 执行到此行
    成员变量断点 被赋值 或 访问 art虚拟机提供,需安卓5以上设备才有此功能
    方法断点 进入方法或退出方法 会影响代码执行的效率,慎用
    异常断点 出现了未捕获异常 及 捕获的异常 默认不开启

    导入module

    导入Eclipse项目

    File –> New –> Import Module

    导入AndroidStudio项目

    File –> New –> Import Module

    导入AAR

    File –> New –>New Module –> Import .jar/.aar package

    删除导入的Module

    当文件夹上显示了手机或柱状图 图标,说明此文件夹是受保护的,无法被删除

    1. 取消保护

    打开Project Struecture。 选中要删除的module,点上面的减号。 然后点确定

    1. 删除文件

    在原来是module的文件夹上点击鼠标右键,选中delete,在弹出的对话框上点确定。


    导入依赖

    导入Library


    导入文件jar包

    导入Module依赖

    对应关系


    插件管理

    安装插件的两种方式

    • 本地安装
    • 网络安装

    ButterKnife Zelezny的使用

    打包APK


    混淆

    作用及意义

    • 减小apk大小,删除无用的类和方法
    • 避免被反编译后重要的程序逻辑暴露

    配置

    app/build.gradle

    1. buildTypes {
    2. release {
    3. // false ,关闭混淆
    4. // true , 开启混淆
    5. minifyEnabled false
    6. // proguard-android.txt 是通用的混淆配置文件,放在sdk中 (sdk oolsproguard)
    7. // proguard-rules.pro 是项目都有的混淆配置文件 ,在项目的根目录中
    8. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    9. }
    10. }

    通用混淆文件说明

    1. # 以#开头的都是注释,下同
    2. # This is a configuration file for ProGuard.
    3. # http://proguard.sourceforge.net/index.html#manual/usage.html
    4. # 不使用大小写混合的类名
    5. # 比如说 a.java A.java。因为在windows下文件名是不区分大小写的,会导致文件的覆盖
    6. -dontusemixedcaseclassnames
    7. # 混淆第三方jar
    8. -dontskipnonpubliclibraryclasses
    9. # 打印更多日志
    10. -verbose
    11. # Optimization is turned off by default. Dex does not like code run
    12. # through the ProGuard optimize and preverify steps (and performs some
    13. # of these optimizations on its own).
    14. # 不做做优化(有时会弄巧成拙)
    15. -dontoptimize
    16. # 不做预校验
    17. -dontpreverify
    18. # Note that if you want to enable optimization, you cannot just
    19. # include optimization flags in your own project configuration file;
    20. # instead you will need to point to the
    21. # "proguard-android-optimize.txt" file instead of this one from your
    22. # project.properties file.
    23. # 保留注解上的属性
    24. -keepattributes *Annotation*
    25. # 保留此类(com.google.vending.licensing.ILicensingService)不被混淆,google需要用到
    26. -keep public class com.google.vending.licensing.ILicensingService
    27. # 保留此类( com.android.vending.licensing.ILicensingService)不被混淆,google需要用到
    28. -keep public class com.android.vending.licensing.ILicensingService
    29. # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
    30. # 保持 native 方法不被混淆,混淆后不能正确调用底层方法了
    31. -keepclasseswithmembernames class * {
    32. native <methods>;
    33. }
    34. # keep setters in Views so that animations can still work.
    35. # see http://proguard.sourceforge.net/manual/examples.html#beans
    36. # 保留任何直接或间接继承与View的类的setget开头的方法,不被混淆
    37. -keepclassmembers public class * extends android.view.View {
    38. void set*(***);
    39. *** get*();
    40. }
    41. # We want to keep methods in Activity that could be used in the XML attribute onClick
    42. # 保留直接或间接继承于Activity的类的 点击事件方法不被混淆,因为混淆后布局文件写的点击事件方法就会找不到
    43. -keepclassmembers class * extends android.app.Activity {
    44. public void *(android.view.View);
    45. }
    46. # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
    47. # 保留枚举类的如下 values valueOf方法
    48. -keepclassmembers enum * {
    49. public static **[] values();
    50. public static ** valueOf(java.lang.String);
    51. }
    52. # 保留实现了Parcelable 接口的类的静态CREATOR常量
    53. -keepclassmembers class * implements android.os.Parcelable {
    54. public static final android.os.Parcelable$Creator CREATOR;
    55. }
    56. # 保留R.java中的及内部类的的所有静态字段
    57. -keepclassmembers class **.R$* {
    58. public static <fields>;
    59. }
    60. # The support library contains references to newer platform versions.
    61. # Don't warn about those in case this app is linking against an older
    62. # platform version. We know about them, and they are safe.
    63. # 告诉ProGuard不要警告找不到android.support开头的包名.
    64. -dontwarn android.support.**

    项目特有的常用的混淆语法

    • 特定的类不被混淆
      -keep class package.name.Klass {*;}
    • 某个包下的类不被混淆
      -keep class package.name.** {*;}
    • 继承与某类的类不被混淆
      -keep class * extends java.lang.annotation.Annotation { *; }

    使用第三方jar包在混淆后出错

    一般,都可以在网站上找到相应的混淆配置

    比如


    多APK打包

    意义

    • 国内现状: 多个电子市场可提供apk的下载,用于统计市场的作用
    • 同一个应用程序,给不同的客户,需要连接不同的服务器

    步骤

    1 在清单文件中添加metadata

    1. <application
    2. ...... >
    3. <!-- market 表示键 ${MARKET}表示值 ,用${}表示会变......-->
    4. <meta-data android:name="market" android:value="${MARKET}"/>
    5. <!-- ......-->
    6. </application>

    2 在程序中获得metadata并使用

    1. //TODO 从sp中获取是否是第一运行
    2. boolean isFirstRun= true;
    3. if(isFirstRun){
    4. // 通过PackageManager拿到在清单文件中记录的metadata信息
    5. PackageManager packageManager = getPackageManager();
    6. String packageName = getPackageName();
    7. int flag = PackageManager.GET_META_DATA;
    8. // 表示我们获取当前应用程序的application下的metadata数据
    9. ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, flag);
    10. // 传入键名,拿到键值
    11. String market = applicationInfo.metaData.getString("market");
    12. //TODO 获取imei
    13. String imei = "123456";
    14. // TODO 自己实现代码
    15. sentToServer(market, imei);
    16. //TODO 写入sp,下次启动程序就不发送了
    17. }

    3 添加flavor动态修改metadata

    1. android{
    2. //......
    3. productFlavors {
    4. _360 {
    5. manifestPlaceholders = [MARKET: "_360"]
    6. }
    7. wandoujia {
    8. manifestPlaceholders = [MARKET: "wandoujia"]
    9. }
    10. anzhi {
    11. manifestPlaceholders = [MARKET: "anzhi"]
    12. }
    13. }
    14. }

    版本控制

    SVN环境

    • 安装TortoiseSVN

      !!! 注意勾选 command line client tools

    • 在as中,设置svn的命令行工具

      settings –> Version Control –> Subversion –>General –> use command line client
      选中TortoiseSVN的安装目录中的bin文件夹中的svn.exe

    上传本地代码

    • 设置同步
      settings –> Version Control
      把project后面加上版本控制的类型

    • 设置忽略文件
      settings –> Version Control –> Ignored Files
      3种方式:特定文件、指定目录下的文件、特定规则文件

    • 提交目录

      project 右键 –> Subversion –> share directory
      这一步只提交了目录,文件并没有上传到服务器

    • 上传文件

      project 右键 –> Subversion –> submit directory

    下载服务器的代码

    在Welcome to Android Studio界面,点击第三个Check out project from Version Control

    提交代码,编辑冲突

    project 右键 –> Subversion –> submit directory

    好习惯:先update,再submit

    • 冲突的解决
      3种 接受服务器的,接受自己的,合并

    英文含义
    Accept Theirs 用服务器的覆盖本地的
    Accept Youts 用本地的覆盖服务器的
    Merge 查看服务器和本地的,最终决定提交的内容

    !!! 注意,在合并后,还需要submit

    断开连接

    • 断开连接
      1. 先删除配置
        在settings –> version control -掉同步文件夹

    2. 再删除文件
     删除.svn文件夹
    

    • 忘记记录的用户名和密码

    settings –> version control –> subversion –>clear auth cache

    http://www.cnblogs.com/dubo-/

  • 相关阅读:
    java 多线程2
    java 多线程1
    java Object
    java 模板
    03015_JSTL技术
    运维人员常用的Linux命令总结
    oracle的userenv和nls_lang详解
    Oracle字符集检查和修改
    sql语句中(+)的作用
    Oracle事务Transaction
  • 原文地址:https://www.cnblogs.com/dubo-/p/5571515.html
Copyright © 2020-2023  润新知