① android應用程序獲取system許可權
支持原作者 : http://www.xugaoxiang.com/blog/index.php/archives/53/
軟硬體環境
ubuntu 14.04
Android studio2.1.2
Android 5.1.1
前言
一般的Android應用程序,在安裝後,程序只能訪問/data/data/${程序包名}下的數據,如常見的SharedPreferences、database等。
而如果想讓app訪問其它地方的資源時,就必須要獲取更高的許可權叢團,像system或者root。本文完成system許可權的獲取,實際上一般的應用有system的許可權基本上也夠了。
修改apk內的AndroidManifest.xml
在app中的AndroidManifest.xml文件中的manifest標簽中加入
android:sharedUserId="android.uid.system"
APP工程生成apk文件
android studio或者eclipse自動就幫你生成好了
給apk文件進行簽名
這里分兩種情況,一種是廠商,有android系統源碼,既可以把app源碼導入到android源碼中,也可以單獨完成簽名。第二種磨歷是你僅僅是做應用的,拿不到廠商的source code,而且
這種情況也相當普遍,怎麼辦?別著急,我們今天就來解決這個問題。
簽名需要的幾個文件
這個你必須找廠商要,signapk.jar、platform.x509.pem、platform.pk8,如果你有source code,signapk.jar存瞎鄭搜放在prebuilts/sdk/tools/,platform.* 兩個key文件存放在build/target/proct/security/下
簽名具體命令
java -jar signapk.jar platform.x509.pem platform.pk8 unsigned.apk signed.apk
製作新的image文件
如果你的應用需要預置到android系統中,將signed.apk導入到android源碼目錄中(一般是out/target/proct/${hardware}/system/app/下),編譯生成新的
system.img,再燒錄到目標板中。如果不需要預置,那就直接adb install好了。
測試
待系統啟動後adb shell到板子上,ls -l查看app安裝目錄(/data/data/${程序包名})的許可權,看看是不是變成system:system了。
② 安卓APP如何統計流量
安卓app統計流量使用,方式如下:
因為getUidRxBytes(int uid)和getUidTxbytes(int uid)包括了所有網路形式的流量,即包括WIFI和3g/2g.故需要監聽WIFI變化,並記錄WIFI過程中該uid應用使用的流量記錄.
`
stants{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)){
intwifistate=intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_DISABLED);
if(wifistate==WifiManager.WIFI_STATE_DISABLED){//如果關閉
//結余本次wifi過程中uid應用的流量
}elseif(wifistate==WifiManager.WIFI_STATE_ENABLED){
//記錄當前uid應用的流量.
}
}
}
③ 如何反編譯android應用以及重編譯,簽名和對齊優化
首先,了解一下我們為什麼需要反編譯apk
大部分情況下,是由於想本地化一款優秀的應用,才需要做這事兒;又或者進行少量的smali修改以達到想要的效果(如添加歸屬地,使3G版Nexus 7支持Wi-Fi熱點)。
下面我們先准備運行環境和工具
建立工作目錄,如.\workspace\apktoolbox (下面同樣以此路徑為例)
必不可少的JDK:Oracle Java下載,安裝完成後把<jdk-inst-path>\bin添加到$PATH環境變數中
反編譯和重編譯工具apktool:Google Code下載,按平台下載(一個apktool-install-<platform>-<ver>-tar.bz2,一個apktool<ver>.tar.bz2,下載完成後解壓至.\workspace\apktoolbox\bin
密鑰文件,共4組。test/shared/media/platform,從android source中獲取,分別對應不同共享用戶ID時簽名所需(查看應用AndroidManifest.xml第二行android:sharedUserId項 ),放到.\workspace\apktoolbox\bin下
test - 無android:sharedUserId項
shared - android:sharedUserId=android.uid.shared
media - android:sharedUserId=android.uid.media
platform - android:sharedUserId=android.uid.system
簽名工具signapk.jar,放到.\workspace\apktoolbox\bin下
對齊優化工具zipalign(從android sdk中獲取,在tools目錄下),放到.\workspace\apktoolbox\bin下
准備工作完成
接下來我們就要開始工作了(以本地化工作為例)
把待反編譯的apk放到.\workspace\apktoolbox\apks下
在命令行模式下進入.\workspace\apktoolbox\bin目錄,輸入以下命令進行解包(反編譯)
apktool d ..\apks\<apkfile>.apk ..\apks\<outdir>
.\workspace\apktoolbox\apks\<outdir>\res下的values目錄(英文原版)和values-r<locale>目錄(本地化)就是我們需要的對象。
本地化工作完成後,在命令行中輸入以下命令進行重新打包(重新編譯)
apktool b ..\apks\<outdir>
.\workspace\apktoolbox\apks\<outdir>\dist目錄下會生成重新打包後的apk(未簽名,未對齊優化)
重新打包完成後,在命令行中輸入以下命令進行簽名(根據實際情況選用密鑰,這里以test密鑰為例)
java -jar signapk.jar testkey.x509.pem testkey.pk8 ..\apks\<outdir>\dist\<apkfile>.apk ..\apks\<apkfile>_signed.apk
簽名完成後,在命令行中輸入以下命令進行對齊優化
zipalign -f -v 4 ..\apks\<apkfile>_signed.apk ..\apks\<apkfile>_zipaligned.apk
<apkfile>_zipaligned.apk就是我們最終需要的apk了。
完成
部分apk需要系統框架資源,沒有的話在重新打包時會報錯,這種情況下我們只需要先安裝一下對應系統框架即可(從你目標ROM中把/system/framework/framework-res.apk提取出,放到.\workspace\apktoolbox\apks下)。在命令行中輸入以下命令進行安裝
apktool if ..\apks\framework-res.apk
④ 濡備綍浣緼ndroid搴旂敤紼嬪簭鑾峰彇緋葷粺鏉冮檺 鏉ヤ慨鏀圭郴緇熸椂闂
鍦 android 鐨凙PI涓鏈夋彁渚 SystemClock.setCurrentTimeMillis()鍑芥暟鏉ヤ慨鏀圭郴緇熸椂闂達紝鍙鎯滄棤璁轟綘鎬庝箞璋冪敤榪欎釜鍑芥暟閮芥槸娌$敤鐨勶紝鏃犺烘ā鎷熷櫒榪樻槸鐪熸満錛屽湪logcat涓鎬諱細寰楀埌"Unable to open alarm driver: Permission denied ".榪欎釜鍑芥暟闇瑕乺oot鏉冮檺鎴栬呰繍琛屼笌緋葷粺榪涚▼涓鎵嶅彲浠ョ敤銆 鏈鏉ヤ互涓哄氨娌℃湁鍔炴硶鍦ㄥ簲鐢ㄧ▼搴忚繖涓灞傛敼緋葷粺鏃墮棿浜嗭紝鍚庢潵鍦ㄧ綉涓婃悳浜嗗ソ涔咃紝鐭ラ亾榪欎釜鐩鐨勮繕鏄鍙浠ヨ揪鍒扮殑銆 絎涓涓鏂規硶綆鍗曠偣錛屼笉榪囬渶瑕佸湪Android緋葷粺婧愮爜鐨勭幆澧冧笅鐢╩ake鏉ョ紪璇: 1. 鍦ㄥ簲鐢ㄧ▼搴忕殑AndroidManifest.xml涓鐨刴anifest鑺傜偣涓鍔犲叆 "android:sharedUserId="android.uid.system"榪欎釜灞炴с 2. 淇鏀笰ndroid.mk鏂囦歡錛屽姞鍏LOCAL_CERTIFICATE := platform榪欎竴琛 3. 浣跨敤mm鍛戒護鏉ョ紪璇戱紝鐢熸垚鐨刟pk灝辨湁淇鏀圭郴緇熸椂闂寸殑鏉冮檺浜嗐 絎浜屼釜鏂規硶楹葷儲鐐癸紝涓嶈繃涓嶇敤寮鉶氭嫙鏈鴻窇鍒版簮鐮佺幆澧冧笅鐢╩ake鏉ョ紪璇: 1. 鍚屼笂錛屽姞鍏"android:sharedUserId="android.uid.system"榪欎釜灞炴с 2. 浣跨敤eclipse緙栬瘧鍑篴pk鏂囦歡錛屼絾鏄榪欎釜apk鏂囦歡鏄涓嶈兘鐢ㄧ殑銆 3. 鐢ㄥ帇緙╄蔣浠舵墦寮apk鏂囦歡錛屽垹鎺塎ETA-INF鐩褰曚笅鐨凜ERT.SF鍜孋ERT.RSA涓や釜鏂囦歡銆 4. 浣跨敤鐩鏍囩郴緇熺殑platform瀵嗛掗鏉ラ噸鏂扮粰apk鏂囦歡絳懼悕銆傝繖姝ユ瘮杈冮夯鐑︼紝 棣栧厛鎵懼埌瀵嗛掗鏂囦歡錛屽湪鎴戠殑Android婧愮爜鐩褰曚腑鐨勪綅緗鏄"build argetproctsecurity"錛屼笅闈㈢殑platform.pk8鍜宲latform.x509.pem涓や釜鏂囦歡銆 鐒跺悗鐢ˋndroid鎻愪緵鐨凷ignapk宸ュ叿鏉ョ懼悕錛宻ignapk鐨勬簮浠g爜鏄鍦"build oolssignapk"涓嬶紝鐢ㄦ硶涓"signapk platform.x509.pem platform.pk8 input.apk output.apk"錛屾枃浠跺悕鏈濂戒嬌鐢ㄧ粷瀵硅礬寰勯槻姝㈡壘涓嶅埌錛屼篃鍙浠ヤ慨鏀規簮浠g爜鐩存帴浣跨敤銆傝繖鏍鋒渶鍚庡緱鍒扮殑apk鍜岀涓涓鏂規硶鏄涓鏍風殑銆 鏈鍚庤В閲婁竴涓嬪師鐞嗭紝棣栧厛鍔犲叆android:sharedUserId="android.uid.system"榪欎釜灞炴с傞氳繃Shared User id,鎷ユ湁鍚屼竴涓猆ser id鐨勫氫釜APK鍙浠ラ厤緗鎴愯繍琛屽湪鍚屼竴涓榪涚▼涓銆傞偅涔堟妸紼嬪簭鐨刄ID閰嶆垚android.uid.system錛屼篃灝辨槸瑕佽╃▼搴忚繍琛屽湪緋葷粺榪涚▼涓錛岃繖鏍峰氨鏈夋潈闄愭潵淇鏀圭郴緇熸椂闂翠簡銆 鍙鏄鍔犲叆UID榪樹笉澶燂紝濡傛灉榪欐椂鍊欏畨瑁匒PK鐨勮瘽鍙戠幇鏃犳硶瀹夎咃紝鎻愮ず絳懼悕涓嶇︼紝鍘熷洜鏄紼嬪簭鎯寵佽繍琛屽湪緋葷粺榪涚▼涓榪樿佹湁鐩鏍囩郴緇熺殑platform key錛屽氨鏄涓婇潰絎浜屼釜鏂規硶鎻愬埌鐨刾latform.pk8鍜宲latform.x509.pem涓や釜鏂囦歡銆傜敤榪欎袱涓猭ey絳懼悕鍚巃pk鎵嶇湡姝e彲浠ユ斁鍏ョ郴緇熻繘紼嬩腑銆傜涓涓鏂規硶涓鍔犲叆LOCAL_CERTIFICATE := platform鍏跺疄灝辨槸鐢ㄨ繖涓や釜key鏉ョ懼悕銆 榪欎篃鏈変竴涓闂棰橈紝灝辨槸榪欐牱鐢熸垚鐨勭▼搴忓彧鏈夊湪鍘熷嬬殑Android緋葷粺鎴栬呮槸鑷宸辯紪璇戠殑緋葷粺涓鎵嶅彲浠ョ敤錛屽洜涓鴻繖鏍風殑緋葷粺鎵嶅彲浠ユ嬁鍒 platform.pk8鍜宲latform.x509.pem涓や釜鏂囦歡銆傝佹槸鍒瀹跺叕鍙稿仛鐨凙ndroid涓婅繛瀹夎呴兘瀹夎呬笉浜嗐傝瘯璇曞師濮嬬殑Android 涓鐨刱ey鏉ョ懼悕錛岀▼搴忓湪妯℃嫙鍣ㄤ笂榪愯孫K錛屼笉榪囨斁鍒癎3涓婂畨瑁呯洿鎺ユ彁紺"Package ... has no signatures that match those in shared user android.uid.system"錛岃繖鏍蜂篃鏄淇濇姢浜嗙郴緇熺殑瀹夊叏銆
⑤ android系統中的app安裝後的各個文件路徑在哪裡
在系統中system/app文件夾中。
在android系統中安裝軟體時,系統會將其安裝在設定好的路徑當中,即system/app路徑。後來下載的APP可以卸載,但系統自帶的APP不能卸載,否則會引發系統的崩潰。
在安裝APP時,也可以直接將文件復制到手機里(手機內存、Storage Card都可以),在手機上執行該CAB文件即可安裝。
(5)androidappuid擴展閱讀
android系統中的app不同格式安裝:
1、CAB格式,直接將文件到手機里,都可以在手機上執行該CAB文件即可安裝。
2、EXE格式,EXE格式的程序可分為手機上直接運行(即綠色軟體的形式)和連接電腦同步安裝2種形式。
3、免安裝軟體(綠色軟體),將文件直接拷貝到手機里(手機內存、Storage Card都可以)即可運行。這種軟體在網上下載時一般是RAR或ZIP格式壓縮包,只需先在電腦上解壓,將解壓出來的文件夾拷貝到手機里即可運行。
4、Cpl文件,將文件直接拷貝到手機windows目錄下,即可在設置中出現相應的選項。如SoftKeyAppleEx.cpl對應會出現軟體設置選項。