android反射過濾
① 怎麼反射android的隱藏API,例如我要反射出「IBatteryStats」類
在源碼中編譯還反射幹嘛?直接用不得了~
反射只能發射Client端的對象,但是內要知道,好多對象都是在容Server的,Client只是個代理。
所以凡是介面類,反射都不一定能解決問題。
如果是開發第三方應用,反射肯定有局限,如果是系統級開發,最好別用反射,影響效率。
② android 怎麼用反射獲取對象
通過類名獲取類。
Class serviceManager = Class.forName("Android.os.ServiceManager");
獲取方法
Method method = serviceManager.getMethod("getService", String.class);
調用方法
method.invoke(serviceManager.newInstance(), "phone");
侯捷談Java反射機制
http://blog.csdn.net/njchenyi/article/details/1620939
http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html
③ 您好!我想問下android中隱藏的介面 用反射怎麼來實現謝謝啦 幫個忙
你這有問題啊,反射只能拿到方法,是需要你自己去實現onCapture
invoke(int[] byte)方法調用的,你都不知道哪裡調了他這個方法,怎麼可能拿到具體數據值
④ android如何通過反射修改private static final的值
[mw_shl_code=java,true]import java.lang.reflect.Field; public class FieldTest { public static void main(String[] args) { try { A a = new A(); Field field = a.getClass().getDeclaredField("a"); field.setAccessible(true); field.set(a, 2); System.out.println(field.get(a)); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } class A { private static final int a = 1; } [/mw_shl_code] 到eoeAndroid網站查看回答詳情>>
⑤ Android中如何通過反射調用setUsbTethering()方法
Usb
setting 中tethering 設置流程
一 資源位置及入口文件
USB
tethering, usb_tethering_button_text
Xml/tether_prefs.xml------usb_tether_settings,布局文件
packages/apps/Settings/AndroidManifest.xml
<!-- Keep compatibility with old
shortcuts. -->
<activity-alias
android:name=".TetherSettings"
android:label="@string/tether_settings_title_all"
android:clearTaskOnLaunch="true"
android:exported="true"
android:targetActivity="Settings$TetherSettingsActivity">
<meta-data
android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.TetherSettings"
/>
<meta-data
android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/wireless_settings"
/>
<meta-data
android:name="com.android.settings.PARENT_FRAGMENT_TITLE"
android:resource="@string/wireless_networks_settings_title"
/>
<meta-data
android:name="com.android.settings.PARENT_FRAGMENT_CLASS"
android:value="com.android.settings.Settings$WirelessSettingsActivity"
/>
</activity-alias>
TetherSettings.java
二 觸發流程
2.1
TetherSettings.java
packages/apps/Settings/src/com/android/settings/TetherSettings.java
onPreferenceTreeClick
SXlog.d(TAG,
"onPreferenceTreeClick - setusbTethering(" + newState + ")
mUsbTethering: " + mUsbTethering);
setUsbTethering(true);
下面是設置時抓取的log日誌
D/TetherSettings( 543): onPreferenceTreeClick -
setusbTethering(true) mUsbTethering: true
D/Tethering(
271): setUsbTethering(true)
D/UsbDeviceManager( 271):
setCurrentFunction(rndis) default: false
W/UsbDeviceManager( 271): handleMessage:
2
W/UsbDeviceManager( 271): setEnabledFunctions:
functions = rndis
W/UsbDeviceManager( 271): setEnabledFunctions,
mDefaultFunctions: mtp,adb
W/UsbDeviceManager( 271): setEnabledFunctions,
mCurrentFunctions: mtp,adb
D/UsbDeviceManager( 271): setEnabledFunctions,
mSettingFunction: mtp,adb
W/UsbDeviceManager( 271): containsFunction,
functions: rndis
W/UsbDeviceManager( 271): containsFunction,
function: adb
W/UsbDeviceManager( 271): containsFunction
index: -1
W/UsbDeviceManager( 271): addFunction,
functions: rndis
W/UsbDeviceManager( 271): addFunction, function:
adb
W/UsbDeviceManager( 271): containsFunction,
functions: rndis
W/UsbDeviceManager( 271): containsFunction,
function: acm
W/UsbDeviceManager( 271): containsFunction
index: -1
W/UsbDeviceManager( 271): containsFunction,
functions: rndis,adb
W/UsbDeviceManager( 271): containsFunction,
function: acm
W/UsbDeviceManager( 271): containsFunction
index: -1
D/UsbDeviceManager( 271):
setUsbConfig(none)
W/UsbDeviceManager( 271): setUsbConfig, config:
none
public
boolean onPreferenceTreeClick(PreferenceScreen
screen, Preference preference) {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if
(preference == mUsbTether) {
if
(!mUsbTethering) {
boolean
newState = mUsbTether.isChecked();
mUsbTethering = true;
mUsbTetherCheckEnable = false;
mUsbTether.setEnabled(false);
SXlog.d(TAG,
"onPreferenceTreeClick - setusbTethering(" + newState + ")
mUsbTethering: " + mUsbTethering);
if
(newState) {
startProvisioningIfNecessary(USB_TETHERING);
} else
{
setUsbTethering(newState);
}
} else
{
return
true;
}
} else if
(preference == mBluetoothTether) {
private void
setUsbTethering(boolean
enabled) {
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if
(cm.setUsbTethering(enabled) !=
ConnectivityManager.TETHER_ERROR_NO_ERROR) {
mUsbTether.setChecked(false);
mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
return;
}
mUsbTether.setSummary("");
}
2.2
ConnectivityManager.java
frameworks/base/core/java/android/net/ConnectivityManager.java
private
final IConnectivityManager
mService;
public int
setUsbTethering(boolean
enable) {
try
{
return
mService.setUsbTethering(enable);
} catch
(RemoteException e) {
return
TETHER_ERROR_SERVICE_UNAVAIL;
}
}
manager 和service有一個對應關系,固定的規則。 manager是為了sdk誕生的,方便app開發者調用。其實可以直接調用service,如mountservice是沒有mountmanager的。
service是在系統起來是就被android系統啟動的,而manager是後期有需要時實例化起來的。
Service的目錄在:/frameworks/base/services/java/com/android/server/
manager的目錄在:frameworks/base/core/java/android
2.3
ConnectivityService.java
frameworks/base/services/java/com/android/server
private
Tethering mTethering;
public int
setUsbTethering(boolean
enable) {
enforceTetherAccessPermission();
if
(isTetheringSupported()) {
return
mTethering.setUsbTethering(enable);
} else
{
return
ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
}
}
2.4
Tethering.java
frameworks/base/services/java/com/android/server/connectivity/Tethering.java
public int
setUsbTethering(boolean
enable) {
UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);
………………
else
{
mUsbTetherRequested = true;
usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS,
false);
}
通過service,來獲取manager,進行操作。這個tethering.java的構造函數
public
Tethering(Context context,
INetworkManagementService nmService,
INetworkStatsService statsService,
IConnectivityManager connService, Looper looper)
{
Context是獲取全局信息的介面,
2.5 UsbManager.java
/frameworks/base/core/java/android/hardware/usb/UsbManager.java
public void setCurrentFunction(String
function, boolean makeDefault) {
try {
mService.setCurrentFunction(function,
makeDefault);
}
catch (RemoteException e) {
Log.e(TAG, "RemoteException in
setCurrentFunction", e);
}
}
2.6
frameworks/base/services/java/com/android/server/usb$
mengfd1@tablet-C:~/work/A2107/frameworks/base/services/java/com/android/server$
cd usb
mengfd1@tablet-C:~/work/A2107/frameworks/base/services/java/com/android/server/usb$
ls
UsbDeviceManager.java UsbHostManager.java
UsbService.java UsbSettingsManager.java
/frameworks/base/services/java/com/android/server/usb/UsbService.java
public void setCurrentFunction(String function, boolean
makeDefault) {
mContext.(android.Manifest.permission.MANAGE_USB,
null);
if
(mDeviceManager != null) {
mDeviceManager.setCurrentFunction(function,
makeDefault);
}
else {
throw new IllegalStateException("USB device
mode not supported");
}
}
/frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java
public void setCurrentFunction(String
function, boolean makeDefault) {
if
(DEBUG) Slog.d(TAG, "setCurrentFunction(" + function + ") default:
" + makeDefault);
mHandler.sendMessage(MSG_SET_CURRENT_FUNCTION,
function, makeDefault);
}
public void handleMessage(Message msg)
{
case
MSG_SET_CURRENT_FUNCTION:
String function =
(String)msg.obj;
boolean makeDefault = (msg.arg1 ==
1);
if (function != null
&&
function.equals(UsbManager.USB_FUNCTION_CHARGING_ONLY))
{
mSettingUsbCharging = true;
SXlog.d(TAG, "handleMessage -
MSG_SET_CURRENT_FUNCTION - USB_FUNCTION_CHARGING_ONLY -
makeDefault: " + makeDefault);
} else {
mSettingUsbCharging = false;
}
setEnabledFunctions(function,
makeDefault);
SXlog.d(TAG, "handleMessage -
MSG_SET_CURRENT_FUNCTION - function: " +
function);
break;
private void setEnabledFunctions(String
functions, boolean makeDefault) {
private boolean setUsbConfig(String config) {
SystemProperties.set("sys.usb.config",
config);
⑥ Android中反射調用方法需要被調用的方法有什麼前提條件嗎
可能是因為classloader沒有載入那個類,既然是class not found,第一步還沒搞定呢,和反射還搭不上關系。
⑦ android怎麼在個應用通過反射調用其它應用中的方法/修改變數值等每次都報ClassNotFo
這種問題最好把代碼跳出來,否則誰也無能為力。
⑧ android 中是否合適使用反射機制,如果可以,應該用在哪些地方使用,要注意什麼問題,如果不合適,為什麼呢
當然適合。
父類中的私有變數和方法想在子類中訪問用反射就能實現。版
比如默認dialog的確定和權取消按鍵都會讓dialog消失,如果不想讓dialog消失,那麼用反射就能實現。
當然如果能通過重寫父類方法的地方就不用反射。
⑨ android為什麼通過反射方法調用方法
Class yourClass = Class.forName("YourClass");//假設你要動態載入的類為YourClass Class[] parameterTypes = new Class[1];//這里你要調用的方法只有一個參數 parameterTypes[0] = String[].class;//參數類型為String[] Method method = yourClass.getMethod("main", parameterTypes);//這里假設你的類為YourClass,而要調用的方法是main Object[] args = new Object[1]; String[] argments = new String[2];//假設你要傳入兩個參數 argments[0] = "OK"; argments[1] = "NO"; args[0] = argments; method.invoke(yourClass.newInstance(), args);//調用方法
⑩ android 反射代碼能混淆嗎
app發布前,最復好做一下制掃描和加固,應用掃描可以通過靜態代碼分析、動態數據跟蹤,定位出風險代碼(目前好多都是只告訴APK包裡面有風險),同時監控敏感數據的異常行為。
加固可以在一定程度上保護自己核心代碼演算法,提高破解/盜版/二次打包的難度,緩解代碼注入/動態調試/內存注入攻擊等
但也對應用的兼容性有一定影響,加殼技術不行的話,還會影響程序運行效率.
目前市面上有很多第三方加固的平台, 如果新應用發布前需要掃描或者加固的話,可以先試試免費的,例如騰訊御安全,建議自己先去掃描測試下。