前提:我們需要得到Android系統(tǒng)源碼編譯輸出的一個(gè)文件
out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
這個(gè)包里面包含所有的系統(tǒng)api, 隱藏的, 公開的
添加 jar方法
右鍵功能菜單->Properties->Java Build Path
Libraries選項(xiàng)卡
這時(shí)應(yīng)該有一個(gè)列表, 如果你沒有添加過, 應(yīng)該只有一項(xiàng), 就是系統(tǒng)自帶的Android SDK, 選中后,右手邊有一個(gè)刪除, 先刪除系統(tǒng)添加的sdk.
點(diǎn)Add Library -> User Library
選擇User Library 按鈕, 新建一個(gè)User Library 將剛才那個(gè)文件 classes.jar 和系統(tǒng)本身的文件都導(dǎo)入進(jìn)來, 調(diào)整下順序, 將 classes.jar 調(diào)到前面
這樣添加了之后, 就可以使用系統(tǒng)隱藏的api了
使用隱藏api, 有個(gè)前提:
許多api涉及到系統(tǒng)權(quán)限問題, 比如 后臺安裝文件 api PackageManager.installPackage 要求有安裝程序的權(quán)限, 而這個(gè)安裝程序權(quán)限不是隨便有的, 只有經(jīng)ROM簽名認(rèn)證的才可以使用這個(gè)權(quán)限. 雖然說可以在配置文件里面添加這個(gè)權(quán)限, 但是悲劇的是你仍然不能擁有這個(gè)權(quán)限, 在這點(diǎn)上, Google做的真絕..
好了, 雖然我們不能安裝, 但用api去查看apk總該可以了吧?
Google沒有公開這個(gè)Api, 但又了上面這個(gè)方法, 我們可以使用了
out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar
這個(gè)包里面包含所有的系統(tǒng)api, 隱藏的, 公開的
添加 jar方法
右鍵功能菜單->Properties->Java Build Path
Libraries選項(xiàng)卡
這時(shí)應(yīng)該有一個(gè)列表, 如果你沒有添加過, 應(yīng)該只有一項(xiàng), 就是系統(tǒng)自帶的Android SDK, 選中后,右手邊有一個(gè)刪除, 先刪除系統(tǒng)添加的sdk.
點(diǎn)Add Library -> User Library
選擇User Library 按鈕, 新建一個(gè)User Library 將剛才那個(gè)文件 classes.jar 和系統(tǒng)本身的文件都導(dǎo)入進(jìn)來, 調(diào)整下順序, 將 classes.jar 調(diào)到前面
這樣添加了之后, 就可以使用系統(tǒng)隱藏的api了
使用隱藏api, 有個(gè)前提:
許多api涉及到系統(tǒng)權(quán)限問題, 比如 后臺安裝文件 api PackageManager.installPackage 要求有安裝程序的權(quán)限, 而這個(gè)安裝程序權(quán)限不是隨便有的, 只有經(jīng)ROM簽名認(rèn)證的才可以使用這個(gè)權(quán)限. 雖然說可以在配置文件里面添加這個(gè)權(quán)限, 但是悲劇的是你仍然不能擁有這個(gè)權(quán)限, 在這點(diǎn)上, Google做的真絕..
好了, 雖然我們不能安裝, 但用api去查看apk總該可以了吧?
Google沒有公開這個(gè)Api, 但又了上面這個(gè)方法, 我們可以使用了
//apk包的文件路徑
String apkPath = "/sdcard/qq.apk";
//這是一個(gè)Package 解釋器, 是隱藏的
//構(gòu)造函數(shù)的參數(shù)只有一個(gè), apk文件的路徑
PackageParser packageParser = new PackageParser(apkPath);
//這個(gè)是與顯示有關(guān)的, 里面涉及到一些像素顯示等等, 我們使用默認(rèn)的情況
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
//這里就是解析了, 四個(gè)參數(shù),
//源文件File,
//目的文件路徑(這個(gè)我也沒搞清楚怎么回事, 看Android安裝器源碼, 用的是源文件路徑, 但名字卻是destFileName)
//顯示, DisplayMetrics metrics
//flags, 這個(gè)真不知道是啥
PackageParser.Package mPkgInfo = packageParser.parsePackage(new File(apkPath),
apkPath, metrics, 0);
//應(yīng)用程序信息包, 這個(gè)公開的, 不過有些函數(shù), 變量沒公開
ApplicationInfo info = mPkgInfo.applicationInfo;
//Resources 是用來獲取資源的 , 而這里獲取的資源是在本程序之外的
//至于為什么這么弄, 我搞不懂.
Resources pRes = getResources();
AssetManager assmgr = new AssetManager();
assmgr.addAssetPath(apkPath);
Resources res = new Resources(assmgr, pRes.getDisplayMetrics(), pRes.getConfiguration());
CharSequence label = null;
if (info.labelRes != 0) {
try {
label = res.getText(info.labelRes);
} catch (Resources.NotFoundException e) {
}
}
if (label == null) {
label = (info.nonLocalizedLabel != null) ?
info.nonLocalizedLabel : info.packageName;
}
//這里就是讀取一個(gè)apk程序的圖標(biāo)
if (info.icon != 0){
Drawable icon = res.getDrawable(info.icon);
ImageView image = (ImageView) findViewById(R.id.iv_test);
image.setVisibility(View.VISIBLE);
image.setImageDrawable(icon);
}
}
String apkPath = "/sdcard/qq.apk";
//這是一個(gè)Package 解釋器, 是隱藏的
//構(gòu)造函數(shù)的參數(shù)只有一個(gè), apk文件的路徑
PackageParser packageParser = new PackageParser(apkPath);
//這個(gè)是與顯示有關(guān)的, 里面涉及到一些像素顯示等等, 我們使用默認(rèn)的情況
DisplayMetrics metrics = new DisplayMetrics();
metrics.setToDefaults();
//這里就是解析了, 四個(gè)參數(shù),
//源文件File,
//目的文件路徑(這個(gè)我也沒搞清楚怎么回事, 看Android安裝器源碼, 用的是源文件路徑, 但名字卻是destFileName)
//顯示, DisplayMetrics metrics
//flags, 這個(gè)真不知道是啥
PackageParser.Package mPkgInfo = packageParser.parsePackage(new File(apkPath),
apkPath, metrics, 0);
//應(yīng)用程序信息包, 這個(gè)公開的, 不過有些函數(shù), 變量沒公開
ApplicationInfo info = mPkgInfo.applicationInfo;
//Resources 是用來獲取資源的 , 而這里獲取的資源是在本程序之外的
//至于為什么這么弄, 我搞不懂.
Resources pRes = getResources();
AssetManager assmgr = new AssetManager();
assmgr.addAssetPath(apkPath);
Resources res = new Resources(assmgr, pRes.getDisplayMetrics(), pRes.getConfiguration());
CharSequence label = null;
if (info.labelRes != 0) {
try {
label = res.getText(info.labelRes);
} catch (Resources.NotFoundException e) {
}
}
if (label == null) {
label = (info.nonLocalizedLabel != null) ?
info.nonLocalizedLabel : info.packageName;
}
//這里就是讀取一個(gè)apk程序的圖標(biāo)
if (info.icon != 0){
Drawable icon = res.getDrawable(info.icon);
ImageView image = (ImageView) findViewById(R.id.iv_test);
image.setVisibility(View.VISIBLE);
image.setImageDrawable(icon);
}
}
ROM簽名的話 要怎么給程序簽名呢?
ROM 簽名的方法很多
http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=22450
這是一個(gè)方法
不過, 對軟件開發(fā)來說, 沒有任何意義
除非我們的軟件是嵌入在ROM里面的
對呀 我那個(gè)程序就是嵌入到ROM里面的,
就是想調(diào)用installPackage這個(gè)方法,但是我看了源代碼
這個(gè)方法是隱藏的 我要怎么做才可以在我的應(yīng)用程序里面直接調(diào)用這個(gè)方法呢?
就是不知道編譯進(jìn)去以后好不好用?
我已經(jīng)試過了
我剛剛試了 程序是沒有問題的,但是出了這個(gè)錯(cuò)誤:
has no signatures that match those in shared user android.uid.system; ignoring!
我要怎么去給程序簽名或者怎么把程序編進(jìn)Android系統(tǒng)里面,變成他原生的呢?
http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=22450
這個(gè)里面有部分介紹, 不完整
我沒有研究具體怎么給系統(tǒng)應(yīng)用簽名, 不過, 你就是簽名了也只能在這個(gè)ROM上使用你這個(gè)程序, 也就是說別人的手機(jī)是不能運(yùn)行的 這個(gè)就比較糾結(jié)的事情
Exception in thread "main" java.lang.UnsatisfiedLinkError: init
如何解決呢?
這個(gè)是android上的接口,在pc上不能用很正常
我不懂a(chǎn)ndroid開發(fā),我是一個(gè)比較聰明的手機(jī)用戶,我喜歡自己修改rom,我需要隱藏一個(gè)rom本身的程序,這個(gè)程序不能刪除,刪除后會導(dǎo)致rom不能使用,我想用你的方法隱藏它,我看懂前面,后面的代碼不知用在那里。望你能悉心指導(dǎo)我~感謝你。