AndroidStudio操作笔记--简单介绍1

1.AndroidStudio环境搭建与配置
2.创建Project、Library
3.快捷键介绍
4.Gradle简单介绍
5.如何生成导出jar包
6.如何导入外部jar包
7.如何导入外部aar包
8.如何生成签名Apk文件
9.如何进行文件混淆
10.如何使用SVN
11.如何避免多包冲突
12.如何从Eclipse转化成AS项目
13.如何设置包自动导入
14.android6.0如何使用Httpclient

1.AndroidStudio环境搭建与配置


The Android Gradle Plugin and Gradle
 Android Gradle Plugin Requires Gradle
 1.0.0 - 1.1.3  2.2.1 - 2.3
 1.2.0 - 1.3.1  2.2.1 - 2.9
 1.5.0  2.2.1 - 2.+
 2.0.0  2.10 - 2.+

2.创建Project、Library
Project类型的build.gradle
	apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
applicationId "com.test.testapp"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        360{
        }
    }
    dexOptions {
        incremental true
    }
}
Library类型的build.gradle
apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

3.快捷键介绍
提示
Ctrl+P 方法参数提示
Ctrl+空格 代码提示 
Ctrl+Shift+Space 在很多时候都能够给出Smart提示  
Ctrl+Alt+Space 类名或接口名提示

查看
Alt+1 快速打开或隐藏工程面板
Ctrl+H 查看类结构图
Ctrl+F12 查看当前文件的结构
Ctrl+Q 查看注释文档
Ctrl+P 查看参数信息
Alt+Q 查看当前方法的声明
Ctrl+Q 查看JavaDoc  
Ctrl+W 选中单词继而语句继而行继而函数

查找
Alt + F1 查找代码所在位置
Ctrl + F7 查找当前元素在当前文件中的引用,然后按F3可以选择
Alt + F3 快速查找
Ctrl + Shift + F7 可以高亮当前元素在当前文件中的使用
Ctrl + Shift+N 查找文件
Ctrl + Shift+Alt+N 查找类中的方法或变量
Ctrl + B 查找打开光标处的类或方法 
Ctrl + N 快速查找类
Ctrl + F 查找文本
Alt+F1 可以将正在编辑的元素在各个面板中定位 
Ctrl+Shift+Alt+N 可以快速打开符号 快速打开类/文件/符号时,可以使用通配符,也可以使用缩写
Ctrl+Alt+Up /Ctrl+Alt+Down 可以快速跳转搜索结果

修复
Shift+F6 重构-重命名
Ctrl+X 删除行   
Ctrl+D 复制行
Ctrl+/ 或 Ctrl+Shift+/  注释(// 或者/*...*/ )
Alt+Insert 可以生成构造器/Getter/Setter等  
Ctrl+Alt+L 格式化代码 
Ctrl+R 替换文本
Alt+Enter 导入包,自动修正
Ctrl+Alt+O 优化导入的类和包
Ctrl+J 自动代码
Ctrl+Shift+Space 自动补全代码 
Ctrl+Alt+Space 类名自动完成
Ctrl+Shift+Insert 可以选择剪贴板内容并插入
Ctrl+Shift+J 可以整合两行
Ctrl+Alt+T 可以把代码包在一块内,例如try/catch  
Ctrl+Alt+V 可以引入变量。例如把括号内的SQL赋成一个变量
Alt+F8 计算变量值   
Ctrl+O 可以选择父类的方法进行重写

最近相关
Ctrl+E 最近打开的文件 ----------
Ctrl+Shift+Backspace 可以跳转到上次编辑的地方
Ctrl+Alt+ left/right 返回至上次浏览的位置 
Ctrl+E或者Alt+Shift+C   最近更改的代码 
Alt+Shift+C 对比最近修改的代码 

移动
Ctrl+Shift+Up/Down 代码向上/下移动。 ---------------
F2 或Shift+F2 高亮错误或警告快速定位 ------------
Ctrl+Up/Down 光标跳转到第一行或最后一行下
Ctrl+[或] 可以跳到大括号的开头结尾
Ctrl+Shift+up/down 移动方法
Ctrl+P 方法参数提示
Ctrl+空格 代码提示 
Ctrl+Shift+Space 在很多时候都能够给出Smart提示  

Ctrl+Alt+Space 类名或接口名提示

        双击Shift,弹出搜索框。
        
        通过鼠标缩放字体大小
        
        
4.Gradle简单介绍

    http://segmentfault.com/a/1190000002439306
    如何配置离线Gradle?
1. GRADLE_HOME

2.PATH


apply plugin: 'com.android.application'

repositories {
    jcenter()
}

android {
    compileSdkVersion 19
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.aiscot.gradle.test"
        minSdkVersion 9
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"

        // 修改dex 65536的限制
        multiDexEnabled true
        // AndroidManifest.xml文件中UMENG_CHANNEL的value为${UMENG_CHANNEL_VALUE}
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "channel_name"]
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    // 签名文件
    signingConfigs {
        debug {
            // debug签名
            storeFile file("/path/xx-debug.jks")
            storePassword "密码"
            keyAlias "别名"
            keyPassword "签名密钥的密码"
        }
        release {
            // relase签名
            storeFile file("/path/xx-release.jks")
            storePassword "密码"
            keyAlias "别名"
            keyPassword "签名密钥的密码"
        }
    }

    // 构建类型
    buildTypes {
        debug {
            // debug模式下,显示log
            buildConfigField("boolean", "LOG_DEBUG", "true")

            // 版本名前缀
            versionNameSuffix "-debug"
            // 不开启混淆
            minifyEnabled false
            // 不开启ZipAlign优化
            zipAlignEnabled false
            // 不移除无用的resource文件
            shrinkResources false
            // 使用debug签名
            signingConfig signingConfigs.debug

        }
        release {
            // release模式下,不显示log
            buildConfigField("boolean", "LOG_DEBUG", "false")

            // 版本名前缀
            versionNameSuffix "-relase"
            // 开启混淆
            minifyEnabled true
            // 开启ZipAlign优化
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            // 使用release签名
            signingConfig signingConfigs.release
            // 混淆文件位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    // 渠道Flavors,配置不同的渠道
    productFlavors {
        GooglePaly {}
        xiaomi {}
        umeng {}
        _360 {}
        wandoujia {}
        yingyongbao {}
        whatever {}
    }

    // 批量配置渠道
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

    applicationVariants.all {
        variant ->
            variant.outputs.each {
                output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
            }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
}

重点需要讲解的地方:

  1. signingConfigs中的debug签名和release签名,都可以写绝对路径,当然,也可以通过指定形如debug{storeFile file("xx-debug.jks")}这样儿的配置,只不过需要注意,如果使用这样儿的方式,签名文件需要放在项目中

  2. UMeng官方的多渠道打包集成文档中指定,如果使用Gradle打包的方式的话,需要在build.gradle文件中的dependencies中添加如下的依赖:

    dependencies {
        compile 'com.umeng.analytics:analytics:latest.integration'
    }
常用Gradle命令:
gradlew -v       查看命令
gradlew clean   执行这个命令会去下载Gradle的一些依赖,下载成功并编译通过时会看到如下信息:
gradlew build  这个命令会直接编译并生成相应的apk文件,如果看到如下字样就代表build成功
gradlew assembleDebug 编译并打Debug
gradlew assembleRelease 编译并打Release的包
gradlew代表 gradle wrapper,意思是gradle的一层包装,大家可以理解为在这个项目本地就封装了gradle,即gradle wrapper

5.如何生成导出jar包

        在build.gradle中添加下面的代码

task deleteOldJar( type :Delete){
    delete 'release/mylib.jar'
}
task exportJar(type:Copy){
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    rename('classes.jar','mylib.jar')
}
exportJar.dependsOn(deleteOldJar,build)
然后打开Gradle Projects


双击exportJar任务去执行该任务,就可以在build/relase/目录下看到生成的jar文件了。


6.如何导入外部jar包

第一步:复制你需要添加的jar,并将其黏贴到app— —src— —main— —libs文件夹下,可运行的AndroidStudio项目都有像这样的目录结构。可以看到虽然jar已经复制黏贴过来了,但是还未导入,所以看不到jar中包含的内容。而已导入的jar,则可以看到jar中内容。
第二步:右键点击新黏贴的jar,在弹出菜单中点击Add As Library.
第三步:选择你要导入到的那个module(在AndroidStudio中相当于Eclipse中的project),如果当前只是一个项目,下拉框中除了app也没有其他的内容,那么直接点击ok确认。
7.如何导入外部aar包

   
   
1.如何加载外部aar包?
aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件
第一步:
    新建一个module,选择Android library.
第二步:
    编译整个项目,生成aar包,在build->outputs->aar下。


第三步:
    将aar包复制到需要引用该aar包项目的lib目录下,然后在build.gradle中添加下面两处代码。


第四步:
    编译项目,在下图中的目录就可以看到了。

        8. 如何生成签名Apk文件
        
    9.如何进行文件混淆

1、ProGuard的常用语法

-libraryjars class_path 应用的依赖包,如android-support-v4

-keep [,modifier,...] class_specification 不混淆某些类

-keepclassmembers [,modifier,...] class_specification 不混淆类的成员

-keepclasseswithmembers [,modifier,...] class_specification 不混淆类及其成员

-keepnames class_specification 不混淆类及其成员名

-keepclassmembernames class_specification 不混淆类的成员名

-keepclasseswithmembernames class_specification 不混淆类及其成员名

-assumenosideeffects class_specification 假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println和Log.v等等

-dontwarn [class_filter] 不提示warnning

关于proguard更多语法可见:http://proguard.sourceforge.net/index.html#manual/usage.html


2、常用proguard.cfg代码段

不混淆某类的构造方法,需指定构造函数的参数类型,如JSONObject

Java
1
2
3
- keepclassmembers  class   cn . trinea . android . common . service . impl . ImageCache   {
    public   <init> ( int ) ;
}

 

不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把**换成类名

Java
1
- keep  class   cn . trinea . android . common . * *   {   * ;   }

 

不混淆指某个方法,*可换成指定的方法或类名

Java
1
2
3
- keepclassmembers  class   cn . trinea . android . common . service . impl . ImageCache   {
    public   boolean   get ( java . lang . String ,   android . view . View ) ;
}

 

不混淆Parcelable的子类,防止android.os.BadParcelableException

Java
1
2
3
- keep  class   *   implements   android . os . Parcelable   {
   public   static   final   android . os . Parcelable $ Creator   * ;
}

 

添加android-support-v4.jar依赖包

Java
1
2
3
4
- libraryjars    libs / android - support - v4 . jar
- dontwarn  android . support . v4 . * *     
- keep  class   android . support . v4 . * *   {   * ;   }   
- keep  interface   android . support . v4 . app . * *   {   * ;   }

         3、proguard与log level结合解决debug模式Log问题

常见的Android debug日志的打法是定义一个静态变量DEBUG_STATUS,如果为true,则打印log,否则不打印。对于release模式该变量为false,debug模式变量为true。这里介绍一个更好的方法,不用担心正式发布时一不小心错改了该变量。

 

proguard的作用就是在release模式压缩、优化、混淆代码,其中的压缩和优化就包括去除不必要的代码,我们可以利用这一特性解决debug日志的问题,在proguard.cfg中添加

Java
1
2
3
4
- assumenosideeffects  class   android . util . Log   {
     public   static   * * *   d ( . . . ) ;
     public   static   * * *   v ( . . . ) ;
}

表示Log.d和Log.v代码无副作用,在proguard时会被从源码中remove掉,这样release模式(正式发布)就不会打印日志了,而debug模式(平常调试)照常打印。


Gson文件的混淆设置

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose com.lenovo.plugin.andfix.annotation
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

##---------------End: proguard configuration for Gson ----------
下面是常见的的proguard.cfg配置项:
#指定代码的压缩级别
  -optimizationpasses 5
  #包明不混合大小写
  -dontusemixedcaseclassnames
  #不去忽略非公共的库类
  -dontskipnonpubliclibraryclasses
   #优化  不优化输入的类文件
  -dontoptimize
   #预校验
  -dontpreverify
   #混淆时是否记录日志
  -verbose
   # 混淆时所采用的算法
  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
  #保护注解
  -keepattributes *Annotation*
  # 保持哪些类不被混淆
  -keep public class * extends android.app.Fragment
  -keep public class * extends android.app.Activity
  -keep public class * extends android.app.Application
  -keep public class * extends android.app.Service
  -keep public class * extends android.content.BroadcastReceiver
  -keep public class * extends android.content.ContentProvider
  -keep public class * extends android.app.backup.BackupAgentHelper
  -keep public class * extends android.preference.Preference
  -keep public class com.android.vending.licensing.ILicensingService
  #如果有引用v4包可以添加下面这行
  -keep public class * extends android.support.v4.app.Fragment
  #忽略警告
  -ignorewarning
  ##记录生成的日志数据,gradle build时在本项目根目录输出##
  #apk 包内所有 class 的内部结构
  -dump class_files.txt
  #未混淆的类和成员
  -printseeds seeds.txt
  #列出从 apk 中删除的代码
  -printusage unused.txt
  #混淆前后的映射
  -printmapping mapping.txt
  ########记录生成的日志数据,gradle build时 在本项目根目录输出-end######
  #####混淆保护自己项目的部分代码以及引用的第三方jar包library#######
  #-libraryjars libs/umeng-analytics-v5.2.4.jar
  #三星应用市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar
  #-libraryjars libs/sdk-v1.0.0.jar
  #-libraryjars libs/look-v1.0.1.jar
  #如果不想混淆 keep 掉
  -keep class com.lippi.recorder.iirfilterdesigner.** {*; }
  #友盟
  -keep class com.umeng.**{*;}
  #项目特殊处理代码
  #忽略警告
  -dontwarn com.lippi.recorder.utils**
  #保留一个完整的包
  -keep class com.lippi.recorder.utils.** {
    *;
   }
  -keep class  com.lippi.recorder.utils.AudioRecorder{*;}
  #如果引用了v4或者v7包
  -dontwarn android.support.**
  ####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####
  -keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
  }
  #保持 native 方法不被混淆
  -keepclasseswithmembernames class * {
    native <methods>;
  }
  #保持自定义控件类不被混淆
  -keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
  }
  #保持自定义控件类不被混淆
  -keepclassmembers class * extends android.app.Activity {
     public void *(android.view.View);
  }
  #保持 Parcelable 不被混淆
  -keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
  }
  #保持 Serializable 不被混淆
  -keepnames class * implements java.io.Serializable
  #保持 Serializable 不被混淆并且enum 类也不被混淆
  -keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
  }
  #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
  #-keepclassmembers enum * {
  #  public static **[] values();
  #  public static ** valueOf(java.lang.String);
  #}
  -keepclassmembers class * {
    public void *ButtonClicked(android.view.View);
  }
  #不混淆资源类
  -keepclassmembers class **.R$* {
    public static <fields>;
  }
  #避免混淆泛型 如果混淆报错建议关掉
  #–keepattributes Signature
  #移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志
  #-assumenosideeffects class android.util.Log {
  #	public static boolean isLoggable(java.lang.String, int);
  #	public static int v(...);
  #	public static int i(...);
  #	public static int w(...);
  #	public static int d(...);
  #	public static int e(...);
  #}
  #如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
  #gson
  #-libraryjars libs/gson-2.2.2.jar
  -keepattributes Signature
  # Gson specific classes
  -keep class sun.misc.Unsafe { *; }
  # Application classes that will be serialized/deserialized over Gson
  -keep class com.google.gson.examples.android.model.** { *; }
10.如何使用SVN
11.如何避免多包冲突
对support-v4,以及一些其他的包建议采用Library dependency的方式添加。

对library中引用的jar包采用Provided的方式来进行引用。

12.如何从Eclipse转化成AS项目

13.如何设置包自动导入
14.android6.0如何使用Httpclient

android {
useLibrary 'org.apache.http.legacy'
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lpftobetheone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值