Thursday 25 December 2014

How to Proguard Android APK

How to Proguard Android APK


-in jars: Specifies the input jars (or aars, wars, ears, zips, apks, or directories) of the application to be processed

-outjars:Specifies the names of the output jars (or aars, wars, ears, zips, apks, or directories). The processed input of the preceding -injars options will be written to the named jars.

-libraryjars: Specifies the library jars (or aars, wars, ears, zips, apks, or directories) of the application to be processed. The files in these jars will not be included in the output jars.

-dontskipnonpubliclibraryclassmembers: Specifies not to ignore package visible library class members (fields and methods).

-keep: Specifies classes and class members (fields and methods) to be preserved as entry points to your code.

Here  ReportingInteractionMode is a class in ACRA library. we have to keep this library in src to suppress Crash No such filed TOAST.
-keep class org.acra.ReportingInteractionMode { *; }  

Copy this contain and create file proguard.cfg and past into it.

 -injars   bin/classes  
 -injars   libs  
 -outjars   bin/classes-processed.jar  
 -libraryjars /home/.../adt-bundle-linux-x86-20140321/sdk/platforms/android-19/android.jar  
 -libraryjars /home/.../libs/android-query-full.0.26.7.jar  
 -libraryjars /home/.../libs/javassist.jar  
 -libraryjars /home/.../libs/joda-time-2.3.jar  
 -libraryjars /home/.../libs/libphonenumber-5.9.jar  
 -libraryjars /home/.../libs/nineoldandroids-2.4.0.jar  
 -optimizationpasses 1  
 -dontpreverify  
 -dontskipnonpubliclibraryclassmembers  
 -repackageclasses ''  
 -allowaccessmodification  
 -optimizations !code/simplification/arithmetic,!field  
 -keepattributes *Annotation*       
 -dontusemixedcaseclassnames  
 -dontskipnonpubliclibraryclasses  
 -dontpreverify  
 -verbose  
 -allowaccessmodification  
 -keepattributes *Annotation*  
 -dontwarn android.support.v7.**  
 -dontwarn in.android.Databases.**  
 -dontwarn in.android.PushNotification.**  
 -dontwarn in.andoroid.Utills.FileUtill  
 -dontwarn android.support.v4.**  
 -dontwarn com.androidquery.auth.**  
 -dontwarn javassist.**  
 -dontwarn org.brickred.socialauth.**  
 -dontwarn org.joda.time.**  
 -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  
 -keepclasseswithmembernames class * {  
   native <methods>;  
 }  
 -keepclasseswithmembernames class * {  
   public <init>(android.content.Context, android.util.AttributeSet);  
 }  
 -keepclasseswithmembernames class * {  
   public <init>(android.content.Context, android.util.AttributeSet, int);  
 }  
 -keepclassmembers enum * {  
   public static **[] values();  
   public static ** valueOf(java.lang.String);  
 }  
 -keep class * implements android.os.Parcelable {  
  public static final android.os.Parcelable$Creator *;  
 }  
 # for minmize ACRA library Error we are using this ReportingInteractionMode   
 # otherwise you will get No Such field Toast   
 -keep class org.acra.ReportingInteractionMode { *; }  

In project.properties add this attribute and save it.

proguard.config=proguard.cfg 

then, export the project and create new keystore if you haven't created or use existing keystore and finish the wizard.

Monday 22 December 2014

How to use Curl Library in Android


To compile Curl library for android, follow this post

Here is the simple Android Example using Curl Library.
Source Code:https://github.com/JohnnyIqbal/AndroidCurlEx

How to compile Curl Library for Android in Linux


1. Download the source code of curl library http://curl.haxx.se/download.html

2.Create a file build_andorid.sh and copy below content and save file into Curl folder.

 #!/bin/bash  
 NDK=<yourpath>/android-ndk-r9d  
 SYSROOT=$NDK/platforms/android-19/arch-arm/  
 CFLAGS="-fno-exceptions -Wno-multichar -mthumb -mthumb-interwork -nostdlib -lc -ldl -lm "  
 LDFLAGS="-Wl,--fix-cortex-a8"   
 export AR="$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-ar"  
 export LD="$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-ld"  
 export CC="$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"  
 ./configure \  
 --host=arm-linux-androideabi \  
 --prefix=/<your output folder path where include,lib and bin will folder copy >/curllib/ \  
 --exec-prefix=/<your output folder path where include,lib and bin will folder copy >/curllib/  
 make clean  
 make  
 make install  

3.Change build_android.sh mode to executable mode,Open terminal and head(i,e. cd)  to curl directory and run below code.

 sudo chmod +x 777 build_android.sh  
 ./build_android.sh  

4. If you want to download compiled curl library  for android click below link
https://github.com/JohnnyIqbal/Curl_For_Android_Compiled

5. Android Example of Curl Library https://github.com/JohnnyIqbal/AndroidCurlEx

Tuesday 16 December 2014

How to port C library to Android as a static library.

Hi,

How to port C library to Android as a static library.

We build the  C library as a static library(*.a) and build a shared library using static library. because Android packaged only shared library in apk.
SourceCode Link:https://github.com/JohnnyIqbal/PortStaticEx.git

How to port C library to Android as a shared library(.so)

Hi,

How to port C library to Android as a shared library(.so).

We build C library as a shared library for android because android packaged only shared library in apk.

SourceCode Link:https://github.com/JohnnyIqbal/PortSharedEx.git

Wednesday 14 May 2014

HelloZMQ with Java

Hi,

This is ZMQ Java Client Example.
SourceCode Link:https://github.com/JohnnyIqbal/HelloZMQwithJava

1. Compile Server File First.
2. Then Compile Client File.

Thursday 17 April 2014

NDKHello2 Tutorial

Hi,
This is my Second NDKHello2 Demo project for newbies

SourceCode Link:https://github.com/JohnnyIqbal/NDKHello2
Please add appcompat library to run this project

In this demo I added a folder src in jni folder and tried to compile.

I followed this process to make this project.

1. Create NativeLib.java file

2. Open terminal and head to project directory
  cd bin/classes   
and generate header files of NativeLib.java using this command
 javah -jni com.iqbal.ndkhello.ndk.NativeLib  
3. Copy NativeLib.h file in jni folder (Create if not exist in project root)
or you can use this command
 javah -jni -o ../../jni/NativeLib.h com.iqbal.ndkhello.ndk.NativeLib  

4. Create NativeLib.c file and copy method signature in NativeLib.c
and don't foreget to include NativeLib.h


 Method Signature eg:  
 JNIEXPORT jstring JNICALL Java_com_iqbal_ndkhello_ndk_NativeLib_getHello2  
this is the declared method in header files and change to method defination

 #include"NativeLib.h"  
 JNIEXPORT jstring JNICALL Java_com_iqbal_ndkhello_ndk_NativeLib_getHello (JNIEnv *env, jclass clz){ return (*env)->NewStringUTF(env,"Hello World2"); }  

Note:NewStringUTF sometimes this function shows error means red line to suppress this error please update your CDT.

5. Add new folder in jni called src add some c files and header files as I did main.c and main.h

6. Call main.h function in NativeLib.c by including main.h header files.
 #include"src/main.h"  
 JNIEXPORT jint JNICALL Java_com_iqbal_ndkhello2_ndk_NativeLib_getAdd(  
   JNIEnv *env, jclass clz, jint a, jint b) {  
 int c=add(a,b); //this function declared in main.h and defiened in main.c  
 return c;  
 }  

7.Now create Android.mk file and write these lines to build
 LOCAL_PATH:=$(call my-dir)  
 include $(CLEAR_VARS)   
 LOCAL_MODULE:=hello2   
 LOCAL_SRC_FILES:=NativeLib.c src/main.c  
 include $(BUILD_SHARED_LIBRARY)  

8.Create Application.mk to suppress the Warnning or error android-19 is larger than minsdkversion 8 and write this lines
 APP_PLATFORM:=android-8  
android-8 is my minsdkversion so be sure about this change according to minsdkversion in AndroidManifest.xml


9.Open terminal head to project root and fire this command
 ndk-build  

10. Now run your Android NDKHello Project.


How to sync contacts Android

Hi,

Source Code Link: https://github.com/JohnnyIqbal/ContactSyncBG

Please add appcomapt library to run this project.

This is ContactSyncBackground Demo as you see whatsapp,viber or other apps

I followed this process to achieve syncing in background

1. Create AuthenticatorService and ContactsSyncAdapter Service class.
AuthenticatorService Class is for when you create syncing account then this service run
so you can perform any operation during creating account or add account in setting.

2. To create account
SyncUtils.CreateAccount(instance, user, pass);

3. When account created successfully then you want to sync your contacts, ContactsSyncAdapterService is run when you perform syncing either manually(using setting) or automatically.

4. To perform syncing automatically
 AccountManager am = AccountManager.get(instance);  
  Account[] acclist = am.getAccounts();  
  for (Account acc : acclist) {  
   if (acc.type.equals(SyncUtils.ACCOUNT_TYPE)) {  
   // You need pass bundle to sync  
   Bundle b = new Bundle();  
   b.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);  
   b.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);  
   ContentResolver.requestSync(acc, SyncUtils.AUTHORITY, b);  
   Log.i("MainActivity", "Request to sync Contacts");  
   }  
  }  
5. After firing this operation onPerformSync() method called in ContactsSyncAdapterService
   Here you can perform network syncing operation. I poupulated the contacts in json and post to server
   and server returning me intersection of contacts.
 
6. You need to register this service in Manifiest

  <service  
       android:name="com.iqbal.contactsyncbg.sync.ContactsSyncAdapterService"  
       android:exported="true"  
       android:process=":contacts" >  
       <intent-filter>  
         <action android:name="android.content.SyncAdapter" />  
       </intent-filter>  
       <meta-data  
         android:name="android.content.SyncAdapter"  
         android:resource="@xml/sync_contacts" />  
       <meta-data  
         android:name="android.provider.CONTACTS_STRUCTURE"  
         android:resource="@xml/contacts" />  
     </service>  
     <service  
       android:name="com.iqbal.contactsyncbg.sync.AuthenticatorService"  
       android:exported="true"  
       android:process=":auth" >  
       <intent-filter>  
         <action android:name="android.accounts.AccountAuthenticator" />  
       </intent-filter>  
       <meta-data  
         android:name="android.accounts.AccountAuthenticator"  
         android:resource="@xml/authenticator" />  
     </service>  
 7. Be sure of Account Type what you defined in sync_contacts and ContactSyncAdapter must be same.
  Otherwise you will get this exception caller uid is different than the authenticator's uid to fix
  this exception you need to check account type.
     
 8. At last you need to add permission
 <uses-permission android:name="android.permission.READ_CONTACTS" />  
 <uses-permission android:name="android.permission.WRITE_CONTACTS" />  
 <uses-permission android:name="android.permission.GET_ACCOUNTS" />  
 <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />  
 <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />  
 <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />  
 <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />  

Wednesday 16 April 2014

Hello NDK

Source Code Link: https://github.com/JohnnyIqbal/NDKHello
Please add appcompat library to run this project

This is my First NDKHello Demo project for newbies

Create Simple Android Application Project.
then

1. Create NativeLib.java file

2. Open terminal and head to project directory
 cd bin/classes and  
generate header files of NativeLib.java using this command
  javah -jni com.iqbal.ndkhello.ndk.NativeLib  

3. Copy NativeLib.h file in jni folder (Create if not exist in project root)
or you can use this command
  javah -jni -o ../../jni/NativeLib.h com.iqbal.ndkhello.ndk.NativeLib  

4. Create NativeLib.c file and copy method signature in NativeLib.c
and don't foreget to include NativeLib.h

Method Signature eg:
 JNIEXPORT jstring JNICALL Java_com_iqbal_ndkhello_ndk_NativeLib_getHello  
 (JNIEnv *, jclass);  

this is the declared method in header files and change to method defination
  #include"NativeLib.h"  
 JNIEXPORT jstring JNICALL Java_com_iqbal_ndkhello_ndk_NativeLib_getHello  
  (JNIEnv *env, jclass clz){  
  return (*env)->NewStringUTF(env,"Hello World");  
 }  

Note:NewStringUTF sometimes this function shows error means red line to suppress this error please update your CDT.

5.Now create Android.mk file and write these lines
 LOCAL_PATH := $(call my-dir)  
 include $(CLEAR_VARS)  
 LOCAL_MODULE := hello  
 LOCAL_SRC_FILES := NativeLib.c  
 include $(BUILD_SHARED_LIBRARY)  

6.Create Application.mk to suppress the Warnning or error android-19 is larger than minsdkversion 8....
and write this lines
 APP_PLATFORM:=android-8  

Note:android-8 is my minsdkversion so be sure about this change according to minsdkversion in AndroidManifest.xml

7.Open terminal head to project root and fire this command
 ndk-build  

8. Now run your Android NDKHello Project.

Reference:
http://www.ntu.edu.sg/home/ehchua/programming/android/Android_NDK.html

Wednesday 15 January 2014

Java Regex for Indian Mobile Number

 public class RegExTest {  
   public static void main(String arg[]) {  
     String str = "0888"; //"+91989898" "9180709709"  
     String regex="^([\\+](91))+([0-9]+$)|(^(0))+([0-9]+$)"; //{10} if you want to give no limit  
     Pattern pat = Pattern.compile(regex);  
     Matcher mat= pat.matcher(str);  
     if (mat.matches()) {  
       System.out.println("String matched");  
     } else {  
       System.out.println("String not matched");  
     }  
   }  
 }  


To give number limit use this regex:

String regex="^([\\+](91))+([0-9]{10}$)|(^(0))+([0-9]{10}$)"; 

Here {10} means after 0 or +91 must be 10 number

Things after Kotlin Android Extensions

Things after Kotlin Android Extensions(KTX) I remembered in MVVM when I have to declare ViewModel, I initialize View Model like this. p...