0

Android CTSを試しています。私はandroid.permission中に問題に直面しています。

02-05 15:57:27 I/192.168.90.48:5555:         
android.permission.cts.NoNetworkStatePermissionTest#testSecurityExceptionFromDns FAIL 
junit.framework.AssertionFailedError
at android.permission.cts.NoNetworkStatePermissionTest.testSecurityExceptionFromDns
(NoNetworkStatePermissionTest.java:174)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)

私の推測では、このテスト チェック許可。プログラムは以下のように試みます:

public void testSecurityExceptionFromDns() throws Exception {
    try {
        InetAddress.getByName("www.google.com");
        fail();
    } catch (SecurityException expected) {
    }   
}   

予想される動作は、このアプリケーションがセキュリティ例外をスローしていないため、プログラムがセキュリティ例外をスローすることです。 android.permission.INTERNET

権限がなくても InetAdress を取得できます。

どうすればこの状況を修正できますか?

/dev/socket などのアクセス許可は既に確認しています

誰かが何が起こっているのか教えてもらえますか?

ありがとう。

4

3 に答える 3

0

アクセス許可はカーネルでチェックされるINTERNETため、すべての Android パッチが適用されていないカーネルを使用している可能性があります。CONFIG_ANDROID_PARANOID_NETWORKパッチを適用したと仮定すると、インターネット許可チェックを有効にするためにコンパイルする必要があり ます。このチェックでは、ソケットなどを作成しようとするすべてのプロセスがinetグループ (GID 3003) のメンバーである必要があります。

于 2014-02-05T08:50:38.227 に答える
0

お返事ありがとうございます。私はこの問題を解決しました!!!!!!!!!. 根本的な原因は、デバイスのカーネル バージョンにあります。linux_kernel 2.6.34 を使用しています。そのため、CONFIG_ANDROID_PARANOID_NETWORK オプションはなく、af_inet.c には権限をチェックする関数が定義されていません。

だから私は以下のように変更します:

ネット/ipv4/af_inet.c

/* add ifdef CONFIG_ANDROID_PARANOID_NETWORK for CTS(android.permission) */
#ifdef CONFIG_ANDROID_PARANOID_NETWORK  
#include <linux/android_aid.h>
static inline int current_has_network(void)
{
    return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
}
#else
static inline int current_has_network(void)
{
    return 1;
}
#endif
/* end add */

static inline int current_has_network(void)
 {
    return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
int try_loading_module = 0;
int err;

if (!current_has_network()) // check permission
    return -EACCES;         // return if it has no permission 
 if (unlikely(!inet_ehash_secret))
if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
    build_ehash_secret();
于 2014-02-06T06:42:19.610 に答える