Gradle命令和配置 标签: AndroidGradle命令配置 2016-03-11 09:32 17174人阅读 评论(5) 收藏 举报 分类: 开发工具(9) 版权声明:本文为博主原创文
2017-08-28 14:54
731 查看
Gradle命令和配置
标签: AndroidGradle命令配置2016-03-11 09:32 17174人阅读 评论(5) 收藏 举报
分类:
开发工具(9)
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
我的博客原文地址
Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言,建议可以先熟悉一下Groovy脚本。
在线文档
Gradle命令:
常用命令:
gradle明明一般是./gradlew +参数,
gradlew代表
gradle wrapper,意思是gradle的一层包装,大家可以理解为在这个项目本地就封装了gradle,即gradle wrapper, 在
gradle/wrapper/gralde-wrapper.properties文件中声明了它指向的目录和版本。只要下载成功即可用
grdlew wrapper的命令代替全局的
gradle命令。
./gradlew -v版本号
./gradlew clean清除app目录下的build文件夹
./gradlew build检查依赖并编译打包
./gradlew tasks列出所有task
这里注意的是
./gradlew build命令把debug、release环境的包都打出来,如果正式发布只需要打Release的包,该怎么办呢,下面介绍一个很有用的命令
assemble,
如:
./gradlew assembleDebug编译并打Debug包
./gradlew assembleRelease编译并打Release的包
除此之外,
assemble还可以和
productFlavors结合使用:
./gradlew installReleaseRelease模式打包并安装
./gradlew uninstallRelease卸载Release模式包
加入自定义参数:
比如我们想根据不同的参数来进行不用的编译配置,可以在./gradlew中加入自定义参数。
./gradlew assembleDebug -Pcustom=true
就可以在
build.gradle中使用下面代码来判断:
if (project.hasProperty('custom')){ }1
2
3
1
2
3
assemble结合Build Variants来创建task
assemble还能和
Product Flavor结合创建新的任务,其实
assemble是和
Build Variants一起结合使用的,而
Build Variants = Build Type + Product Flavor,举个例子大家就明白了:
如果我们想打包 wandoujia 渠道的
release版本,执行如下命令就好了:
./gradlew assembleWandoujiaRelease
如果我们只打wandoujia渠道版本,则:
./gradlew assembleWandoujia
此命令会生成wandoujia渠道的Release和Debug版本
同理我想打全部Release版本:
./gradlew assembleRelease
这条命令会把Product Flavor下的所有渠道的Release版本都打出来。
总之,
assemble命令创建task有如下用法:
assemble<Variant Name>: 允许直接构建一个Variant版本,例如
assembleFlavor1Debug。
assemble<Build Type Name>: 允许构建指定Build Type的所有APK,例如
assembleDebug将会构建Flavor1Debug和Flavor2Debug两个Variant版本。
assemble<Product Flavor Name>: 允许构建指定flavor的所有APK,例如
assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本。
Gradle配置:
Gradle构建脚本 build.gradle: Gradle属性文件 gradle.properties
Gradle设置文件 settings.gradle
build.gradle
先看整个项目的gradle配置文件:buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
内容主要包含了两个方面:一个是声明仓库的源,这里可以看到是指明的
jcenter(), 之前版本则是
mavenCentral(),
jcenter可以理解成是一个新的中央远程仓库,兼容
maven中心仓库,而且性能更优。
另一个是声明了Android gradle plugin的版本,android studio
1.0正式版必须要求支持gradle plugin 1.0的版本
某个Moudle的gradle配置文件:
buildscript
buildscript { repositories { maven { url 'http://*********' } } dependencies { classpath 'com.android.tools.build:gradle:1.3.1' } }1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
buildscript{}设置脚本的运行环境。
repositories{}支持java依赖库管理,用于项目依赖。
dependencies{}依赖包的定义。支持
maven/ivy,远程,本地库,也支持单文件。如果前面定义了
repositories{}maven
库,则使用maven的依赖库,使用时只需要按照用类似于
com.android.tools.build:gradle:0.4,gradle 就会自动的往远程库下载相应的依赖。
apply
//声明引用 com.android.application 插件,那么这个模块就是一个Android应用程序 apply plugin: 'com.android.application'1
2
1
2
apply plugin:声明引用插件的类型。如果是库的话就加
apply plugin: 'com.android.library'1
1
apply from:表示引用其他的配置文件,比如
apply from:"config.gradle"
android
android { // 编译SDK的版本 compileSdkVersion 22 // build tools的版本 buildToolsVersion "23.0.1" //aapt配置 aaptOptions { //不用压缩的文件 noCompress 'pak', 'dat', 'bin', 'notice' //打包时候要忽略的文件 ignoreAssetsPattern "!.svn:!.git" //分包 multiDexEnabled true //--extra-packages是为资源文件设置别名:意思是通过该应用包名+R,com.android.test1.R和com.android.test2.R都可以访问到资源 additionalParameters '--extra-packages', 'com.android.test1','--extra-packages','com.android.test2' } //默认配置 defaultConfig { //应用的包名 applicationId "com.example.heqiang.androiddemo" minSdkVersion 21 targetSdkVersion 22 versionCode 1 versionName "1.0" } //编译配置 compileOptions { // java版本 sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } //源文件目录设置 sourceSets { main { //jni lib的位置 jniLibs.srcDirs = jniLibs.srcDirs << 'src/jniLibs' //定义多个资源文件夹,这种情况下,两个资源文件夹具有相同优先级,即如果一个资源在两个文件夹都声明了,合并会报错。 res.srcDirs = ['src/main/res', 'src/main/res2'] //指定多个源文件目录 java.srcDirs = ['src/main/java', 'src/main/aidl'] } } //签名配置 signingConfigs { debug { keyAlias 'androiddebugkey' keyPassword 'android' storeFile file('keystore/debug.keystore') storePassword 'android' } } buildTypes { //release版本配置 release { debuggable false // 是否进行混淆 minifyEnabled true //去除没有用到的资源文件,要求minifyEnabled为true才生效 shrinkResources true // 混淆文件的位置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' signingConfig signingConfigs.debug //ndk的一些相关配置,也可以放到defaultConfig里面。 //指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,arm-v8之类的so会被过滤掉) ndk { abiFilter "armeabi" } } //debug版本配置 debug { debuggable true // 是否进行混淆 minifyEnabled false //去除没有用到的资源文件,要求minifyEnabled为true才生效 shrinkResources true // 混淆文件的位置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' signingConfig signingConfigs.debug //ndk的一些相关配置,也可以放到defaultConfig里面。 //指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,arm-v8之类的so会被过滤掉) ndk { abiFilter "armeabi" } } } // lint配置 lintOptions { //移除lint检查的error abortOnError false //禁止掉某些lint检查 disable 'NewApi' } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
android{}设置编译android项目的参数,构建android项目的所有配置都写在这里。
除了上面写的,在
android{}块中可以包含以下直接配置项:
productFlavors{ }产品风格配置,ProductFlavor类型
testOptions{ }测试配置,TestOptions类型
dexOptions{ }dex配置,DexOptions类型
packagingOptions{ }PackagingOptions类型
jacoco{ }JacocoExtension类型。 用于设定 jacoco版本
splits{ }Splits类型。
几点说明:
文件开头
apply plugin是最新gradle版本的写法,以前的写法是
apply plugin: 'android', 如果还是以前的写法,请改正过来。
minifyEnabled也是最新的语法,很早之前是
runProguard,这个也需要更新下。
proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 sdk目录
/tools/proguard/proguard-android.txt,
后一部分是我们项目里的自定义的混淆文件,目录就在
app/proguard-rules.txt, 如果你用Studio 1.0创建的新项目默认生成的文件名是
proguard-rules.pro,
这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则。最终混淆的结果是这两部分文件共同作用的。
aaptOptions更多介绍 http://blog.csdn.net/heqiangflytosky/article/details/51009123
repositories
repositories { flatDir { //本地jar依赖包路径 dirs '../../../../main/libs' } }1
2
3
4
5
6
1
2
3
4
5
6
dependencies
dependencies { compile files('libs/android-support-v4.jar') //在flatDir.dirs下面找依赖的aar compile (name:'ui', ext:'aar') // 编译extras目录下的ShimmerAndroid模块 // 使用transitive属性设置为false来排除所有的传递依赖,默认为true compile project(':extras:ShimmerAndroid'){ transitive = false } // 编译CommonSDK模块,但是去掉此模块中对com.android.support的依赖,防止重复依赖报错 compile (project(':CommonSDK')) { exclude group: "com.android.support" } provided fileTree(dir: 'src/android5/libs', include: ['*.jar']) provided 'com.android.support:support-v4:21.0.3' provided project(':main-host') //通用使用exclude排除support-compat模块的依赖 compile ('com.jakewharton:butterknife:8.5.1'){ exclude module: 'support-compat' } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
compile和
provided
compile表示编译时提供并打包进apk。
provided表示只在编译时提供,不打包进apk。
exclude防止重复依赖,后面会重点介绍
transitive排除所有的传递依赖,后面会重点介绍
include
CommonSDK模块的定义可以参考
settings.gradle
其他的介绍可以参考 依赖库管理。
几点说明
看到上面的两个一模一样的repositories和
dependencies了吗?他们的作用是不一样的,在
buildscript里面的那个是插件初始化环境用的,用于设定插件的下载仓库,而外面的这个是设定工程依赖的一些模块和远程library的下载仓库的。
settings.gradle
这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module。 一般在
setting.gradle中主要是调用
include方法,导入工程下的各个子模块。
那我们在
setting.gradle里面还能写什么呢?因为
setting.gradle对应的是
gradle中的
Settings对象,那查下
Settings的文档(https://docs.gradle.org/current/dsl/org.gradle.api.initialization.Settings.html),看下它都有哪些方法,哪些属性,就知道在
setting.gradle能写什么了;
include ':AndroidDemo' include ':CommonSDK' project(':CommonSDK').projectDir = new File(settingsDir, '../../CommonSDK/')1
2
3
4
1
2
3
4
include调用后,生成了一个名为:
CommonSDK的
Project对象,
project(':CommonSDK')取出这个对象,设置
Project的
projectDir属性。
projectDir哪里来的?请看
Project类的文档。
gradle.properties
可以在 gradle.properties 文件中配置一些变量,这些变量在这个工程下的所有module的build.gradle文件里都可以使用。这样就可以把一些共用的变量放到这里,这样后面修改的时候就可以只修改这个变量,不用各个模块都要修改了。 比如我们在 gradle.properties SDK 版本以及应用的版本号:
MIN_SDK_VERSION=21 TARGET_SDK_VERSION=22 VERSION_CODE=200100 VERSION_NAME=2.1.01
2
3
4
1
2
3
4
那么在 build.gradle 中可以通过
project进行引用:
defaultConfig { applicationId "com.example.heqiang.testsomething" minSdkVersion project.MIN_SDK_VERSION as int targetSdkVersion project.TARGET_SDK_VERSION as int versionCode project.VERSION_CODE as int versionName project.VERSION_NAME /* * as int 关键字是用来进行类型转换的,因为从配置里面读取出来的默认是字符串 *还可以使用 versionCode Integer.parseInt(project.VERSION_CODE) * */ }1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
调试
我们在进行一些配置的时候可能需要知道一些变量的值,这时候可以在 build.gradle 中添加打印进行调试,比如:defaultConfig { applicationId "com.example.hq.testsomething" minSdkVersion project.MIN_SDK_VERSION as int targetSdkVersion project.TARGET_SDK_VERSION as int versionCode project.VERSION_CODE as int versionName project.VERSION_NAME println('** build versionName=' + versionName) }1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
在 Gradle Console 中就可以看到打印:
** build versionName=2.1.01
1
依赖库管理
本地依赖
dependencies { //单文件依赖 compile files('libs/android-support-v4.jar') //某个文件夹下面全部依赖 compile fileTree(dir: 'src/android6/libs', include: ['*.jar']) compile (name:'ui', ext:'aar') compile (project(':CommonSDK')) { exclude group: "com.android.support" } provided fileTree(dir: 'src/android5/libs', include: ['*.jar']) provided 'com.android.support:support-v4:21.0.3' provided project(':main-host') }1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
远程依赖
gradle同时支持
maven,
ivy,以
maven作为例子:
repositories { //从中央库里面获取依赖 mavenCentral() //或者使用指定的本地maven 库 maven{ url "file://F:/githubrepo/releases" } //或者使用指定的远程maven库 maven{ url "https://github.com/youxiachai/youxiachai-mvn-repo/raw/master/releases" } } dependencies { //应用格式: packageName:artifactId:version compile 'com.google.android:support-v4:r13' }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
项目依赖
对于项目依赖android library的话,在这里需要使用gradle mulit project机制。
Mulit project设置是
gradle约定的一种格式,如果需要编译某个项目之前,要先编译另外一个项目的时候,就需要用到。结构如下(来自于官方文档):
MyProject/ | settings.gradle + app/ | build.gradle + libraries/ + lib1/ | build.gradle + lib2/ | build.gradle1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
需要在workplace目录下面创建
settings.gradle的文件,然后在里面写上:
include ':app', ':libraries:lib1', ':libraries:lib2'1
1
例如:
include ':AndroidDemo' include ':CommonSDK' project(':CommonSDK').projectDir = new File(settingsDir, '../../CommonSDK/')1
2
3
4
1
2
3
4
如此,gradle mutil project 就设置完毕。
对于app project如果需要应用libraries目录下的lib1,只需要在app project的
build.gradle文件里的依赖中这么写:
compile project(':libraries:lib1')1
1
类似前面的
provided project(':main-host')1
1
即可完成,写完以后可以用
gradle dependencies可以检查依赖状况
Gradle依赖的统一管理
我们可以在项目的根目录创建一个gradle配置文件config.gradle,内容如下:
ext{ android=[ compileSdkVersion: 22, buildToolsVersion: "23.0.1", minSdkVersion: 21, targetSdkVersion: 22, versionCode: 1, versionName: "1.0" ] dependencies=[ compile:'com.android.support:support-v4:21.0.3', compile: (project(':CommonSDK')) { exclude group: "com.android.support" }, provided: fileTree(dir: 'src/android5/libs', include: ['*.jar']), provided: project(':main-host') ] }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
targetSdkVersion的版本还有依赖库的版本升级都在这里进行统一管理,所有的module以及主项目都从这里同意读取就可以了。
在build.gradle文件中加入:
apply from:"config.gradle"1
1
意思是所有的子项目或者所有的modules都可以从这个配置文件中读取内容。
android节点读取ext中android对应项,dependencies读取dependencies对应项,如果配置有变化就可以只在config.gradle中修改,是不是很方便进行配置的管理呢?
检查依赖报告
运行命令./gradlew <projectname>:dependencies --configuration compile(projectname为settings.gradle里面配置的各个project,如果没有配置,直接运行
./gradlew dependencies --configuration compile),会把依赖树会打印出来,依赖树显示了你 build 脚本声明的顶级依赖和它们的传递依赖:
仔细观察你会发现有些传递依赖标注了*号,表示这个依赖被忽略了,这是因为其他顶级依赖中也依赖了这个传递的依赖,Gradle会自动分析下载最合适的依赖。
排除传递依赖
Gradle允许你完全控制传递依赖,你可以选择排除全部的传递依赖也可以排除指定的依赖。exclude:前面已经介绍过,可以设置不编译指定的模块,排除指定模块的依赖。后的参数有
group和
module,可以分别单独使用,会排除所有匹配项。
// 编译CommonSDK模块,但是去掉此模块中对com.android.support的依赖,防止重复依赖报错 compile (project(':CommonSDK')) { exclude group: "com.android.support" } compile ('com.jakewharton:butterknife:8.5.1'){ exclude module: 'support-compat' exclude group: 'com.android.**.***', module: '***-***' }1
2
3
4
5
6
1
2
3
4
5
6
transitive:前面已经介绍过,用于自动处理子依赖项,默认为true,gradle自动添加子依赖项。设置为false排除所有的传递依赖,可以用来解决一些依赖冲突的问题,比如一些
Error:java.io.IOException: Duplicate zip entry报错。
// 使用transitive属性设置为false来排除所有的传递依赖 compile project(':extras:ShimmerAndroid'){ transitive = false }1
2
3
4
1
2
3
4
force:强制设置某个模块的版本。
configurations.all{ resolutionStrategy{ force'org.hamcrest:hamcrest-core:1.3' } }1
2
3
4
5
1
2
3
4
5
这样,应用中对
org.hamcrest:hamcrest-core依赖就会变成1.3版本。
动态版本声明
如果你想使用一个依赖的最新版本,你可以使用latest.integration,比如声明 Cargo Ant tasks的最新版本,你可以这样写org.codehaus .cargo:cargo-ant:latest-integration,你也可以用一个+号来动态的声明:dependencies { //依赖最新的1.x版本 compile "org.codehaus.cargo:cargo-ant:1.+" }1
2
3
4
1
2
3
4
然后在依赖树里面可以清晰的看到选择了哪个版本:
\--- org.codehaus.cargo:cargo-ant:1.+ -> 1.3.11
1
http://www.open-open.com/lib/view/open1431391503529.html
http://www.jianshu.com/p/429733dbbc34
多渠道打包:
主要借助android { productFlavors{ …… } }1
2
3
4
5
1
2
3
4
5
来实现。
网上多是类似友盟的配置,copy过来:
http://blog.csdn.net/maosidiaoxian/article/details/42000913
https://segmentfault.com/a/1190000004050697
在
AndroidManifest.xml里面写上:
<meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" />1
2
3
1
2
3
里面的
Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。
android { productFlavors { xiaomi { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] } _360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"] } wandoujia { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
或者批量修改
android { productFlavors { xiaomi {} _360 {} baidu {} wandoujia {} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } }1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
然后用
./gradlew assembleRelease这条命令会把Product Flavor下的所有渠道的Release版本都打出来。
assemble<Product Flavor Name>: 允许构建指定flavor的所有APK,例如
assembleFlavor1将会构建
Flavor1Debug和
Flavor1Release两个
Variant版本。
在上面当中,我们也可以指定一个默认的渠道名,如果需要的话。指定默认的值是在
defaultConfig节点当中添加如下内容:
manifestPlaceholders = [ CHANNEL_NAME:"Unspecified"]1
1
这里的
Unspecified换成你实际上的默认的渠道名。
使用
manifestPlaceholders的这种配置,同样适用于
manifest的其他配置。比如你需要在不同渠道发布的apk里面,指定不同的启动
Activity。比如在豌豆荚里面发布的,启动的
Activity显示的是豌豆荚首发的界面,应用宝里面启动的是应用宝首发的界面(哈哈,有点坏),你就可以对你的
activity的值使用
{activity_name}的方式,然后在
productFlavors里面配置这个
{activity_name}的值。
相关文章推荐
- 数据库阿里连接池 druid配置详解 标签: druidspringjavaxml配置阿里池 2016-06-16 00:34 57532人阅读 评论(11) 收藏 举报 版权声明:本文为博主原创文
- 单例模式八种写法比较 2017-07-04 15:30 25人阅读 评论(0) 收藏 举报 分类: Android移动互联(19) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录
- STM32 use microlib是干什么的 2016-04-25 23:13 1298人阅读 评论(0) 收藏 举报 分类: STM32(15) 版权声明:本文为博主原创文章,未经博主允许
- 关于Android 5.1限制外置SD卡写入权限的破解方法 标签: Android 5.1SD卡写入权限 2017-06-15 10:06 1374人阅读 评论(0) 收藏 举报 版权声明:本文为
- WINDOWS中NEXUS的安装使用【ATCO整理】 2016-06-20 15:52 367人阅读 评论(0) 收藏 举报 分类: 项目管理(11) 版权声明:本文为博主原创文章,未经博主允许
- iOS大文件分片上传和断点续传 标签: iOS大文件分片断点续传获取视频获取图片 2016-05-17 15:52 4881人阅读 评论(8) 收藏 举报 分类: 技术—iOS 版权声明:本文为博
- 关于悲观锁和乐观锁的区别(最直观理解) 2015-11-23 11:59 5105人阅读 评论(1) 收藏 举报 分类: 数据库(20) 版权声明:本文为博主原创文章,未经博主允许不得转载。
- Android 中查看内存的使用情况集常用adb命令 标签: Androidadb 2014-06-28 10:55 57206人阅读 评论(0) 收藏 举报 分类: Android(9) 版权声
- 关于如何在java中实现中文首字母索引排序的问题 2016-08-25 15:14 86人阅读 评论(0) 收藏 举报 分类: Java(19) 版权声明:本文为博主原创文章,未经博主允许不得转载
- EventBus使用详解(二)——EventBus使用进阶 2014-11-04 16:45 88833人阅读 评论(81) 收藏 举报 分类: 5、andriod开发(149) 版权声明:本文
- 基于live555的rtsp 客户端模块优化 标签: live555rtsp客户端 2014-11-14 09:24 980人阅读 评论(0) 收藏 举报 分类: 流媒体(16) 版权声明:本文
- RxJava Android(RxAndroid) 开发全家桶 标签: RxAndroid 2016-08-03 23:38 4993人阅读 评论(0) 收藏 举报 分类: Android开发(1
- Android 快速开发系列 ORMLite 框架最佳实践 标签: AndroidORMLite 2014-09-07 23:47 62916人阅读 评论(36) 收藏 举报 分类: 【Androi
- Android Gradle 多版本多APK打包,修改生成APK名称 标签: androidgradle多版本打包 2017-04-01 15:16 1113人阅读 评论(0) 收藏 举报 分类:
- Volecity模板引擎学习笔记<一> 标签: 模板引擎volecity 2016-03-20 17:29 1229人阅读 评论(0) 收藏 举报 分类: Java开发(36) web前端(13
- apk编译/反编译工具baksmali… 分类: Android安装及配置 2014-05-30 10:59 151人阅读 评论(0) 收藏
- 分类: linux程序设计 2012-03-06 22:01 10646人阅读 评论(5) 收藏 举报 linux语言c工具gcc程序开发 调试是每个程序员都会面临的问题. 如何提高程序员的调
- [转]Android开发中常用工具类总结-… 分类: Android开发 2014-05-30 10:54 74人阅读 评论(0) 收藏
- 开发必备---你应该知道的一些 ADB 命令 144 作者 LooperJing 关注 2016.11.27 11:45* 字数 1548 阅读 1106评论 2喜欢 39 版权声明:本文为Loop
- adb shell 命令详解 ZZ 分类: Android安装及配置 2014-05-30 10:59 107人阅读 评论(0) 收藏