随着Android系統的日益發展和日漸成熟,各種平台的合作就日漸頻繁。現在主要網際網路公司,都退出了各種各樣的插件功能。如第三方支付,第三方聯合登陸和微網誌分享等等功能。
近期由于業務的需要,公司提出将項目的功能打成jar包,提供給其它客戶調用。經過一段時間的調查研究和實踐,先将解決辦法總結如下。
- 直接将布局檔案通過代碼來寫,然後直接導出src目錄檔案成jar.
- 将src目錄導出成jar,然後把res和jar同時提供給第三方。
- 通過aapt把資源打包進jar進行調用。
第一種方法我們就不讨論了,如果項目的界面不多而且比較簡單采用這種方法比較适合。如果比較大,資源比較多,那可以把你寫到吐血了.
之前我們公司一直采用的是第二種方法。這種方法簡單友善,缺點是第三方可以随意更改你的布局檔案,導緻出錯(雖然他們很少會這樣做),而且沒法發包給第三方的時候都要發很多的資源包,少發一個都可能導緻出錯,維護起來比較麻煩。
是以想着通過aapt打包資源的方式打包進jar進行釋出。
首先先來了解一下概念。
Android查找資源的流程 http://blog.csdn.net/qq_32115439/article/details/55184022
有了這個概念後剩下的就會好了解很多。
偶然發現,在android開發時候,其實我們可以自定義資源的存放位置。怎麼弄呢?隻要将上面的代碼放到values下面(類似strings檔案格式,但type是layout),就會有一個R.layout.xxx的id指定到r/dir/xxx.xml,當然圖檔資源也可以這樣用,type是drawable。
而我們可以直接在工程的src項目下建立r.dir的包名,未來打jar會自動打包成目錄的。
關鍵是xml檔案,這裡我們r.dir不能再放源檔案了,需要放用aapt編譯的二進制檔案。但是該方法也存在一個限制,就是你的values必須是源檔案跟随調用你jar的主工程編譯
接下來看具體的步驟:
1,在你的library工程src檔案下建立demo檔案夾,檔案夾下放入通過aapt編譯之後的二進制res資源檔案。
2,在你的library工程vlues下建立一個public.xml檔案如下
<resources>
<item type="layout" name="finalactivity">demo/activity_final.xml</item>
</resources>
3,library工程中引用資源
public class FinalActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getResources().getIdentifier("finalactivity", "layout", "com.example.testactivity"));//com.example.testactivity為合作方的包名,finalactivity為你在public.xml中的命名
TextView view=(TextView) findViewById(R.id.textview);//這裡的id就不需要在public.xml中配置了
view.setText("123456");
}
}

4,導出jar包(隻要勾選src就行了)同時把values下的public.xml提供給合作方。
5,合作方拿到jar進行加載,然後把public.xml複制到自己的values下編譯運作就可以了。
這是唯一的缺點吧,values必須在合作方的源檔案下編輯才能成功。
**接下來我來講講如果擷取appt編譯後的二進制檔案
你可以通過aapt工具進行編譯res資源檔案然後會輸出R.java檔案和resources.ap_。了解過的朋友應該知道resources.ap_ 就相當于一個zip檔案壓縮包,重命名resource.ap_為resource.zip,通過解壓工具unzip或者指令進行解壓,這是我解壓後的檔案目錄
這裡的檔案就是經過aapt編譯的二進制檔案。取出來放到src的demo檔案下舉行了(檔案名可以自己定);
你還可以直接編譯library工程,會在bin目錄下直接生成resources.ap_ 直接用。**
如果大家有更好的辦法,歡迎分享給我。