2018-12-28


[Android][Framework]系統(tǒng)jar包擂找,sdk的制作及引用【轉(zhuǎn)】

原文鏈接為:http://wossoneri.github.io/2018/12/09/%5BAndroid%5D%5BFramework%5Dmastering-system-jar-and-sdk/

原文作者: Wossoneri


需求

因為我是開發(fā)ROM的,所以系統(tǒng)的一些改動需要暴露給我們自己的APP患雇。比如:

之前在PowerManager里面添加過一個新接口妈经,用來釋放所有的wake lock淮野,接口調(diào)用如下:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

pm.releaseAll();

現(xiàn)在我們的系統(tǒng)APK需要調(diào)用這個方法,但是因為SDK不包含該方法吹泡,導(dǎo)致APK編譯不通過骤星。所以需要我編譯一個包含新接口方法的jar包交給APK編譯。(生成jar包的方法見該文章

編譯Jar包

其實編譯系統(tǒng)jar包很簡單

make framework

即可得到framework.jar爆哑。

這時候把jar包導(dǎo)入到項目里洞难,發(fā)現(xiàn)缺找不到j(luò)ar包里的方法。這是因為揭朝,Android N使用了Jack編譯队贱。所以編出來的jar包里面沒有class文件,取而代之的是一個優(yōu)化過的dex文件萝勤。

如果要得到包含class文件的jar包露筒,只需要將Jack編譯關(guān)閉即可。

#include $(BUILD_JAVA_LIBRARY)

include $(BUILD_STATIC_JAVA_LIBRARY)

LOCAL_JACK_ENABLED := disabled

這樣再次編譯出來的jar包就是包含class文件的jar包敌卓。

Android Studio導(dǎo)入framework.jar

拷貝framework.jar包到app/libs目錄下

右鍵點擊framework.jar慎式,選擇add as library,作為庫添加到項目趟径。此時看到我們的gradle里dependencies多了一行瘪吏。

implementation files('libs/framework.jar')

因為我們希望這個包只在編譯時起作用,所以需要把implementation改為compileOnly蜗巧,幫助通過編譯掌眠,不打包到apk。

compileOnly files('libs/framework.jar')

也可以通過打開項目的File->Project structure幕屹,界面左側(cè)選擇app蓝丙,右側(cè)選擇Dependencies。引用列表里找到libs/classes.jar望拖,右側(cè)scope選擇compileOnly即可渺尘。

還在Project structure同樣的界面,把

{include=[*.jar], dir=libs}

刪掉说敏∨父或者把dependencies中的一行刪掉:

// implementation fileTree(include: ['*.jar'], dir: 'libs')

目的是明確classes.jar所在的libs目錄不作為一般的庫導(dǎo)入。

在build.gradle添加如下內(nèi)容,使其加入編譯

allprojects {

? ? repositories {

maven{url'https://maven.aliyun.com/repository/public'}

? ? ? ? google()

? ? ? ? jcenter()

? ? }

// 添加下面代碼

? ? gradle.projectsEvaluated {

? ? ? ? tasks.withType(JavaCompile) {

options.compilerArgs <<'-Xbootclasspath/p:app/libs/framework.jar'

? ? ? ? }

? ? }

}

在model的build.gradle里面加入自動更改model.iml文件的代碼医咨。這個代碼的作用是將classes.jar放在索引的第一個枫匾,這樣編譯的時候就會先從我們的jar包查找API,而不是從SDK加載拟淮。

preBuild {

? ? doLast {

defimlFile = file(project.name +".iml")

println'Change '+ project.name +'.iml order'

try{

defparsedXml = (newXmlParser()).parse(imlFile)

defjdkNode = parsedXml.component[1].orderEntry.find { it.'@type'=='jdk'}

parsedXml.component[1].remove(jdkNode)

defsdkString ="Android API "+ android.compileSdkVersion.substring("android-".length()) +" Platform"

newNode(parsedXml.component[1],'orderEntry', ['type':'jdk','jdkName': sdkString,'jdkType':'Android SDK'])

groovy.xml.XmlUtil.serialize(parsedXml,newFileOutputStream(imlFile))

}catch(FileNotFoundException e) {

// nop, iml not found

? ? ? ? }

? ? }

}

至此干茉,需要的操作都已經(jīng)完成。現(xiàn)在在Activity里使用我們的新接口:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

pm.releaseAll();

此時惩歉,releaseAll雖然顯示為紅色等脂,但是編譯時可以通過的。編譯完成放在我們的系統(tǒng)里就可以運行了撑蚌。

此方法也可以解決@hide方法無法訪問的問題上遥,自己做一個去掉@hide注解的jar包調(diào)用即可。但是你的App必須有系統(tǒng)簽名争涌。

SDK制作

前面的方法粉楚,雖然可以讓App訪問系統(tǒng)自定義的API,但是亮垫,有些APP做了很多的外部庫引用模软,我們的jar包因為包含很多系統(tǒng)方法,會導(dǎo)致正常的類引用出現(xiàn)奇怪的錯誤饮潦。這些錯誤很難解決燃异,所以就討論了另外一個方案:做一個SDK,在SDK中調(diào)用系統(tǒng)的方法继蜡,然后讓APP調(diào)用我的SDK回俐。

下面是Android Studio制作SDK的步驟:

創(chuàng)建一個新項目

右鍵項目new module->Android Library->輸入庫名 mysdk

在module內(nèi)創(chuàng)建一個新的class文件,嘗試調(diào)用系統(tǒng)內(nèi)部的方法

publicclassMySDK{

publicstaticvoidforceStopPackage(Context context, String packageName){

? ? ? ? ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

? ? ? ? am.forceStopPackage(packageName);

? ? }

}

我在SDK暴露出來一個系統(tǒng)方法稀并,這樣App要殺掉應(yīng)用就不需要使用反射仅颇,直接調(diào)用我的SDK就可以。

把framework.jar放到module的lib目錄下碘举,在module內(nèi)的gradle添加以下代碼以編譯出module:

dependencies {

compileOnly files('libs/framework.jar')

...

}

gradle.projectsEvaluated {

? ? tasks.withType(JavaCompile) {

? ? ? ? options.compilerArgs.add('-Xbootclasspath/p:libs/framework.jar')

? ? }

}

task makeJar(type: Copy){

? ? delete 'build/libs/MySdk.jar'

? ? from('build/intermediates/bundles/default/')

? ? into('build/libs/')

? ? include('classes.jar')

? ? rename('classes.jar','MySdk.jar')

}

makeJar.dependsOn(build)

在Gradle菜單雙擊makeJar進行模塊編譯忘瓦,會在sdk里的build/outputs/aar出現(xiàn)

mysdk-debug.aar和mysdk-release.aar兩個庫文件。

將aar文件拷貝到App項目的lib目錄下引颈,gradle添加

android {

repositories {

? ? ? ? flatDir {

? ? ? ? ? ? dirs 'libs'

? ? ? ? }

? ? }

}


dependencies {

...

? ? compile(name:'mysdk', ext:'aar')

}

然后就可以在對應(yīng)Activity里快樂地使用MySDK.forceStopPackage()調(diào)用系統(tǒng)方法了耕皮。而且這還有個好處,一些系統(tǒng)API調(diào)用需要在Manifest添加對應(yīng)權(quán)限蝙场,這樣調(diào)用后就不需要添加權(quán)限了明场。

問題

gradle版本變化報錯:

Invoke-customs are only supported starting with android 0 --min-api 26

解決辦法:在build.gradle下添加如下代碼

android {

? ? compileOptions {

? ? ? ? sourceCompatibility JavaVersion.VERSION_1_8

? ? ? ? targetCompatibility JavaVersion.VERSION_1_8

? ? }

}

https://stackoverflow.com/a/50198499/4522227

Ref:https://blog.csdn.net/zhonghe1114/article/details/80923730

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市李丰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逼泣,老刑警劉巖趴泌,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舟舒,死亡現(xiàn)場離奇詭異,居然都是意外死亡嗜憔,警方通過查閱死者的電腦和手機秃励,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吉捶,“玉大人夺鲜,你說我怎么就攤上這事∧盘颍” “怎么了币励?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長珊拼。 經(jīng)常有香客問我食呻,道長,這世上最難降的妖魔是什么澎现? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任仅胞,我火速辦了婚禮,結(jié)果婚禮上剑辫,老公的妹妹穿的比我還像新娘干旧。我一直安慰自己,他們只是感情好妹蔽,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布椎眯。 她就那樣靜靜地躺著,像睡著了一般讹开。 火紅的嫁衣襯著肌膚如雪盅视。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天旦万,我揣著相機與錄音闹击,去河邊找鬼。 笑死成艘,一個胖子當(dāng)著我的面吹牛赏半,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淆两,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼断箫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秋冰?” 一聲冷哼從身側(cè)響起仲义,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后埃撵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赵颅,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年暂刘,在試婚紗的時候發(fā)現(xiàn)自己被綠了饺谬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡谣拣,死狀恐怖募寨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情森缠,我是刑警寧澤拔鹰,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站辅鲸,受9級特大地震影響格郁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜独悴,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一例书、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刻炒,春花似錦决采、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爱谁,卻和暖如春晒喷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背访敌。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工凉敲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寺旺。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓爷抓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阻塑。 傳聞我的和親對象是個殘疾皇子蓝撇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 火輪高懸灑蒼旻,野田龜裂半塘燊陈莽。 云蒸滿山一地酷渤昌,氣炙西風(fēng)滿簟焚虽抄。 火辣辣,汗津津耘沼,赤身揮舞頂焦昀极颓。 堂屋嬌艷不出...
    溪竹青閱讀 512評論 0 6
  • 1451年,哥倫布出身于意大利繁榮的港口城市群嗤,熱那亞的一個紡織工家庭。青少年時代他曾經(jīng)當(dāng)過水手兵琳,到過地中海東部英國...
    西部小籠包閱讀 549評論 0 1
  • 關(guān)注瑪雅印記狂秘,查詢到自己是月亮的紅月,在微信公眾平臺《有時間的生活》大概翻了翻躯肌,這個在宇宙層面幫助認知自己者春、打開內(nèi)...
    拾光小世界閱讀 1,137評論 4 0
  • 創(chuàng)意微電影、公益廣告 自幼從孤兒院中長大的女孩簡單一轉(zhuǎn)眼已經(jīng)25歲了清女,她遇到了她生命中的Mr.Right——林強森...
    大樹互助閱讀 509評論 0 0