關于Android動態注入的一點思考 AbstractProcessor

閱讀了下 Retrofit 的源碼,非常喜歡它用注解來創建網絡請求。 通過Retrofit創建一個網絡請求非常方便,在注解里定義幾個參數就可以非常方便的創建出來一個Call用于請求網絡。

@POST("oauth2/token/")Call<AccessToken> getAccessToken(
  @Field("username") String username,        
  @Field("password") String password,        
  @Field("grant_type") String grant_type,        
  @Field("scope") String scope,        
  @Field("client_id") String client_id        
);

但是遺憾是它的注解都是在Runtime時候進行解析的, 這樣的話就會用到反射,會影響我們執行的效率。 于是我就想可不可以像ButterKnife那樣, 通過編譯時候來處理注解然后自動生成我們想要的代碼,這樣子就不會影響程序的執行效率了。ButterKnife主要是通過創建一個Processor(繼承于AbstractProcessor) 來在編譯的時候來處理注解的, 然后再配合上JavaPoet 來生成自己想要的代碼。

Step1

需要創建一個javalib 依賴庫

創建lib庫

然后在build.gradle加入AutoSerivce和JavaPoet依賴庫

compile 'com.google.auto:auto-common:0.6'
compile 'com.google.auto.service:auto-service:1.0-rc2'
compile 'com.squareup:javapoet:1.7.0'

創建一個processor類然后繼承abstractprocessor

@AutoService(Processor.class)
public class AutoProcessor extends AbstractProcessor 

然后把你想處理的注解類注冊一下

private Set<Class<? extends Annotation>> getSupportedAnnotations() {    Set<Class<? extends Annotation>> annotations = new LinkedHashSet<>();    annotations.add(GET.class);    
annotations.add(POST.class);    
annotations.add(GETParam.class);    
annotations.add(POSTParam.class);    
annotations.add(Package.class);   
 return annotations;
}
private String parseParamNameValue(String value) {    
int length = value.indexOf("(");    
String parsedValue = value.substring(0, length);    
return parsedValue;
}

這時候你可以在process函數里去處理相應的注解了。

Step2

如果想在編譯時候調試代碼
需要在gradle.properties里加入

org.gradle.daemon=true
org.gradle.jvmargs=agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007

然后啟動一個remote調試,配置上跟你properties相應的端口號

調試

這時候通過terminal進入你項目的目錄下
通過gradle啟動daemon進程
輸入gradle daemon
當守護進程啟動起來后, debug剛剛創建的remote進行調試,接下來在你的代碼上打上斷點
最后輸入gradle clean assembleDebug進行編譯, 這時候會在你打的斷點上停下來。


如圖所示

配置gradle環境變量
sudo vim ~/.bash_profile

GRADE_HOME=/Users/Admin/gradle;
export GRADE_HOME
export PATH=/opt/local/bin:/opt/local/sbin:$PATH:$GRADE_HOME/bin
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容