Определить, было ли приложение загружено с Android Market

У меня есть библиотека Android, которая загружает данные на тестовый сервер и рабочий сервер. Я бы хотел, чтобы разработчики, использующие эту библиотеку, использовали тестовый сервер при разработке и рабочий сервер при загрузке приложения с Android Market.

Возможно ли, чтобы приложение сообщило, откуда оно появилось (рыночное или не рыночное?), Я мог бы предположить, что можно обнаружить наличие подписанного файла JAR.

 sehugg12 июн. 2009 г., 16:31
Грант, разница, которую я ищу, на самом деле - время разработки и время производства, поэтому я хочу, чтобы копии разработчика оставались на тестовом сервере. Я просто хочу, чтобы любые приложения, которые были загружены "в дикой природе", использовали рабочий сервер.
 OJW07 окт. 2010 г., 19:13
Создать другое приложение, которое ничего не делает, а затем проверить его на наличие отладочной сборки? Установите приложение на телефонах для разработчиков.
 Grant12 июн. 2009 г., 16:07
Хотите знать, опубликовано ли приложение или откуда его скачал конечный пользователь? Например, либо пользователь загрузил приложение с рынка, чтобы рыночные приложения использовали рабочий сервер, либо приложение было опубликовано, чтобы все копии этого приложения стали производственными приложениями.

Ответы на вопрос(5)

PackageManager.getInstallerPackageName (String), Из документации:

Получить имя пакета приложения, которое установило пакет. Это определяет, с какого рынка пришла посылка.

Чтобы получить пакет Android Market,эта почта может помочь

вы могли бы добавить настройку для вашего приложения для «режима разработчика».

Другая возможность - найти специальный файл или файл конфигурации на SD-карте и отключить его.

среду и использовать пользовательскиеInstrumentation это устанавливает конфигурацию в среду тестирования. Интрументация должна быть удалена перед публикацией на андроид маркет.

что я могу сказать, нет ничего, что Market Market делает, чтобы "пометить" приложение, чтобы сказать, что оно было загружено с маркета.

Я видел, как эта проблема по-другому подходила другой библиотеке Android. AdMob Android SDK можно бесплатно загрузить и использовать, как описанона их вики, Эта библиотека служит для показа рекламы, поэтому они также хотят определить, тестируется ли приложение, которое в данный момент выполняется, разработчиком или оно используется «в дикой природе». Их подход состоял в том, чтобы потребовать, чтобы разработчик установил атрибут «testing» в XML или вызвал в своих библиотеках функцию «setTesting (boolean)», чтобы библиотека знала, какую рекламу показывать. Это, очевидно, скорее ручной подход, при котором разработчик должен изменить одну строку кода или XML перед публикацией.

 sehugg13 июн. 2009 г., 06:09
Да, это один из подходов ... проблема в том, что трудно помнить, чтобы изменить его обратно, когда вы публикуете :) Я искал способ, который был бы автоматическим. Ну что ж.
 Paul Lammertsma20 нояб. 2011 г., 20:48
Вы можете настроитьbuild.xml Скрипт Ant для замены переменных между выпуском и сборкой отладки. Я сделал это таким образом, чтобы класс конфигурации (для ключей Facebook и Twitter) и файл ресурсов (для Google Maps) менялись местами автоматически.
Решение Вопроса

вы можете использовать подпись для этого. Если вы используете ключ отладки для подписи приложения во время разработки и ключ выпуска при загрузке приложения на рынок, вы можете проверить подпись, с которой было подписано приложение, и на основе этого тестового или производственного сервера. Вот небольшой фрагмент кода, чтобы прочитать подпись вашего приложения:

    try {
        PackageManager manager = context.getPackageManager(); 
        PackageInfo appInfo = manager.getPackageInfo(
            YOUR_PACKAGE_NAME, PackageManager.GET_SIGNATURES);

        // Now test if the first signature equals your debug key.
        boolean shouldUseTestServer = 
            appInfo.signatures[0].toCharsString().equals(YOU,R_DEBUG_KEY);

    } catch (NameNotFoundException e) {
        // Expected exception that occurs if the package is not present.
    }

YOUR_PACKAGE_NAME должно быть что-то вроде 'com.wsl.CardioTrainer'. Это должно быть имя пакета, которое вы использовали в вашем AndroidManifest.xml. Удачи

отметка

 Declan Shanaghy06 нояб. 2009 г., 19:59
Это может решить проблему, но я бы определенно НЕ вставил свой полный закрытый ключ в мой код, если бы я был вами. Может быть, вы могли бы обойтись просто с помощью набора из 20 символов ключа или что-то в этом роде?
 PacificSky08 мая 2012 г., 18:44
Вы не хотите сравнивать подпись с вашим ключом отладки. Вместо этого вы должны сравнить основную часть подписи X500 с вашим ключом отладки (или ключом выпуска, или любым другим ключом). Видетьstackoverflow.com/a/6203440/596599
 Austyn Mahoney09 янв. 2010 г., 01:22
Я думаю, используя какой-то хэш для вашего ключа и жесткое кодирование, затем хешируем ключ, сохраненный в информации о пакете, затем проверяем, чтобы никто не увидел реальный ключ, если он был реверс-спроектирован.
 Rob Kent01 мар. 2010 г., 12:03
Разве вы не обойдете проблему безопасности, если будете тестировать ключ отладки, а не ключ релиза?
 Thushan16 июл. 2009 г., 21:07
Хорошая идея - жестко закодировать YOUR_RELEASE_KEY? Обратное проектирование покажет это?

Ваш ответ на вопрос