組件化實踐記錄——在library module的manifest中使用applicationId

image

需求

在集成第三方的sdk時,某些時候第三方sdk會需要applicationID,舉個栗子:

當我們集成 融云即時通訊 時距贷,需要在Manifest中聲明,如下所示:


    android:authorities="應(yīng)用包名.FileProvider"

    android:name="android.support.v4.content.FileProvider"

    android:grantUriPermissions="true"

    android:exported="false">

    android:name="android.support.FILE_PROVIDER_PATHS"

    android:resource="@xml/file_paths" />

沒有進行組件化時吻谋,很簡單忠蝗,我們只需要在manifest中直接聲明即可。

組件化之后 漓拾,如果我們想在base module里面聲明的話阁最,是不行的戒祠,因為base module作為一個library是沒有applicationId的。

解決思路

1速种、依然像以前那樣寫死


// Manifest.xml

   <provider
    android:authorities="@string/fileprovider"
    android:name="android.support.v4.content.FileProvider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
   </provider>


// file_provider.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="fileprovider">com.xxx.fileprovider</string>
</resources>

這種方式試驗了下姜盈,provoder是可以正常使用,但是融云沒試驗過配阵,包名在base module里面寫死了馏颂,感覺不舒服,難道我在其他項目compile了棋傍,還要回來改包名救拉,不不不,拒絕拒絕瘫拣。

2亿絮、覆蓋思路,能不能在base module里面定義一個變量并在manifest里面使用拂铡,然后在app module里面定義個相同的變量壹无,達到覆蓋修改的目的。于是采用manifestPlaceholders(此思路來自stack overflow)

實現(xiàn)1

首先感帅,在 base library的 build.gradle 中的defaultConfig{}里面設(shè)置manifestPlaceholders = [ PROVIDER_AUTH:""]斗锭,

然后,在 base library的 manifest里面設(shè)置<provider android:authorities="${PROVIDER_AUTH}"></provider>,

最后失球,在 App module 中的defaultConfig{}里面設(shè)置manifestPlaceholders = [ PROVIDER_AUTH: applicationId+".FileProvider"]

結(jié)果是不行岖是,最終build出來的manifest里面的<provider android:authorities=""></provider>,authorities沒有重新被賦值

更新自2018.10.10

后來使用極光推送sdk的時候發(fā)現(xiàn)实苞,他也是使用manifestPlaceholders的方式來達成在Manifest中使用applicationId的豺撑,詳細見下:
在編譯好的manifest中會發(fā)現(xiàn)幾個provider,例如:

<provider
  android:name="cn.jpush.android.service.DataProvider"
  android:authorities="com.xxx.yyy.DataProvider"
  android:exported="false" />

然后極光文檔要求我們在使用的時候要在我們的app build.gradle中這樣使用:

manifestPlaceholders = [
  JPUSH_PKGNAME: applicationId,
  ...
]

于是猜想黔牵,在極光的sdk中的manifest中聪轿,應(yīng)該有如下代碼:

<provider
  android:name="cn.jpush.android.service.DataProvider"
  android:authorities="${JPUSH_PKGNAME}.DataProvider"
  android:exported="false" />

于是我們可以依葫蘆畫瓢,在我們的base library的manifest中這樣寫:

<provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="${PKG_NAME}.FileProvider"
  android:exported="false"
  android:grantUriPermissions="true">
    <meta-data
       android:name="android.support.FILE_PROVIDER_PATHS"
       android:resource="@xml/file_paths" />
 </provider>

然后在我們的業(yè)務(wù)module中這樣寫:

defaultConfig {
  applicationId "com.xxx.yyy"
  ...
  manifestPlaceholders = [
    PKG_NAME:applicationId
  ]
  ...
}

這樣我們就達成了在base module 的manifest中使用applicationId的目的啦猾浦,編譯出來的業(yè)務(wù)module的manifest中陆错,就會有

<provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="com.xxx.yyy.FileProvider"
  android:exported="false"
  android:grantUriPermissions="true">
    <meta-data
       android:name="android.support.FILE_PROVIDER_PATHS"
       android:resource="@xml/file_paths" />
 </provider>

當然,這里還有個小問題金赦,就是我們的base library會報錯音瓷,說我們base library的manifest里面有個占位符PKG_NAME沒有在build.gradle中聲明,就和我們在使用極光sdk時夹抗,沒有在業(yè)務(wù)module 的build.gradle中聲明

manifestPlaceholders = [
  JPUSH_PKGNAME: applicationId,
  ...
]

一樣绳慎。

雖然我們依然可以提交到maven中,但是紅紅的,就是不舒服杏愤,于是我們可以在base library 的buildTypes的debug中聲明一下PKG_NAME靡砌,如下:

buildTypes {
        ...
        debug{
            manifestPlaceholders = [
                    PKG_NAME:"",
            ]
        }
        ...
}

至此更新完結(jié)...

評論區(qū)說app module中的manifestPlaceholders不會影響base library的manifestPlaceholders,這里貼一下我的實驗結(jié)果珊楼,可能每個人的做法有一點差異乏奥,導致結(jié)果不一樣:

Base Library中的Manifest文件.png

Base Library中聲明的manifestPlaceHolder變量.png
Base Library編譯后生成的manifest文件.png
app module中聲明的manifestPlaceHolder變量.png
app module編譯后生成的manifest文件.png

通過以上結(jié)果可以看出,app module中的manifestPlaceHolder是會覆蓋掉base library中的manifestPlaceHolder的值亥曹。值得注意的是邓了,我這里的base library是以 aar的形式 提供給app module依賴的,而不是以 project的形式 提供的媳瞪。

實現(xiàn)2

在 base library的 manifest里面使用占位符骗炉,具體如下:

// base library的 manifest:
<provider android:authorities="P_AUTHORITY"></provider>

然后在 app module 的build.gradle里面修改base library的 manifest里的占位符的值,具體如下:

buildTypes {
            android.applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.processManifest.doLast{
                        println variant.applicationId+".FileProvider"
                        replaceInManifest(output, 'P_AUTHORITY', variant.applicationId+".FileProvider")
                    }
                }
            }
  }

這種方式試驗了下蛇受,provider也是可以正常工作的句葵,為了不在每個app module里面都重復寫這段代碼,我們可以將他放在common.gradle里面兢仰,用的時候compile就行啦乍丈,done.

如果各位大神有更好的實現(xiàn)方式,麻煩告知下把将,蟹蟹??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轻专,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子察蹲,更是在濱河造成了極大的恐慌请垛,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洽议,死亡現(xiàn)場離奇詭異宗收,居然都是意外死亡,警方通過查閱死者的電腦和手機亚兄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門混稽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人审胚,你說我怎么就攤上這事匈勋。” “怎么了菲盾?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵颓影,是天一觀的道長各淀。 經(jīng)常有香客問我懒鉴,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任临谱,我火速辦了婚禮璃俗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悉默。我一直安慰自己城豁,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布抄课。 她就那樣靜靜地躺著唱星,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跟磨。 梳的紋絲不亂的頭發(fā)上间聊,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音抵拘,去河邊找鬼哎榴。 笑死,一個胖子當著我的面吹牛僵蛛,可吹牛的內(nèi)容都是我干的尚蝌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼充尉,長吁一口氣:“原來是場噩夢啊……” “哼飘言!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驼侠,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤热凹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泪电,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體般妙,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年相速,在試婚紗的時候發(fā)現(xiàn)自己被綠了碟渺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡突诬,死狀恐怖苫拍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旺隙,我是刑警寧澤绒极,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蔬捷,受9級特大地震影響垄提,放射性物質(zhì)發(fā)生泄漏榔袋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一铡俐、第九天 我趴在偏房一處隱蔽的房頂上張望凰兑。 院中可真熱鬧,春花似錦审丘、人聲如沸吏够。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锅知。三九已至,卻和暖如春脓钾,著一層夾襖步出監(jiān)牢的瞬間喉镰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工惭笑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侣姆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓沉噩,卻偏偏與公主長得像捺宗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子川蒙,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344