1.AndroidStudio环境搭建与配置2.创建Project、Library3.快捷键介绍4.Gradle简单介绍5.如何生成导出jar包6.如何导入外部jar包7.如何导入外部aar包8.如何生成签名Apk文件9.如何进行文件混淆10.如何使用SVN11.如何避免多包冲突12.如何从Eclipse转化成AS项目13.如何设置包自动导入14.android6.0如何使用Httpclient
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.+
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 23versionCode 1versionName "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,弹出搜索框。
1. GRADLE_HOME![]()
2.PATH![]()
apply plugin: 'com.android.application'
repositories {jcenter()}
android {compileSdkVersion 19buildToolsVersion "21.1.1"
defaultConfig {applicationId "com.aiscot.gradle.test"minSdkVersion 9targetSdkVersion 19versionCode 1versionName "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_7targetCompatibility 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模式下,显示logbuildConfigField("boolean", "LOG_DEBUG", "true")
// 版本名前缀versionNameSuffix "-debug"// 不开启混淆minifyEnabled false// 不开启ZipAlign优化zipAlignEnabled false// 不移除无用的resource文件shrinkResources false// 使用debug签名signingConfig signingConfigs.debug
}release {// release模式下,不显示logbuildConfigField("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.outputFileif (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.+'}重点需要讲解的地方:
signingConfigs
中的debug签名和release签名,都可以写绝对路径,当然,也可以通过指定形如debug{storeFile file("xx-debug.jks")}
这样儿的配置,只不过需要注意,如果使用这样儿的方式,签名文件需要放在项目中UMeng官方的多渠道打包集成文档中指定,如果使用Gradle打包的方式的话,需要在build.gradle文件中的dependencies中添加如下的依赖:
常用Gradle命令:dependencies { compile 'com.umeng.analytics:analytics:latest.integration' }
gradlew -v 查看命令gradlew clean 执行这个命令会去下载Gradle的一些依赖,下载成功并编译通过时会看到如下信息:gradlew build 这个命令会直接编译并生成相应的apk文件,如果看到如下字样就代表build成功gradlew assembleDebug 编译并打Debuggradlew assembleRelease 编译并打Release的包
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中添加下面两处代码。![]()
第四步:编译项目,在下图中的目录就可以看到了。![]()
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
123 - keepclassmembers class cn . trinea . android . common . service . impl . ImageCache {public <init> ( int ) ;}
不混淆某个包所有类或某个类class、某个接口interface, 不混淆指定类则把**换成类名
Java
1 - keep class cn . trinea . android . common . * * { * ; }
不混淆指某个方法,*可换成指定的方法或类名
Java
123 - keepclassmembers class cn . trinea . android . common . service . impl . ImageCache {public boolean get ( java . lang . String , android . view . View ) ;}
不混淆Parcelable的子类,防止android.os.BadParcelableException
Java
123 - keep class * implements android . os . Parcelable {public static final android . os . Parcelable $ Creator * ;}
添加android-support-v4.jar依赖包
Java
1234 - 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
1234 - 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'
}