update ultima studio para flavors descargar defaultconfig configurar android gradle build.gradle searchable

ultima - Android: SearchableInfo es nulo cuando se usa packageNameSuffix en el script de construcción de Gradle



ultima version gradle android studio (1)

Estoy usando sabores de productos que cambian por completo el nombre del paquete. Descubrí que al usar el constructor ComponentName(Context pkg, Class<?> cls) para mi actividad de búsqueda obtengo un SearchableInfo válido.

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchableInfo searchableInfo = searchManager.getSearchableInfo(new ComponentName(this, SearchActivity.class));

También tuve que ajustar mi proveedor para utilizar un paquete diferente, por lo que mi xml buscable se encuentra en cada directorio de sabores y el proveedor también figura en el manifiesto para cada sabor. Esta es mi estructura de directorio:

src main AndoridManifest.xml flavor1 res xml search.xml AndroidManifest.xml flavor2 res xml search.xml AndroidManifest.xml

main / AndroidManifest.xml

<application android:icon="@drawable/ic_launcher" android:logo="@drawable/actionbar_icon" android:label="@string/app_name" android:name=".App" android:allowBackup="true" android:theme="@style/AppTheme"> <activity android:name=".ui.MainActivity" android:launchMode="singleTask"> <meta-data android:name="android.app.default_searchable" android:value=".ui.activity.SearchActivity"/> </activity> <activity android:name=".ui.SearchActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/search"/> </activity> <provider android:authorities=".provider.SuggestionProvider" android:name="com.example.main.provider.SuggestionProvider" android:exported="false" android:enabled="true" /> </applicaiton

flavor1 / AndroidManifest.xml

<application> <provider tools:replace="android:authorities" android:authorities="com.example.flavor1.provider.SuggestionProvider" android:name="com.example.main.provider.SuggestionProvider" android:exported="false" android:enabled="true" /> </application>

flavor1 / res / xml / search.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:includeInGlobalSearch="false" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" android:searchMode="queryRewriteFromText" android:searchSuggestAuthority="com.example.flavor1.provider.SuggestionProvider" android:searchSuggestSelection="title LIKE ?" android:searchSuggestThreshold="0" > </searchable>

flavor2 / AndroidManifest.xml

<application> <provider tools:replace="android:authorities" android:authorities="com.example.flavor2.provider.SuggestionProvider" android:name="com.example.main.provider.SuggestionProvider" android:exported="false" android:enabled="true" /> </application>

flavor2 / res / xml / search.xml

<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:includeInGlobalSearch="false" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" android:searchMode="queryRewriteFromText" android:searchSuggestAuthority="com.example.flavor2.provider.SuggestionProvider" android:searchSuggestSelection="title LIKE ?" android:searchSuggestThreshold="0" > </searchable>

Encontré que el método getSearchableInfo siempre devuelve null durante la inicialización de packageNameSuffix si uso el packageNameSuffix en el script de construcción de Gradle del proyecto.

Inicialización de SearchView:

final SearchManager searchManager = (SearchManager) context.getSystemService(Context.SEARCH_SERVICE); SearchableInfo info = searchManager.getSearchableInfo(componentName); mSearchView.setSearchableInfo(info);

Project''s build.gradle:

android { [...] buildTypes { debug { packageNameSuffix ".debug" versionNameSuffix "-debug" signingConfig signingConfigs.debug } [...] } }

Si no se usa el sufijo del paquete, el componentName dado es ComponentInfo{com.example.android/com.example.android.MapActivity} y el SearchView , así como su SuggestionsProvider asociado funcionan bien.

Pero si packageNameSuffix está establecido en ".debug" , el componentName dado es ComponentInfo{com.example.android.debug/com.example.android.MapActivity} y SearchManager devuelve null , en lugar de devolver el objeto respectivo SearchableInfo .

¿Alguien sabe cómo obtener el SearchableInfo correcto desde el SearchManager ? ¡Gracias!

[EDITAR]

Eugen Martinov mencionó en los comentarios que este comportamiento podría tener que ver con el cambio de nombre de las autoridades incorrectas o faltantes. Pero también configuré una denominación dependiente del tipo de compilación de las autoridades, que omití en la publicación inicial en aras de la simplicidad.

Project''s build.gradle:

android { [...] sourceSets { debug { java.srcDirs = [ ''src/main/java'' ] java.srcDirs = [ ''src/debug/res'', ''src/main/res'' ] } release { java.srcDirs = [ ''src/main/java'' ] java.srcDirs = [ ''src/release/res'', ''src/main/res'' ] } [...] } }

src / debug / res / values ​​/ build-config.xml:

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="cfg_app_name">App - Debug</string> <string name="cfg_authorities">com.example.debug.SuggestionsProvider</string> <string name="cfg_maps_key"><!-- some key --></string> </resources>

src / release / res / values ​​/ build-config.xml:

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="cfg_app_name">App</string> <string name="cfg_authorities">com.example.SuggestionsProvider</string> <string name="cfg_maps_key"><!-- some other key --></string> </resources>

src / main / res / xml / searchable.xml:

<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/action_search_hint" android:label="@string/cfg_app_name" android:includeInGlobalSearch="false" android:queryAfterZeroResults="true" android:searchSuggestAuthority="@string/cfg_authorities" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestThreshold="3" />

Instalar tanto la depuración (con la opción packageNameSuffix ) como la versión apk en el mismo dispositivo funciona. No obtengo un error como Error Failure [INSTALL_FAILED_CONFLICTING_PROVIDER] ... Pero como ya se dijo, SearchableInfo es null ese momento.

La instalación de ambas apk sin la opción packageNameSuffix genera el siguiente error: Error Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] - Installation failed since the device already has an application with the same package but a different signature.

¿O me falta algo aquí?

[/EDITAR]