本文講解通過反射Android pm instal來調(diào)用隱藏api善延, 來靜默安裝,至于原理什么的惰聂,就不多說了疆偿,網(wǎng)絡(luò)上一搜一大把咱筛,下面是親測可行的;
先上Demo,其中的libs文件夾下的class.jar是主角翁脆。
本文有一個(gè)大前提眷蚓,那就是你的apk是放在系統(tǒng)/system/priv-app目錄下,也就是說反番,rom是你們自己搞的沙热,手動(dòng)滑稽=。=
如果你是用AndroidStudio版本的罢缸,也是鏈接中的DemoSilenceInstall
步驟如下:
建一個(gè)你自己的工程 篙贸,將class.jar放入到libs目錄下。
-
然后projectStructure(按F4直接進(jìn))枫疆,進(jìn)入dependence點(diǎn)擊+號(hào)爵川,選擇FileDependence 記得把 scope置為Provided,如下圖:
1.png 工程目錄下的gradle文件修改:
allprojects {
repositories {
jcenter()
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\libs\class.jar')
}
}
}
名字,不要眼瞎息楔,后面是你起的jar包的名字寝贡,這個(gè)名字隨意取,兩者對(duì)應(yīng)就行.
以上的操作的目的有兩個(gè):
1.就是將class.jar以eclipse中那種userlib的形式導(dǎo)入值依,
2.調(diào)整jar包的優(yōu)先級(jí)
- 再將demo中install 包下的代碼放到你的工程中.如果這個(gè)時(shí)候你的PM.java這個(gè)文件不報(bào)錯(cuò)圃泡,那么恭喜,你的操作就算完成了
- 這個(gè)步驟我的代碼出現(xiàn)了問題愿险,不知道你的會(huì)不會(huì)颇蜡,就是Android中65535問題了,也就是解決這個(gè)問題做的操作辆亏,AS下好解決风秤,這個(gè)不做過多解釋。
剩下的扮叨,就是將應(yīng)用打包簽名缤弦,放到/system/priv-app這個(gè)目錄下 就ok了,
下面說下Eclipse版本的操作彻磁,代碼都是一樣的甸鸟,jar包也是一樣,就兩點(diǎn)兵迅,jar包通過userlibrary的形式導(dǎo)入抢韭,直接放圖吧,多圖慎入:
![
![Uploading 6_086779.png . . .]
](http://upload-images.jianshu.io/upload_images/1453857-e6cde6675deb959b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
至此恍箭,刻恭,搞定了,╮(╯▽╰)╭,繼續(xù)搬磚鳍贾。如果你要問這個(gè)class怎么來的鞍匾,你找做rom的大神們給你編譯一份源碼就行,反正我不會(huì)骑科。OTZ.... 然而這個(gè)地方在我寫完文章后又出現(xiàn)了一個(gè)實(shí)戰(zhàn)問題橡淑,那就是用multydex分包處理后,還是會(huì)出現(xiàn) Too many classes in --main-dex-list, main dex capacity exceeded咆爽,梁棠,目前一個(gè)最簡單暴力的方法就是把minsdkversion 調(diào)成21+,我在想想辦法斗埂,符糊,,呛凶,解決了更新文章男娄。
(⊙o⊙)…,暫時(shí)沒解決漾稀,不過上了一個(gè)新版本模闲,用aidl實(shí)現(xiàn)的,也是可以用這里的...東西都差不多崭捍,jar包換了個(gè)精簡的围橡,然后改用aidl實(shí)現(xiàn)的注意,aidl的包名不要?jiǎng)勇乒保鸩ィ缓笈渲孟耮radle里面的aidl