1. 程式人生 > >Android專案快速編譯之Freeline-Android的配置與整合

Android專案快速編譯之Freeline-Android的配置與整合

螞蟻金服旗下開發的Freeline,在使用中遇到的一些問題 。做如下整理,希望對大家有幫助

接下來我們就開始整合Freeline到專案中去,主要講一下我在配置的過程中遇到的問題。

首先,Freeline是採用Python編寫的,所以我們需要安裝python環境,根據網上的說法,最好使用python2.7版本(有人使用python3.5無法成功整合)。

 
在python環境安裝成功後,我們就可以著手在專案中整合Freeline了。根據在github中給出的配置的過程,我們先做一下幾件事。

Freeline 初始化環境: 

根目錄下的 build.gradle(工程級別的build.gradle檔案)

buildscript {
     repositories {
         jcenter()
     }
     dependencies {
         classpath 'com.antfortune.freeline:gradle:0.8.5'
     }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

專案下面的 build.gradle(Module級別的build.gradle檔案)

apply plugin: 'com.antfortune.freeline'
 android {
     ...
     freeline {
         hack true
     }
 }
 dependencies {
   compile 'com.antfortune.freeline:runtime:0.8.5'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

自定義的 Application

public class App extends Application {
     @Override
     public void onCreate() {
         super.onCreate();
         FreelineCore.init(this);
     }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

執行完這些步驟以後,接下在命令列(或者AS的終端)中執行以下命令: 

Windows: gradlew.bat initFreeline -Pmirror
Linux/Mac: ./gradlew initFreeline -Pmirror

初始化成功後,執行第一條python命令

python freeline.py

第一次編譯時全量編譯比較慢,第二次就是毫秒級別的了


至此,Freeline已經成功的整合到了我們的專案中,如果覺得每次執行命令列比較繁瑣,可以在AS中安裝Freeline的外掛

File->Settings->plugins->搜尋Freeline即可 
這裡寫圖片描述

這裡寫圖片描述 
安裝後就可以在專案中直接點選相應的圖示使用,其實也是執行python freeline.py這條命令。

  在Android Studio中,通過以下路徑File → Settings → Plugins → Browse repositories,搜尋“freeline”,並安裝。   安裝完之後需要重啟Android Studio。   這時候會有以下圖示     4、點選這個按鈕,第一次點選會自動進行gradle的配置,但是不會自動build。需要自己手動進行,如果不是的話也會有相應提示,仔細找會找到的,操作很簡單。  5、看Android Studio的底部,你會看到以下圖示        開啟Freeline的視窗,跟Terminal的視窗差不多,然後執行 gradlew -initFreeline , 如果Freeline的命令視窗執行不了,可以在Terminal的視窗執行也可以,當然也可以在cmd裡面執行,只不過要切換到專案目錄裡面去執行... 這個操作會下載相應的檔案,如果比較慢或者無法下載那麼就要使用vpn了  6、然後再次點選Freeline的外掛按鈕,預設執行 python freeline.py 也可以手動輸入命令進行編譯,編譯完後會自動安裝到手機上或者模擬器上。 上面就是安裝流程了,下面說下遇見的錯誤,首先:

1、使用Freeline編譯不能使用

     shrinkResources true 
     minifyEnabled true
     兩個命令,所以這兩個命令要去除掉
2、如果專案的gradle中使用了 productFlavors 命令,則要配置
     android{
                 freelin{
	      hack true
              productFlavor "your Flavor's name"
	  }
     }
3、如果使用Freeline過程中出現了使用過時的api或者其他警告,可以使用一下配置
	android {
  	        lintOptions {
      	            abortOnError false
  	      }
	}4、
還有其他一些Freeline相關命令:
python freeline.py -f全部編譯,增量編譯
python freeline.py 
改變編譯
python freeline.py -v檢視版本號
gradlew -initFreeline 
給該專案下載相關Freeline檔案
gradlew initFreeline -Pmirror
使用映象給該專案下載相關Freeline檔案


1.Python版本問題

2.productFlavors問題

在主Module的build.gradle中配置productFlavors,例如:

    productFlavors {
        appstore {
            applicationId 'your package name'
        }
    }
    freeline {
        hack true
        productFlavor 'appstore'
        applicationProxy false
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.could not find class……問題

在Application類中的onCreate()方法中新增FreelineCore.init(this)方法。

public class YourApplication extends Application {

    public onCreate() {
         super.onCreate();
         FreelineCore.init(this);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.能夠正常編譯,但是開啟應用程式崩

在主Module的build.gradle中配置freeline :

freeline {
    applicationProxy false
}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

在Application類中加入:

public class YourApplication extends Application {

    public onCreate() {
         super.onCreate();
         FreelineCore.init(this);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.install apk to device failed

排查方法:

  • 換成系統5.0以上的裝置
  • 刪除手機上的應用程式,進行一次全量編譯(python freeline.py -f)
  • clean專案(gradlew clean),進行全量編譯(python freeline.py -f)

6.連線不到裝置

排查方法如下(建議配合使用Python freeline.py -d):

1.確定FreelineCore.init(this);加入到Application類中,且在onCreate()下的第一行,不要根據是否在主程序做特殊處理,否則可能導致FreelineService無法正常啟動;[Freeline 0.7.0+開始,預設開啟了Application替換,這條可以不用檢查]

2.確定FreelineService以及freeline相關元件是否正常merge到最終的minifest中,最終的manifest路徑在${module}/build/intermediates/manifests中;

3.確定python freeline.py -v與定義在build.gradle中的freeline的版本是否一致;

4.確定是否剛剛執行了清空app資料的操作,freeline快取資料在/data/data路徑,清空app資料也會導致連線不上的問題(執行freeline命令時,通常會有句明顯的日誌反覆出現:server result is -1);

5.確定是否開啟了網路代理導致127.0.0.1被重定向?

* 6.一定要先使用freeline來打全量包,再來進行增量,否則也會出現這個問題。即,freeline的全量編譯與Android-studio自帶的RUN會存在衝突。*

當上述問題都無法解決時,有個終極的解決方案就是重啟試試…不少人通過重啟順利解決連線不上的問題。。。

後續會通過自動化的方式,儘量避免手工排查上述問題。有遇見相關的問題可以具體描述一下,在issue中進行回覆,可以幫忙排查。

連線不到裝置,重點排查第5,6步驟。另外還需在AndroidManifest檔案中新增:

<application
        android:debuggable="true"
                                >
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

注意事項

  • 第一次編譯與沒有使用freeline之前的編譯時間是一樣的,耐心等待就是了。第一次使用全量編譯(python freeline.py -f),但在全量編譯前最好clean一下(gradlew clean),以後的編譯使用python freeline.py就行了。
  • 如果裝置上安裝的不是使用freeline編譯打包的程式,請先解除安裝,否則會無法安裝。ps:後續使用freeline編譯打包安裝完,可能不會自動開啟應用程式。
  • 不支援刪除res/values資源,否則可能導致 aapt 編譯出錯。
  • 不支援Kotlin/Groovy/Scala語言

其他參考連結: http://www.qingpingshan.com/rjbc/az/182819.html