2010-04-14 8 views
42

Sto guardando il codice della videocamera Android e quando cerco di importare android.os.SystemProperties, non è possibile trovarlo.Dove è android.os.SystemProperties?

Ecco il file sto guardando:
https://android.googlesource.com/platform/packages/apps/Camera/+/eclair-release/src/com/android/camera/VideoCamera.java

Ho creato un nuovo progetto 2.1 e provato ad importare di nuovo questo spazio dei nomi, ma ancora non può essere trovato. Ho controllato https://developer.android.com e SystemProperties non è stato elencato.

Mi sono perso qualcosa?

risposta

29

Questa è la classe nel codice sorgente di Android:

https://android.googlesource.com/platform/frameworks/base/+/eclair-release/core/java/android/os/SystemProperties.java

Vedere {@hide} nel JavaDoc classe? Ciò significa che questa classe non verrà esportata come parte dell'SDK pubblico.

L'app per fotocamera lo utilizza in quanto è interno e non utilizzerà l'SDK pubblico per crearlo.

Si può ancora essere in grado di ottenere in questa classe

  1. dalla riflessione o

  2. ottenendo la fonte, eliminando @hide e fare il proprio SDK personalizzato.

Tuttavia praticamente per definizione, si sta ora andando 'off SDK' e, pertanto, la vostra applicazione può ben essere rotto o ottenere un comportamento diverso su versioni del sistema operativo, come la gente di Android faranno piccolo sforzo di non cambiare questa classe tra le versioni.

+3

Se il collegamento del codice sorgente sopra riportato non funziona, puoi provare questo http://androidxref.com/4.3_r2.1/xref/frameworks/base/core/java/android/os/SystemProperties.java – Vins

+0

@Jim Blackler: potresti spiegare di più sulla seconda soluzione. come posso creare il mio SDK? –

12

Si potrebbe exec fuori al comando getprop:

String line = ""; 
try { 
Process ifc = Runtime.getRuntime().exec("getprop ro.hardware"); 
BufferedReader bis = new BufferedReader(new InputStreamReader(ifc.getInputStream())); 
line = bis.readLine(); 
} catch (java.io.IOException e) { 
} 
ifc.destroy(); 
+0

Non c'è IMEI/IMSI in getprop: https://guardianproject.info/wiki/Google_Nexus_S_I9023_running_stock_4.0.4 –

+0

Ecco un esempio di accuya: http://stackoverflow.com/a/11623309/4515489 – jk7

55

Se si utilizza l'opzione "riflesso", è possibile utilizzare la classe di sotto

package com.etc.etc; 

import java.io.File; 
import java.lang.reflect.Method; 
import android.content.Context; 
import dalvik.system.DexFile; 


public class SystemPropertiesProxy 
{ 

/** 
* This class cannot be instantiated 
*/ 
private SystemPropertiesProxy(){ 

} 

    /** 
    * Get the value for the given key. 
    * @return an empty string if the key isn't found 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static String get(Context context, String key) throws IllegalArgumentException { 

     String ret= ""; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[1]; 
      paramTypes[0]= String.class; 

      Method get = SystemProperties.getMethod("get", paramTypes); 

      //Parameters 
      Object[] params= new Object[1]; 
      params[0]= new String(key); 

      ret= (String) get.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= ""; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key. 
    * @return if the key isn't found, return def if it isn't null, or an empty string otherwise 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static String get(Context context, String key, String def) throws IllegalArgumentException { 

     String ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= String.class;   

      Method get = SystemProperties.getMethod("get", paramTypes); 

      //Parameters 
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new String(def); 

      ret= (String) get.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key, and return as an integer. 
    * @param key the key to lookup 
    * @param def a default value to return 
    * @return the key parsed as an integer, or def if the key isn't found or 
    *   cannot be parsed 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static Integer getInt(Context context, String key, int def) throws IllegalArgumentException { 

     Integer ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= int.class; 

      Method getInt = SystemProperties.getMethod("getInt", paramTypes); 

      //Parameters 
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new Integer(def); 

      ret= (Integer) getInt.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key, and return as a long. 
    * @param key the key to lookup 
    * @param def a default value to return 
    * @return the key parsed as a long, or def if the key isn't found or 
    *   cannot be parsed 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static Long getLong(Context context, String key, long def) throws IllegalArgumentException { 

     Long ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
       Class SystemProperties= cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= long.class; 

      Method getLong = SystemProperties.getMethod("getLong", paramTypes); 

      //Parameters 
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new Long(def); 

      ret= (Long) getLong.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Get the value for the given key, returned as a boolean. 
    * Values 'n', 'no', '0', 'false' or 'off' are considered false. 
    * Values 'y', 'yes', '1', 'true' or 'on' are considered true. 
    * (case insensitive). 
    * If the key does not exist, or has any other value, then the default 
    * result is returned. 
    * @param key the key to lookup 
    * @param def a default value to return 
    * @return the key parsed as a boolean, or def if the key isn't found or is 
    *   not able to be parsed as a boolean. 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    */ 
    public static Boolean getBoolean(Context context, String key, boolean def) throws IllegalArgumentException { 

     Boolean ret= def; 

     try{ 

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = cl.loadClass("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= boolean.class; 

      Method getBoolean = SystemProperties.getMethod("getBoolean", paramTypes); 

      //Parameters   
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new Boolean(def); 

      ret= (Boolean) getBoolean.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      ret= def; 
      //TODO 
     } 

     return ret; 

    } 

    /** 
    * Set the value for the given key. 
    * @throws IllegalArgumentException if the key exceeds 32 characters 
    * @throws IllegalArgumentException if the value exceeds 92 characters 
    */ 
    public static void set(Context context, String key, String val) throws IllegalArgumentException { 

     try{ 

      @SuppressWarnings("unused") 
      DexFile df = new DexFile(new File("/system/app/Settings.apk")); 
      @SuppressWarnings("unused") 
      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes") 
      Class SystemProperties = Class.forName("android.os.SystemProperties"); 

      //Parameters Types 
      @SuppressWarnings("rawtypes") 
       Class[] paramTypes= new Class[2]; 
      paramTypes[0]= String.class; 
      paramTypes[1]= String.class; 

      Method set = SystemProperties.getMethod("set", paramTypes); 

      //Parameters   
      Object[] params= new Object[2]; 
      params[0]= new String(key); 
      params[1]= new String(val); 

      set.invoke(SystemProperties, params); 

     }catch(IllegalArgumentException iAE){ 
      throw iAE; 
     }catch(Exception e){ 
      //TODO 
     } 

    } 
} 
+0

Funziona? Ho provato SystemPropertiesProxy.get (questo, "android.telephony.TelephonyProperties.PROPERTY_IMSI"); ma viene vuoto. –

+0

@ bruno.braga, non è quel tipo di proprietà che si ottiene da SystemProperties. Per vedere quali proprietà puoi ottenere dal tuo dispositivo in questo modo, esegui 'adb shell getprop'. – lapis

+0

@Psycho, si lo so ... questo è il punto ... per nessuno dei dispositivi che ho provato, questo è disponibile su getprop. Ecco perché penso che questo semplicemente non funzioni. –

14

Dopo un sacco di guai I' Abbiamo finalmente ottenuto il codice di riflessione sopra il funzionamento sia per impostare e creare nuove proprietà del sistema nativo, ci sono alcuni avvertimenti:

  1. Devi essere l'utente del sistema, aggiungi: android: sharedUserId = "android.uid.system" al manifest.

  2. Devi firmare l'APK con la chiave della piattaforma, ho barato e appena sovrascritto chiave di firma predefinita di debug in Eclipse come mostrato qui: http://stoned-android.blogspot.co.uk/2012_01_01_archive.html

  3. Il nativo proprietà del sistema di servizio ha un ACL che controlla tutto scrivere l'accesso alle proprietà è possibile sovvertire uno spazio chiave (come sys o debug). Vedere /system/core/init/property_service.c:

    { "net", AID_SYSTEM, 0}, { "dev"., AID_SYSTEM, 0}, { "fase di esecuzione.", AID_SYSTEM, 0 }, {"hw.", AID_SYSTEM, 0}, {" sys. ", AID_SYSTEM, 0}, {" servizio. ", AID_SYSTEM, 0}, {" wlan. ", AID_SYSTEM, 0}, {" dhcp. ", AID_SYSTEM, 0},

Oppure, se si sta rotolando il proprio accumulo si potrebbe aggiungere la propria chiave se si voleva davvero, ma sembra più facile di riutilizzare uno dei precedenti.

21

la classe postato come risposta dell'utente Void ha un sacco di cose inutili. Ecco la mia classe che utilizza la riflessione su android.os.SystemProperties:

/* 
* Copyright (C) 2015 Jared Rummler 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

/** 
* Gives access to the system properties store. The system properties store contains a list of 
* string key-value pairs. 
*/ 
public class SystemProperties { 

    private static final Class<?> SP = getSystemPropertiesClass(); 

    /** 
    * Get the value for the given key. 
    */ 
    public static String get(String key) { 
    try { 
     return (String) SP.getMethod("get", String.class).invoke(null, key); 
    } catch (Exception e) { 
     return null; 
    } 
    } 

    /** 
    * Get the value for the given key. 
    * 
    * @return if the key isn't found, return def if it isn't null, or an empty string otherwise 
    */ 
    public static String get(String key, String def) { 
    try { 
     return (String) SP.getMethod("get", String.class, String.class).invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    /** 
    * Get the value for the given key, returned as a boolean. Values 'n', 'no', '0', 'false' or 
    * 'off' are considered false. Values 'y', 'yes', '1', 'true' or 'on' are considered true. (case 
    * sensitive). If the key does not exist, or has any other value, then the default result is 
    * returned. 
    * 
    * @param key 
    *  the key to lookup 
    * @param def 
    *  a default value to return 
    * @return the key parsed as a boolean, or def if the key isn't found or is not able to be 
    * parsed as a boolean. 
    */ 
    public static boolean getBoolean(String key, boolean def) { 
    try { 
     return (Boolean) SP.getMethod("getBoolean", String.class, boolean.class) 
      .invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    /** 
    * Get the value for the given key, and return as an integer. 
    * 
    * @param key 
    *  the key to lookup 
    * @param def 
    *  a default value to return 
    * @return the key parsed as an integer, or def if the key isn't found or cannot be parsed 
    */ 
    public static int getInt(String key, int def) { 
    try { 
     return (Integer) SP.getMethod("getInt", String.class, int.class).invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    /** 
    * Get the value for the given key, and return as a long. 
    * 
    * @param key 
    *  the key to lookup 
    * @param def 
    *  a default value to return 
    * @return the key parsed as a long, or def if the key isn't found or cannot be parsed 
    */ 
    public static long getLong(String key, long def) { 
    try { 
     return (Long) SP.getMethod("getLong", String.class, long.class).invoke(null, key, def); 
    } catch (Exception e) { 
     return def; 
    } 
    } 

    private static Class<?> getSystemPropertiesClass() { 
    try { 
     return Class.forName("android.os.SystemProperties"); 
    } catch (ClassNotFoundException shouldNotHappen) { 
     return null; 
    } 
    } 

    private SystemProperties() { 
    throw new AssertionError("no instances"); 
    } 

} 
+0

Vedo che il metodo set non funziona. Il mio dispositivo è stato rootato. Quando eseguo il codice, l'app SuperSU non appare nella finestra di dialogo per ottenere il permesso. Quindi penso che il tuo codice non inneschi davvero un'autorizzazione. – hqt

+0

@hqt sarà necessario eseguire setprop in una shell. Dovrei rimuovere il metodo setprop. –

1

Dopo molte ricerche ho trovato un modo per impostare la proprietà di sistema per Android. Non sono riuscito a trovare una soluzione per la versione Android di Lollipop. Ma ho avuto successo nel farlo. Per impostare la proprietà di sistema dobbiamo utilizzare:

import android.os.SystemProperties 
SystemProperties.set(key, value). 

ad es. SystemProperties.set("sys.android", 5.0)

Ora è necessario dare autorizzazioni per la nuova proprietà di sistema Vai /home/inkkashy04/Android_Lollypop/external/sepolicy/property_contexts e dare il permesso adatto alla vostra proprietà

sys.android u: object_r: system_prop: S0

Ora dopo aver lampeggiato la tua immagine puoi vedere le proprietà del tuo sistema elencate per comando:

adb shell getprop