鍍金池/ 教程/ Android/ <a rel="nofollow" href="http://tools.android.com/tech-docs/new-b
Launch mode 和 Intent flags專題
Canvas &amp; Drawables
UTAustinX_UT.9.01x: Effective Thinking Through Mathematics
《JavaScript 語言精粹》
Memory leak專題
React基礎(chǔ)
《Test Driven Development: By Example》一書
Developer tools
安卓開發(fā)技能樹
<a rel="nofollow" href="https://mp.weixin.qq.com/s?__biz=MzA3NDM
Best Practices for Interaction and Engagement
各個安卓版本引入的主要新特性
Building Apps with Connectivity &amp; the Cloud
List.toArray()再強轉(zhuǎn)是一定會失敗的
深入Android frameworks
Google dev 100 days系列視頻
Building Apps with Contacts &amp; Sign-In
關(guān)系型數(shù)據(jù)庫設(shè)計范式
《App研發(fā)錄》一書
REST API設(shè)計
Google IO 2015摘要
自定義View/ViewGroup以及高性能實現(xiàn)自定義UI
安卓系統(tǒng)點擊事件處理
《50 Android Hacks》一書
Building Apps with Content Sharing
Flux基礎(chǔ)
<a rel="nofollow" href="http://developer.android.com/training/in
依賴注入(以Dagger 2為例)
Java同步機制
Java對象內(nèi)存的使用情況
JSR133(Java memory model)
Google官方Material Design手冊(<a rel="nofollow" href="http://develop
Futurice公司安卓團隊的建議
安卓性能優(yōu)化
  • 1.
Best Practices for Performance
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
<a rel="nofollow" href="http://blog.danlew.net/2014/11/19/styles
Handling Runtime Changes
<a rel="nofollow" href="http://www.vogella.com/tutorials/Android
Building Apps with Graphics &amp; Animation
<a rel="nofollow" href="http://tools.android.com/tech-docs/new-b
Android項目架構(gòu)
MVP(Model-View-Presenter)模式
<a rel="nofollow" href="http://www.infoq.com/cn/es6-in-depth/"">
《Android源碼設(shè)計模式解析與實戰(zhàn)》一書
Rx在Android中的最佳實踐
函數(shù)調(diào)用時,傳遞參數(shù)應該是不可變的(Immutable)
ProGuard
面向?qū)ο罅笤瓌t(SOLID+)
深入理解Java虛擬機
深入Java深淺拷貝、immutable、unmodifiable
Best Practices for User Input
UI上的一些高效方式/最佳實踐
<a rel="nofollow" href="https://blog.stylingandroid.com/ripples-
Best Practices for User Interface
安卓測試驅(qū)動開發(fā)/安卓測試驗證
暗時間:學會正確思考
技術(shù)筆記
Aspect Oriented Programming(AOP)
Best Practices for Background Jobs
安卓系統(tǒng)動效專題
Feed系統(tǒng)的設(shè)計
Data binding(MVVM,Model-View-ViewModel)
Effective Java一書筆記
<a rel="nofollow" href="http://developer.android.com/training/in
Rx (Reactive eXtention)
MultiDex專題
一些很棒的點子
WebRTC

<a rel="nofollow" href="http://tools.android.com/tech-docs/new-b

優(yōu)勢

  • 支持多渠道、多APK打包;

Multi-flavor

  • src目錄下有main文件夾,這是app的base部分;
  • 支持多種flavor/variant,例如debug,release,paid,free等,分別在src目錄下創(chuàng)建相應的文件夾,編寫相應的代碼;main文件夾下的代碼是共用的,而相應文件下下的代碼只在相應flavor/variant中使用;
  • 每個文件夾下都可以編寫自己的java代碼,使用自己的res資源文件等;
  • 在Android studio的build variants面板中可以選擇構(gòu)建的flavor;

文件結(jié)構(gòu)如下圖:

http://wiki.jikexueyuan.com/project/notes/images/xflavour_folder_structure.png" alt="xflavour_folder_structure.png" />

Basic Project

  • 工程結(jié)構(gòu):創(chuàng)建新工程時,自動會生成main和androidTest目錄,分別存放工程文件和測試代碼;androidTest目錄下不需要manifest文件,將自動生成;
  • 可以通過配置,修改/重新指定各種文件的位置:

        android {
            sourceSets {
                main {
                    manifest.srcFile 'AndroidManifest.xml'
                    java.srcDirs = ['src']
                    resources.srcDirs = ['src']
                    aidl.srcDirs = ['src']
                    renderscript.srcDirs = ['src']
                    res.srcDirs = ['res']
                    assets.srcDirs = ['assets']
                }
    
                androidTest.setRoot('tests')
            }
        }
  • tasks:apply plugin時,會自動添加plugin定義的task(java和android包括:assemble,check,build,clean。build包括assemble和check);
  • 和make類似,上次執(zhí)行之后沒有改變的task下次將不會執(zhí)行;
  • build的配置可以動態(tài)化:

      def computeVersionName() {
          ...
      }
    
      android {
          compileSdkVersion 19
          buildToolsVersion "19.0.0"
    
          defaultConfig {
              versionCode 12
              versionName computeVersionName()
              minSdkVersion 16
              targetSdkVersion 16
          }
      }

    注意:方法名不能和默認的getter重名;

  • buildTypes && productFlavors 配置不同的打包類型,兩者為組合關(guān)系;
    • Build Type + Product Flavor = Build Variant
    • 不同buildTypes的sourceSets可以重新指定;會創(chuàng)建對應的assemble<BuildTypeName> task;
    • main和不同類型的manifest文件將會合并;資源文件也將合并,同名的將以具體build type覆蓋main中的資源;

依賴、安卓庫、多工程配置

  • 聲明依賴

    • 本地jar文件:

      
        dependencies {
            compile files('libs/foo.jar')
        }
    • 遠程依賴:

        repositories {
            mavenCentral()
        }
      
        dependencies {
            compile 'com.google.guava:guava:11.0.2'
        }
    • library project依賴:

      
        dependencies {
            compile project(':libraries:lib1')
        }
  • 依賴類型
    • compile:用于主應用程序的依賴編譯,所有的內(nèi)容都會加入到classpath中,并且打包到APK文件中;
    • androidTestCompile:用于集成測試程序(或稱InstrumentatinTest);
    • testCompile:用于單元測試;
    • provided:??TODO??
    • debugCompile:debug Build Type;
    • releaseCompile:release Build Type;
    • APK文件總是使用兩種依賴類型:compile和<buildtype>Compile;
    • 創(chuàng)建新的build type,就可以使用對應的<buildtype>Compile聲明依賴;
  • library project最終將打包為.aar文件,包含編譯后的代碼、資源文件;library在被其他工程引用時,其依賴只有compile類型的才會被繼承;

命令行運行

  • 如果不clean,將采用遞增式編譯,即之前已編譯、且無修改的部分,將不會編譯;
  • 第一次運行的時候加上-–daemon選項,將讓gradle后臺運行,后續(xù)編譯將節(jié)省gradle初始化的時間;

創(chuàng)建自定義task

  • 添加task

    
      task custom(description: 'This is our custom task') << { task ->
          println "Running task ${task.name}"
      }
  • task的執(zhí)行時機

    • Configuration stage
    • Execution stage
    • 默認task的執(zhí)行時機均是Configuration stage,即便指定其他task,也會被觸發(fā)執(zhí)行
    • 可以通過doLast語句塊,來保證只有在明確指定執(zhí)行task時才會執(zhí)行,而doLast塊外的代碼,將在任何任務執(zhí)行時都會執(zhí)行
    • <<操作符
        task myTask2 << {
            println "Hello, World!" 
        }

      相當于整個task都在doLast塊內(nèi)

  • 添加task的依賴

    
        assemble.dependsOn 'custom'
    

    assemble將依賴于custom,即custom執(zhí)行后才能執(zhí)行assemble;這樣是將custom添加到了assemble的最后一個依賴;

  • 使用rule延遲創(chuàng)建task

      assemble.dependsOn(‘customAssemble’)
    
      tasks.addRule(“Pattern: customAssemble“) { taskName ->
        println “Creating task ${taskName}”
        if (taskName.equals(“customAssemble”)) {
          android.applicationVariants.each { variant ->
            println “Adding dependency to assemble${variant.name}”
            def targetTask = project.tasks.findByName(“assemble${variant.name}”)
            if(targetTask != null) {
              targetTask.dependsOn(“customAssemble${variant.name}”)
            }
          }
        }
        task(taskName) << { task ->
          println “Running custom task ${task.name}”
        }
      }

巧用Product Flavor

不同的版本,使用不同的服務器配置,不同的icon,不同的包名等,使用product flavor非常方便;可以在product flavor配置里面設(shè)置控制變量,主代碼根據(jù)控制變量來控制行為;

productFlavors {
        rd {
            applicationId "zuul.com.android.rd"
            buildConfigField "boolean", "LOG_TIMBER", "true"
            buildConfigField "boolean", "LOG_STETHO", "true"
            buildConfigField "boolean", "SHOW_LOGGIN_PHONE", "true"
        }
}

資源文件(drawable,string,style等)、代碼文件,都可以為不同的flavor創(chuàng)建相應的文件夾,進行個性化配置;

語法

  • 基于Groovy;closure是很常見的基本元素;調(diào)用方法如下:
    http://wiki.jikexueyuan.com/project/notes/images/groovy_closure_invoke_syntax.png" alt="groovy_closure_invoke_syntax.png" />
  • build.gradle:
    • buildscript是在gradle系統(tǒng)中定義的一個方法,接受一個closure作為參數(shù);
    • gradle腳本所有的頂層代碼都是delegate到Project實例context上;
    • script block:把一個closure傳遞到一個方法中,同時調(diào)用該方法;