Tenemos una aplicación de taxi que ha tenido bastante éxito en Europa. Pero recientemente, uno de nuestros competidores ha comenzado a comprobar si nuestra aplicación está instalada y, si lo está, no funcionará hasta que el usuario desinstale nuestra aplicación desde su teléfono.
Inicialmente hicimos algunas actualizaciones manuales con un nombre de paquete diferente para omitir su cheque, pero están usando un escaneo manual, es decir:
- Obtienen una lista de nombres de paquetes instalados desde el teléfono del usuario
- La lista se envía a sus servidores
- Alguien verifica los nombres y marca el nombre de nuestro paquete
- las banderas son empujadas a sus aplicaciones y una vez más estamos bloqueados
Ellos no distribuyen su aplicación a través de Play Store, por lo que no podemos presentar una queja sobre ellos a Google. ¿Hay alguna otra posibilidad de pasar por alto esta verificación? por ejemplo, cambiar el nombre del paquete en tiempo de ejecución? Actualmente estamos perdiendo usuarios, ya que el competidor tiene más pedidos (clientes) para sus controladores y la mayoría de nuestros usuarios desinstalarían nuestra aplicación para poder usar los suyos.
ACTUALIZACIÓN: decidieron descompilar su aplicación y ver qué están haciendo allí. Me equivoqué en su estrategia. Han codificado nuestra compañía y el nombre de la aplicación en sus forbiddenApps preferencias A continuación se muestra el código que están utilizando, especialmente el método refineForbiddenSet()
es donde nuestra aplicación se marca hasta donde puedo ver.
public class ForbiddenAppHelper
{
public ForbiddenAppHelper()
{
}
public static void UninstallApp(Context context, String s)
{
context.startActivity(new Intent("android.intent.action.DELETE", Uri.fromParts("package", s, null)));
}
public static boolean forbiddenAppsExist(Context context, String s)
{
return getForbidden(context, s).size() != 0;
}
public static Drawable getAppIcon(Context context, String s)
{
PackageManager packagemanager = context.getPackageManager();
Drawable drawable;
try
{
drawable = packagemanager.getApplicationIcon(s);
}
catch (android.content.pm.PackageManager.NameNotFoundException namenotfoundexception)
{
namenotfoundexception.printStackTrace();
return null;
}
return drawable;
}
public static String getAppName(Context context, PackageManager packagemanager, String s)
{
if (packagemanager == null)
{
packagemanager = context.getPackageManager();
}
ApplicationInfo applicationinfo1 = packagemanager.getApplicationInfo(s, 0);
ApplicationInfo applicationinfo = applicationinfo1;
_L1:
android.content.pm.PackageManager.NameNotFoundException namenotfoundexception;
Object obj;
if (applicationinfo != null)
{
obj = packagemanager.getApplicationLabel(applicationinfo);
} else
{
obj = "(unknown)";
}
return (String)obj;
namenotfoundexception;
applicationinfo = null;
goto _L1
}
public static ArrayList getApplicationList(Context context)
{
ArrayList arraylist = new ArrayList();
PackageManager packagemanager = context.getPackageManager();
List list = packagemanager.getInstalledPackages(0);
int i = 0;
do
{
if (i >= list.size())
{
return arraylist;
}
PackageInfo packageinfo = (PackageInfo)list.get(i);
if (packageinfo.versionName != null)
{
String s = packageinfo.packageName;
arraylist.add(new InstalledApplication(packageinfo.applicationInfo.loadLabel(packagemanager).toString(), s));
}
i++;
} while (true);
}
private static ArrayList getForbidden(Context context, String s)
{
HashSet hashset;
StringTokenizer stringtokenizer;
ArrayList arraylist;
hashset = new HashSet();
stringtokenizer = new StringTokenizer(s, ";");
arraylist = new ArrayList();
arraylist = getApplicationList(context);
_L3:
boolean flag = stringtokenizer.hasMoreTokens();
if (flag) goto _L2; else goto _L1
_L1:
return refineFobiddenSet(arraylist, hashset);
_L2:
hashset.add(stringtokenizer.nextToken());
goto _L3
Exception exception;
exception;
Crashlytics.logException(exception);
goto _L1
}
public static String[] getForbiddenApps(Context context, String s)
{
ArrayList arraylist = getForbidden(context, s);
return (String[])arraylist.toArray(new String[arraylist.size()]);
}
private static ArrayList refineFobiddenSet(ArrayList arraylist, HashSet hashset)
{
ArrayList arraylist1 = new ArrayList();
Iterator iterator = hashset.iterator();
do
{
if (!iterator.hasNext())
{
return new ArrayList(new HashSet(arraylist1));
}
String s = (String)iterator.next();
Iterator iterator1 = arraylist.iterator();
while (iterator1.hasNext())
{
InstalledApplication installedapplication = (InstalledApplication)iterator1.next();
if (installedapplication.name.equals(s) || installedapplication.pname.equals(s))
{
arraylist1.add(installedapplication.pname);
}
}
} while (true);
}
}