androidjni許可權
Ⅰ android:我在JNI中,讀取/dev/input下的文件,為什麼沒有許可權呢
ls -l dev/input 看看有沒有許可權 一般你所在的uid沒有許可權的
Ⅱ Android怎麼讓安裝的apk通過jni調用腳本時運行在root許可權下
把so也直接拷貝到/system/lib/ 下面了,雖然可以運行,但是還是沒有向/sys/bus/xxx...的文件中echo 的許可權;
給Manifest加了以下許可權也不行。。。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_OWNER_DATA"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
Ⅲ Android怎麼讓安裝的apk通過jni調用腳本時運行在root許可權下
解決方法是在manifest中將AP提升至system許可權,給apk打標簽,然後在initrc中將/sys/下面對應的文件chown成為systemowner,就可以了。
Ⅳ 如何在Android下使用JNI
Android中JNI是編譯so庫的源代碼,編譯成功後會生成SO庫,android中最終是使用SO庫的。
1.android的NDK開發需要在linux下進行: 因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。
2.安裝android-ndk開發包,這個開發包可以在google android 官網下載: 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫
3.android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。
NDK編譯步驟:
1.選擇 ndk 自帶的例子 hello-jni ,我的位於E:\android-ndk-r5\samples\hello-jni( 根據具體的安裝位置而定 ) 。
2.運行 cygwin ,輸入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,進入到 E:\android-ndk-r5\samples\hello-jni 目錄。
3.輸入 $NDK/ndk-build ,執行成功後,它會自動生成一個 libs 目錄,把編譯生成的 .so 文件放在裡面。 ($NDK是調用我們之前配置好的環境變數, ndk-build 是調用 ndk 的編譯程序 )
4.此時去 hello-jni 的 libs 目錄下看有沒有生成的 .so 文件,如果有,ndk 就運行正常啦。
Ⅳ 如何提升APP許可權去修改android系統屬性
Systemproperties類在android.os下,但這個類是隱藏的, 上層程序開發無法直接使用。其實用java的反射機制是可以使用這個類。何謂java反射機制,請自行研究學習,在此不做介紹,放到後續文章中。用JNI 的方式,可以繞過Systemproperties這個類,直接本地調用來實現創建、獲取及修改系統屬性。在此也不做介紹,也放到後續文章中。
創建與修改android屬性用Systemproperties.set(name, value),獲取android屬性用Systemproperties.get(name),需要注意的是android屬性的名稱是有一定的格式要求的,如下: 前綴必須用system\core\init\property_service.c中定義的前綴 ,進行系統屬性設置的程序也必須有system或root許可權,
如何將android程序的許可權提升到system許可權?方法是這樣的:
1、在AndroidManifest.xml中,在manifest添加android:sharedUserId="android.uid.system "。
2、在Android.mk中,將LOCAL_CERTIFICATE := XXX修改成LOCAL_CERTIFICATE := platform 。
經過以上兩步就可以把ap的許可權提升到system許可權了。 但是用這種方法提升許可權有兩個弊端,如下:
1、程序的擁有都必須有程序的源碼;
2、程序的擁有都還必須有android開發環境,就是說自己能make整個android系統。
一般能做這兩點的,基本上都是開發人員!
Ⅵ android調用so(jni)需要在AndroidManifest.xml中聲明許可權嗎,比如通過jni發送簡訊、讀取imei等。
jni通過反調JAVA介面的話,處理方式與JAVA層直接調用介面無異,需要聲明許可權。
jni直接可以讀取設備的cpu、mac等linux kernel中的資料,至於imei是讀不到的。另外,發簡訊也是要調用系統提供的JAVA層的API,如果要直接調用底層介面的話,你估計要重新編譯自己的Android SDK才行。
jni反調java是個很惡心的工作,尤其是在多線程中,最好還是不要嘗試。
有一種不需要聲明許可權的方法是,搞到kernel層的所有API,直接操作硬體吧。當然那是不可能的。
Ⅶ 在rood打開的機器上,apk可以已經拿到root許可權,怎樣才能讓jni也有root許可權
關鍵點在於下面這句,通過執行su產生一個具有root許可權的進程:
Process p = Runtime.getRuntime().exec("su");
然後,在向這個進程的寫入要執行的命令,即可達到以root許可權執行命令:
dos = new DataOutputStream(p.getOutputStream());
dos.writeBytes(cmd + "\n");
dos.flush();
或者用下面的方式:
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c", cmd});
經過測試,以root許可權執行命令,只在真機上測試成功,在模擬器上沒有成功過。
第一次運行時,會出現請求root許可權的界面,選中記住,並允許:
.png
測試程序界面,如果已經root,界面中可以顯示出/system分區對應的設備節點:
.png
主要文件:RootCmd.java
[java]
package org.ckl.root;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import android.util.Log;
public final class RootCmd {
private static final String TAG = "RootCmd";
private static boolean mHaveRoot = false;
// 判斷機器Android是否已經root,即是否獲取root許可權
public static boolean haveRoot() {
if (!mHaveRoot) {
int ret = execRootCmdSilent("echo test"); // 通過執行測試命令來檢測
if (ret != -1) {
Log.i(TAG, "have root!");
mHaveRoot = true;
} else {
Log.i(TAG, "not root!");
}
} else {
Log.i(TAG, "mHaveRoot = true, have root!");
}
return mHaveRoot;
}
// 執行命令並且輸出結果
Ⅷ Android應用程序怎樣獲取root許可權
一般來說, Android 下的應用程序可以「直接」得到的最大的許可權為 system ,但是如果我們需要在程序中執行某些需要 root 許可權的命令,如 ifconfig 等,就需要 root 許可權了。按照 Simon 的文章中提到的,應用程序有以下兩種辦法臨時獲得 root 許可權:
1) 實現一個 init 實現一個 Service ,來幫助 Android 應用程序執行 root 許可權的命令。
2) 實現一個虛擬設備,這個設備幫助 Android 應用程序執行 root 許可權的命令。
第二種辦法我這里沒有嘗試,暫時也不會。這里講講我在實現第一種辦法的過程和遇到的一些問題。
1. 將我們要執行的命令寫成腳本,或者可執行程序。
下面是我的腳本 ifconfig_test.sh :
# ! /system/bin/sh
ifconfig
注意: 腳本的第一行必須為 # ! /system/bin/sh ,否則無法執行,通過 dmesg 可以查看到信息內容為 cannot execve ./ifconfig_test.sh: Exec format error
也可以採用 C/C++ 編寫需要執行的命令或者程序,並在編譯 image 的時候編譯成可執行程序。
2. 在 init.rc 中注冊 service
Android 中的 service 需要在 init.rc 中注冊, Init.rc 中定義的 Service 將會被 init 進程創建,這樣將可以獲得 root 許可權。當得到相應的通知(通過屬性設置)後, init 進程會啟動該 service 。
本文中注冊的內容如下:
service ifconfig_test /system/etc/ifconfig_test.sh
oneshot
disabled
其中, oneshot 表示程序退出後不再重新啟動, disabled 表示不在系統啟動時啟動。
注意: 這里 service name 不能超過 16 個字元。我之前的 service name 由於定義的比較長, 18 個字元,設置屬性通知 service 啟動後查看 dmesg 可以看到提示: init: no such service 。查看 /system/core/init/parser.c 的源代碼,在 parse_service->valid_name 函數中可以看到如下內容: if (strlen(name) > 16) { return 0; } ,證明 service 的名字的確不能超過 16 個字元。
3. 將 Android 應用程序提升為 system 許可權
既然應用程序可以通過啟動 service 獲得 root 許可權,那麼豈不是很不安全。 Android 考慮到了這點,規定只有 system 許可權的應用程序才能設置屬性,通知 service 啟動。關於提升 system 許可權的文章網上已有很多,這里就不再細說,
4. 在應用程序中添加屬性設置代碼
前面已經提到,對於 Android 來說,應用程序通知 init 啟動 service 是通過設置系統屬性來完成的,具體為設置 System 系統屬性 「ctl.start」 為 「ifconfig_test」 ,這樣 Android 系統將會幫我們運行 ifconfig_test 這個 service 了。
對該系統屬性的設置有三種方法,分別對應三種不同的應用程序:
1) Java 代碼
Android 在 Java 庫中提供 System.getProperty 和 System.setProperty 方法, Java 程序可以通過他們來設置和獲得屬性。代碼如下:
SystemProperties.set("ctl.start", "ifconfig_test");
上面的代碼是通知 Android 執行 ifconfig_test service ,如果需要查詢當前 service 執行的狀態,如是否執行完畢,可以通過如下代碼查詢:
ret = SystemProperties.get("init.svc. ifconfig_test ", "");
if(ret != null && ret.equals("stopped"))
{
return true;
}
2) JNI 代碼
當編寫 NDK 的程序時,可以使用 property_get 和 property_set 這兩個 API 來獲得和設置屬性。使用這兩個 API 必須要包含頭文件 cutils/properties.h 和鏈接 libcutil 庫。
3) Shell 腳本
Android 提供了命令行 setprop 和 getprop 來設置和獲取屬性,他們可以在腳本中被使用。
由於我的程序是在 JNI 中調用腳本,腳本中又執行 ifconfig ,因此我將設置屬性的部分放在了腳本中完成,代碼如下:
setprop ctl.start ifconfig_test
#wait for the service until it stops
ret=1
while [ $ret -ne 0 ]
do
getprop | grep "$ENABLE_MAPPER_SRV" | grep stopped
ret=$?
done
通過上面 4 個步驟, Android 應用程序就獲得了 root 許可權,更具體的說,是在執行我們需要執行的命令時臨時獲得了 root 許可權。
Ⅸ 如何開放android的串口許可權
要調用串口,肯定是要用到JNI的,而且要有打開對應串口設備的許可權
至於是不是通過USB轉的,沒啥關系,因為USB轉串口的驅動已經把USB的特徵封裝了,就當它是一個純串口操作就行
android-serialport-api也是用的JNI,要想知道能不能用,裝它的DEMO代碼試試就知道了
不然重新寫一個JNI的庫,用android-serialport-api的也行,不然網上也好多現成的代碼,基本不用重寫
Ⅹ android jni對底層的設備節點open問題
手敲命令可以的話,
手機和列印機應該都沒有問題。
看看你的程序消息發到下面去了沒有。
只有一步一步的跟了。