Я искал это решение повсюду, но я пока не могу заставить его работать. Мой ключ API Google хранится в строке внутри папки res, я включил proguard в свой проект, установил свойства, позже создав APK (попробовал как без знака, так и подписанный), но все же смог выполнить обратную разработку для моего сгенерированного APK, чтобы получить снова использовать Google Key (с помощью Android Studio или даже http://www.javadecompilers.com/apktool).Как обфускать ключи Google в Android с помощью ProGuard
В своей документации Google рекомендует хранить ключи API в папке res, чтобы использовать его в манифесте, но никогда не объясняет, как помочь с защитой от обратного проектирования на этом ключе.
Мой AndroidManifest.xml
имеет этот кусок кода:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.proyecto.cutcsa.cutcsa" >
...
<application
android:allowBackup="true"
android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="android.support.multidex.MultiDexApplication">
...
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_key" />
...
</application>
</manifest>
Мои build.gradle
имеет следующий:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "23.0.3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.proyecto.cutcsa.cutcsa"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
debuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
javaMaxHeapSize "4g"
}
}
dependencies {
...
}
И мой `proguard-rules.pro -optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-dontwarn java.awt.**
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
Может кто-нибудь помочь мне с этой проблемой? Я буду очень признателен. Заранее спасибо!
https://github.com/GoogleCloudPlatform/android-docs-samples/blob/master/speech/Speech/app/src/main/java/com/google/cloud/android/speech/AccessTokenLoader.java#L68 как уже отмечалось, ваш дизайн не очень хорош. Вам необходимо разместить процесс, который будет предоставлять токен в ответе, как указано в документах. –
@ Robert Rowntree благодарит вас за ответ. Почему вы говорите, что мой дизайн не очень хорош? Google предлагает работать со своими ключами API таким образом: https://developers.google.com/maps/documentation/android-api/start Кроме того, как образец, который вы разместили в своем комментарии, работает? Как мне это назвать? Как его использовать? С уважением! –
Если у вас есть причина для предупреждения, выпущенного google в кодовой ссылке, вы в порядке. Заметка о предупреждении ... Мобильный клиент, запрашивающий токен доступа с сервера (SECURE), отличается от клиента, который просто хранит либо api-key, либо, как в примере, сохраняет весь CREDENTIAL. Даже при запутывании ключ KEY в ./res/raw или CREDENTIAL в ./res/raw не является лучшей защитой. –