Нелицензионный ответ Google Play при покупке приложения

Мое приложение для Android реализует LVL и проверяет наличие действительной лицензии при запуске. Я использую ServerManagedPolicy. Всякий раз, когда я использую тестовую учетную запись или когда приложение покупается в магазине Play, дается нелицензионный ответ, и мои пользователи очень раздражаются.

Соответствующий код:

final Random r = new SecureRandom();
    byte[] SALT = new byte[20];
    r.nextBytes(SALT);

    lkey = "MyGooglePlayKey(hidden)";

    android_id = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);

    mLicenseCheckerCallback = new MyLicenseCheckerCallback();
    mChecker = new LicenseChecker(
            this, new ServerManagedPolicy(this,
            new AESObfuscator(SALT, getPackageName(), android_id)), lkey);

Это проблема с Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID)? Естественно, лицензионная документация Android не дает никакой информации о том, как получить идентификатор устройства, а для использования другого метода требуется другое разрешение. Мой метод заставляет Android Studio сказать: «Использование getString для получения идентификаторов устройств не рекомендуется».

Из-за очень старой ошибки Lollipop мой класс LicenseChecker пришлось изменить, чтобы использовать явное намерение:

if (mService == null) {
            Log.i(TAG, "Binding to licensing service.");
            try {
                Intent serviceIntent = new Intent(new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")))
                        .setPackage("com.android.vending");

                boolean bindResult = mContext.bindService(serviceIntent,
                        this, // ServiceConnection.
                        Context.BIND_AUTO_CREATE);

Моя библиотека LVL использует тот же targetSDK/compile/minSDK, что и мое приложение:

android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
useLibrary 'org.apache.http.legacy'

defaultConfig {
    minSdkVersion 17
    targetSdkVersion 26
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}

dependencies {
    compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

Из-за того, что методы NamePairValue и URLEncodedUtils устарели, мне пришлось использовать эти заменители Apache.


person Stephen Ryan    schedule 03.09.2017    source источник


Ответы (1)


Я не эксперт в этом, но я думаю, что соль случайна только в том случае, если она случайна для вашего приложения. Вы не генерируете его на лету. См. документацию.

Чтобы использовать AESObfuscator, сначала импортируйте его в свою активность. Объявите закрытый статический окончательный массив для хранения солт-байтов и инициализируйте его 20 случайно сгенерированными байтами.

...
// Generate 20 random bytes, and put them here.
private static final byte[] SALT = new byte[] {
 -46, 65, 30, -128, -103, -57, 74, -64, 51, 88, -95,
 -45, 77, -117, -36, -113, -11, 32, -64, 89
 };
...
person Oded    schedule 03.09.2017
comment
Не работал к сожалению. Просто нажал обновление, используя его, и все еще получаю ошибку. - person Stephen Ryan; 04.09.2017
comment
Я связался со службой поддержки Google, и они сказали мне, что их серверы лицензий возвращают лицензированный ответ. - person Stephen Ryan; 16.10.2017