2013年7月10日 星期三

android初體驗 - 如何將lib打包為.jar後還能存取到其中的activity與resource


繼上一篇的使用Lib
前情提要:
最近因為案子需要開始接觸android,完全沒碰過android的我只能硬者頭皮上架,第一個就遇到問題:
因為我的lib有activity,所以如果直接做成.jar供Client呼叫,如下方式:

 
Intent intent = new Intent(v.getContext(),  LibMainActivity.class);
intent.putExtra("userid", "breeze");
intent.putExtra("facextra", "server_1");
startActivity(intent);

會在執行時出現 classdefnotfound exception!
後來找了一下文章,官方提到以下面的方式使用lib:(看友方(?)的使用文件也是一樣方式)
Setting up a Library Project

但很明顯的..這個等於完全將我的垃圾Code 曝露給其他人看到了啊!!(雖然說直接給jar照樣能反組...但至少沒那麼蠢....0rz..)

然後後來看到facebook sdk也是一樣這樣做法,心想可能真的就得如此做了吧,再加上隔天就要交差實在找不到解法的情況下,第二天只好這樣子交給廠商了,結果......

第二天廠商表明他們使用U3D開發,不是純android project,所以無法這樣include Lib,但是因為我真的不懂要怎麼弄成jar還能順利將activity成功啟動...因此他就自己做掉了,厚者臉皮詢問下他跟我說只要將R.id.xxx的resource拿掉改成如下方式:

 
 public static int getLayoutId(Context ctx,String paramString){
  return ctx.getResources().getIdentifier(paramString, "layout", ctx.getPackageName());
 }
 
就可以了,我照者試做,的確把所有的R.id.xxx的引用點改掉,原先為:

 
TextView text = (TextView) findViewById(R.id.noticeText);

改為:
 
  int rid = ResourceUtil.getId(LibMainActivity.this,"noticeText");
  TextView text = (TextView) findViewById(rid);

的確可以運作成功,可是!!!打包成.jar一樣會有錯誤阿!!!
找了半天終於找到解答了,簡單說明就是(明明打了很多廢話還簡單說明...)

  1. 將所有R.id.xxx的引用方式改為上述使用
  2. 所有資源檔的名字不能重複:例如預設的activity_main.xml就最好不要使用,因為使用的client也有可能很偷懶用了預設名稱
  3. 將所有lib會使用到的activity在Client的AndroidManifest.xml中也一併宣告,請參考下方的Declaring library components in the manifest file
  4. lib打包成jar時,除了選擇src以外其他都不能選擇
  5. 將打包好的jar置放(貼)於client project的 libs/ 底下
  6. 將所有會引用到的resource一併手動複製貼到client端的resource對應位置(資料夾下),例如res/layout/...
所以這麼一來雖然每次release時都要給出lib.jar與resource,但的確感覺比直接給出整個lib project要來的好得多了。
詳細圖文請參考Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

p.s剛剛才發現這篇文章是2013/7/6發布的耶!!!今天是2013/7/10,我真要感謝他剛好在我有問題前幾天發文...

沒有留言:

張貼留言