2015年2月6日星期五

Android Studio系列教程五--Gradle命令详解与导入第三方包

Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看、编译并导入第三方开源项目的方法。

Sublime + Terminal编译并查看源码

首先来给大家介绍一种简便并且个人最喜欢的一种办法。很多时候我们在GitHub上看到一个不错的开源项目,一般有两种需求,阅读源码和查看运行效果,如果是单纯的查看源码我更喜欢用一些轻量级编辑器,如vim,sublime等,vim不是很熟练,所以个人一种都习惯用sublime来查看并阅读源码(实际开发还是Android Studio、Eclipse等IDE更有效率);至于查看运行效果首先得需要apk,对于一些开源项目已提供apk下载,那就好办,直接安装到手机即可。 而对于一些没有提供apk下载的,则需要自己手动编译打包。
下面以9GAG为例来讲解下命令行Gradle编译的过程。
  • 1、切换到9GAG项目的根目录,执行 ./gradlew -v 来查看下项目所用的Gradle版本
如果你是第一次执行会去下载Gradle,这个过程如果不翻墙非常慢,建议翻墙
紧接着下载成功会看到如下信息:
------------------------------------------------------------
Gradle 2.2.1
------------------------------------------------------------

Build time:   2014-11-24 09:45:35 UTC
Build number: none
Revision:     6fcb59c06f43a4e6b1bcb401f7686a8601a1fb4a

Groovy:       2.3.6
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.7.0_60 (Oracle Corporation 24.60-b09)
OS:           Mac OS X 10.9.5 x86_64
  • 2、接着执行 ./gradlew clean
执行这个命令会去下载Gradle的一些依赖,下载成功并编译通过时会看到如下信息:
:app:clean UP-TO-DATE
:extras:ShimmerAndroid:clean UP-TO-DATE

BUILD SUCCESSFUL
  • 3、最后执行 ./gradlew build
这个命令会直接编译并生成相应的apk文件,如果看到如下字样就代表build成功了
BUILD SUCCESSFUL

Total time: 31.456 secs
紧接着在 9GAG/app/build/outputs/apk 目录下会看到类似于app-debug-unaligned.apk, app-release-unsigned.apk等,看名字应该能理解意思,unaligned代表没有进行zip优化的,unsigned代表没有签名的。然后就可以直接安装apk查看运行效果了。
以上是我个人习惯的一种阅读第三方源码的习惯,关于上面提到的一些gradle命令大家应该还不理解,后面会一一进行说明的。

导入Android Studio

但是如果你还是想导入Android Studio的话,下面就来简单介绍下导入Studio的方法以及一些注意事项。
  • 1、选择File->Import Project, 选择本地9GAG项目的目录
  • 2、第一次依然会下载Gradle,其实自己在命令行已经下载过了,但是这次依然还要下载一次(依然要翻墙),可能是个bug
  • 3、导入之后你需要注意以下几个地方
  1. 每个Module下的 build.gradle 下的buildToolsVersion,即9GAG/app/build.gradle 和9GAG/extras/ShimmerAndroid/build.gradle , 可以打开 SDK Manager 查看本地你安装的 SDK Build-tools, 如下图,如果相应版本没有安装请先下载。
  1. 项目根目录下的 build.gradle 下gradle插件的版本,如 9GAG/build.gradle 的内容:
    classpath 'com.android.tools.build:gradle:1.0.0'
Android Studio 1.0必须指定gradle插件1.0的版本
  1. Gradle Wrapper的版本,在 9GAG/gradle/wrapper/gralde-wrapper.properties 文件里有如下内容:

    Thu Dec 18 16:02:24 CST 2014

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https://services.gradle.org/distributions/gradle-2.2.1-all.zip
上述内容制定了gradle的版本使用2.2.1,在Studio中如果你手动改了gradle插件的版本会有提示要不要更新Gradle Wrapper的版本。
如果以上几个地方确定版本是ok的,那么导入Android Studio应该没有问题,有些老的项目可能gradle版本比较老,仍然在使用一些老的语法,如果编译还通不过参考Android Studio系列教程四--Gradle基础更改成最新的语法。

Gradle常用命令

上面大家接触了一些命令如 ./gradlew -v ./gradlew clean ./gradlew build, 这里注意是./gradlew./代表当前目录,gradlew代表 gradle wrapper,意思是gradle的一层包装,大家可以理解为在这个项目本地就封装了gradle,即gradle wrapper, 在9GAG/gradle/wrapper/gralde-wrapper.properties文件中声明了它指向的目录和版本。只要下载成功即可用grdlew wrapper的命令代替全局的gradle命令。
理解了gradle wrapper的概念,下面一些常用命令也就容易理解了。
  • ./gradlew -v 版本号
  • ./gradlew clean 清除9GAG/app目录下的build文件夹
  • ./gradlew build 检查依赖并编译打包
这里注意的是 ./gradlew build 命令把debug、release环境的包都打出来,如果正式发布只需要打Release的包,该怎么办呢,下面介绍一个很有用的命令 assemble, 如
  • ./gradlew assembleDebug 编译并打Debug包
  • ./gradlew assembleRelease 编译并打Release的包
除此之外,assemble还可以和productFlavors结合使用,具体在下一篇多渠道打包进一步解释。
  • ./gradlew installRelease Release模式打包并安装
  • ./gradlew uninstallRelease 卸载Release模式包
下一篇来介绍用Gradle进行方便的多渠道打包,以及项目中完整的Gradle配置。有问题或建议欢迎大家直接博客留言。

史上最详细的Android Studio系列教程四--Gradle基础

其实很早之前也写了一篇Gradle的基础博客,但是时间很久了,现在Gradle已经更新了很多,所以暂且结合Stduio 1.0正式版与最新的Gradle语法来详细讲解下,小伙伴们直接跟我一步步来学习吧。

什么是Gradle?

Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。

安装Gradle

Android Studio系列教程一--下载与安装中新建项目成功后会下载Gradle,貌似这个过程不翻墙也是可以下载,但是访问特别慢,建议翻墙下载。那么下载的Gradle到什么地方呢?
  • Mac上会默认下载到 /Users/<用户名>/.gradle/wrapper/dists 目录
  • Win平台会默认下载到 C:\Documents and Settings\<用户名>.gradle\wrapper\dists 目录
你会看到这个目录下有个 gradle-x.xx-all 的文件夹, 如果下载实在太慢,但是又不想翻墙的话,可以自己手动到Gradle官网下载对应的版本,然后将下载的.zip文件(也可以解压)复制到上述的gradle-x.xx-all 文件夹下,不过还是建议让它直接下载的好。

Gradle 基本概念

下面就以我的开源项目 9GAG 来详细讲解下和Gradle相关的知识, 和Gradle相关的几个文件一般有如下几个:
红色标记部分从上到下咱们来一步步分析:

1. 9GAG/app/build.gradle

这个文件是app文件夹下这个Module的gradle配置文件,也可以算是整个项目最主要的gradle配置文件,我们来看下这个文件的内容:
// 声明是Android程序
apply plugin: 'com.android.application'

android {
    // 编译SDK的版本
    compileSdkVersion 21
    // build tools的版本
    buildToolsVersion "21.1.1"

    defaultConfig {
        // 应用的包名
        applicationId "me.storm.ninegag"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0.0"
    }

    // java版本
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    buildTypes {
        release {
            // 是否进行混淆
            minifyEnabled false
            // 混淆文件的位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    // 移除lint检查的error
    lintOptions {
      abortOnError false
    }
}

dependencies {
    // 编译libs目录下的所有jar包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:21.0.2'
    compile 'com.etsy.android.grid:library:1.0.5'
    compile 'com.alexvasilkov:foldable-layout:1.0.1'
    // 编译extras目录下的ShimmerAndroid模块
    compile project(':extras:ShimmerAndroid')
}
这里需要说明几点:
  • 文件开头apply plugin是最新gradle版本的写法,以前的写法是apply plugin: 'android', 如果还是以前的写法,请改正过来。
  • buildToolsVersion这个需要你本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是build version的版本不对,这个可以手动更改成你本地已有的版本或者打开 SDK Manager 去下载对应版本。
  • applicationId代表应用的包名,也是最新的写法,这里就不在多说了。
  • android 5.0开始默认安装jdk1.7才能编译,但是由于mac系统自带jdk的版本是1.6,所以需要手动下载jdk1.7并配置下,具体可以见我这篇博客Mac下安装和管理Java
  • minifyEnabled也是最新的语法,很早之前是runProguard,这个也需要更新下。
  • proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 <sdk目录>/tools/proguard/proguard-android.txt , 后一部分是我们项目里的自定义的混淆文件,目录就在 app/proguard-rules.txt , 如果你用Studio 1.0创建的新项目默认生成的文件名是 proguard-rules.pro , 这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则,由于是开源项目,9GAG里并未进行混淆,具体混淆的语法也不是本篇博客讨论的范围。最终混淆的结果是这两部分文件共同作用的。
  • compile project(':extras:ShimmerAndroid')这一行是因为9GAG中存在其他Module,不知道Module的概念可以看下这篇博客Android Studio系列教程二--基本设置与运行, 总之你可以理解成Android Library,由于Gradle的普及以及远程仓库的完善,这种依赖渐渐的会变得非常不常见,但是你需要知道有这种依赖的。
  • 以上文件里的内容只是基本配置,其实还有很多自定义部分,如自动打包debug,release,beta等环境,签名,多渠道打包等,后续会单独拿出来讲解。

2. 9GAG/extras/ShimmerAndroid/build.gradle

每一个Module都需要有一个gradle配置文件,语法都是一样,唯一不同的是开头声明的是 apply plugin: 'com.android.library'

3. 9GAG/gradle

这个目录下有个 wrapper 文件夹,里面可以看到有两个文件,我们主要看下 gradle-wrapper.properties 这个文件的内容:
#Thu Dec 18 16:02:24 CST 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
可以看到里面声明了gradle的目录与下载路径以及当前项目使用的gradle版本,这些默认的路径我们一般不会更改的,这个文件里指明的gradle版本不对也是很多导包不成功的原因之一。

4. 9GAG/build.gradle

这个文件是整个项目的gradle基础配置文件,我们来看看这里面的内容
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
内容主要包含了两个方面:一个是声明仓库的源,这里可以看到是指明的jcenter(), 之前版本则是mavenCentral(), jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。另一个是声明了android gradle plugin的版本,android studio 1.0正式版必须要求支持gradle plugin 1.0的版本。

5. 9GAG/settings.gradle

这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module,我们来看看9GAG该文件的内容:
include ':app', ':extras:ShimmerAndroid'
文件中的 appextras:ShimmerAndroid 都是module,如果还有其他module都需要按照如上格式加进去。

总结

关于gradle的基础知识就介绍到这里,接下来会介绍一种我常用的快速方便的编译查看第三方开源项目的方法,如何导入Android Studio,Gradle常用基本命令,多渠道打包配置等。有疑问或者发现错误欢迎大家直接博客留言。

史上最详细的Android Studio系列教程三--快捷键

Android Studio 1.0正式版发布啦

今天是个大日子,Android Studio 1.0 终于发布了正式版, 这对于Android开发者来说简直是喜大普奔的大消息啊,那么就果断来下载使用。
如果你之前已经使用其他版本的Studio,那么直接覆盖就好了,如果是第一次使用,那么参照Android Studio系列教程一进行安装配置。
于此同时一起更新的还有SDK Tools等,打开SDK Manager进行更新就OK。如果之前有在使用RC版本的Studio,更新覆盖之后应该会出错,那是因为Stuido 1.0默认使用1.0的Gradle插件,所以只需到项目根目录的 build.gradle 更新成如下代码然后同步下就OK了

快捷键

对于很多Eclipse转过来的同学,不适应的最主要就是快捷键部分了,Studio默认的快捷键和Eclipse差别很大,但是Studio强大的地方在于通过设置你可以一直沿用Eclipse风格的快捷键,这样对于那些Eclipse过渡来的同学省了很多学习成本。
Preferences -> Keymap 然后就可以选择你想要的快捷键,这里不止可以选择Eclipse,还可以选择 EmacsNet Beans等编辑器的快捷键
对于新手们或者对Eclipse没有好感的同学们,肯定想学习默认的Studio快捷键,下面整理了下常用的一些快捷键,更多的快捷键还需要大家自己去习惯适应。(我自己选择的是Mac OS X 10.5+)
ActionMac OSXWin/Linux
注释代码(//)Cmd + /Ctrl + /
注释代码(/**/)Cmd + Option + /Ctrl + Alt + /
格式化代码Cmd + Option + LCtrl + Alt + L
清除无效包引用Option + Control + OAlt + Ctrl + O
查找Cmd + FCtrl + F
查找+替换Cmd + RCtrl + R
上下移动代码Option + Shift + Up/DownAlt + Shift + Up/Down
删除行Cmd + DeleteCtrl + Y
扩大缩小选中范围Option + Up/DownCtrl + W/Ctrl + Shift + W
快捷生成结构体Cmd + Option + TCtrl + Alt + T
快捷覆写方法Ctrl + OCtrl + O
快捷定位到行首/尾Cmd + Left/RightCtrl + Left/Right
折叠展开代码块Cmd + Plus,MinusCtrl + Plus/Minus
折叠展开全部代码块Cmd + Shift + Plus,MinusCtrl + Shift + Plus,Minus
文件方法结构Cmd + F12Ctrl + F12
查找调用的位置Ctrl + Option + HCtrl + Alt + H
大小写转换Cmd + Shift + UCtrl + Shift + U
(PS: 以上快捷键没有在win平台尝试确认,欢迎反馈错误与补充)

自动导包

最后再介绍一个最有用的设置,我们只有每次引用一些类的时候必须要导包,而Studio可以通过设置自动导包,简直太实用了.
到 Preferences -> Editor -> Auto Import -> Java 把以下选项勾上就OK了
从此世界清静了。。。
至此Android Studio的基本使用相信大家都已经会了,从下一系列开始介绍Gradle语法以及基本配置与多渠道打包等,敬请期待!

2015年2月5日星期四

Android Studio如何更改SDK的版本(针对非gradle)

最近事情太多了,也有一小段时间没更新了,本来原来还有个写哪些的计划的,也打乱了,我就想到什么写什么吧。
最近很多人在问Android Studio如何更改SDK版本,这边说的事不使用gradle来编译的情况下。什么时候会出现这个场景呢,比如你直接从server check工程。或者导入一个非gradle的工程。比如eclipse的工程,你没有export,然后直接import进入Android studio。
那如何更改SDK版本呢,首先我要说明下,在你import的时候,步骤中会有有一个界面是供你选择SDK版本的,建议在这边直接选择,因为Android studio其实关于改SDK版本还是有bug的,你有时候改了并不会生效,不过这个bug很难碰到。
import工程时,设置SDK版本的图:
如何改了,依照惯例,我直接上图吧:
File-->Project structure,打开如下界面,这个是改整个工程的SDK版本:
这里是针对不同的module进行更改。
好了,选择你要的sdk的版本,apply,然后再ok,大功告成。

Note:这是针对非gradle,gradle的稍稍有点区别,后面会有针对gradle的文章。不用在意图怎么一下风格是白色的,一下是黑色的,文章如果是用公司电脑写的,就是黑色的,用自己电脑搞的,就是白色的,因为我两台电脑用的as的主题不一样。

Android Studio使用第三方的JAR包

Android Studio导入第三方类库的方法

本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比Eclipse好用吧,反正以前没有java开发经验,索性就从android studio开始学,以前一直是做.net的开发,最近使用了Eclipse,Android Studio之后发现Visual studio.net正式太好用了,不得不说微软的开发工具做的比谁都好。下面是我在使用Android Studio应用第三类库刚开始的时候走了不少弯路,所以写下来给和我一样的初学者,分享一下

导入*.jar包

新建好了Android项目,添加一个第三方已经打包好的jar文件进你项目,下面就已添加一个odata4j的一个包
在项目中添加一个libs文件
直接通过COPY/PAST 把你下载的jar文件添加到libs文件夹下
然后在libs文件夹和添加的*.jar文件下鼠标单击菜单 add as library
然后在选择项目单击Open Module Settings,在Dependencies中选择添加文件
这样就完成了jar文件添加
打开App目录下有个build.gradle文件应该项目结构文件,上述的动作只是为了在在文件下添加
dependencies {
compile files('libs/android-support-v13.jar')
compile files('libs/odata4j-0.7.0-clientbundle.jar')
}

导入第三方java类库含源代码包

下面演示如何在本项目中导入第三方的源代码类库,这里例子是导入Httpzoid一个json http client类库
先从github上下载zip包解压后把Httpzoid目录copy到你项目的目录下
添加后android studio的项目下会自动出现这个目录
接下来需要手工修改项目跟目录下settings.gadle 添加
include ':App',':Httpzoid'
这里必须手工修改没有其他方法
然后在打开App/build.gradle这个文件,添加
dependencies{
compile project(':Httpzoid')
}
这是你在打开Open Module Settings就可以看到,已经导入httpzoid的类库

但是编译肯定还是会错误的
还必须在项目Httpzoid目录下添加一个build.gradle的这个文件,内容如下

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
}
apply plugin: 'android-library'

repositories {
mavenCentral()
}

android {
compileSdkVersion 18
buildToolsVersion "17.0.0"

defaultConfig {
minSdkVersion 14
targetSdkVersion 18
}


sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
}
}
}

dependencies {
compile 'com.android.support:appcompat-v7:+'
compile files('libs/gson-2.2.4.jar')
}


这是后编译还会有可能报错
这时候可能需要修改一下Httpzoid目录下的AndroidManifest.xml文件有可能存在和你项目中文件有冲突或版本跨度太大导致语法的错误修改一下

做完以上几步基本上就可以便宜成功了

2015年2月3日星期二

php 使用 array() 一些注意点

我在做 php与界面使用json格式交互的时候
本来想以 array([aa]:1,[aa]:2)这种格式,也就是key名相同的方式读取.
但是结果发现 array无法累计添加 key名为相同的数据. 比如


$ar=array("aa"=>"1","aa"=>"2");
print_r($ar) ;
但是结果为 
 Array ( [aa] => 2 )。

解决方法是使用 二维数组.
array_push($br,array("aa"=>"1"));array_push($br,array("aa"=>"2"));print_r($br);
那么结果为
Array ( [0] => Array ( [aa] => 1 ) [1] => Array ( [aa] => 2 ) )

这样即使你转换了 json_encode($br); 页面也可以正常读取.

...
sucsses:function(date){

  $.each(date,function(index,item)){
     item.aa;
  }
}

PHP 使用 MYSQL


使用Mysql首先要连接数据库,并调用指定数据库

//连接数据库
$_consql=mysql_connect("localhost","root","china123");if($_consql){
    //连接成功,则调用数据库    mysql_select_db("fashiondb",$_consql);    $_error=mysql_error();
    //如果没有错误就表明连接成功了    if($_error == null){        return true;    }else{        return false;    }}else{    return false;}


如果连接了数据库那就是进行一系列 增删改查的操作.

先来看看查询。
$sql="select * from menutype where userid='".$_GET["userid"]."'";            $result=mysql_query($sql);
            while($row=mysql_fetch_array($result)){
                echo $row["menutypename"];
            }
这样你就可以循环查询数据了.

当然你如果想判断当前数据是否存在可以使用
mysql_num_rows($result) >0