Как импортировать *.so библиотеку в Android Studio

Если при запуске прилки – вылетает ошибка:
java.lang.UnsatisfiedLinkError: Couldn’t load mylibrary: findLibrary returned null
То надо сделать следующее:
переместить mylibrary.so сюда:
src/main/jniLibs/armeabi/mylibrary.so

Источник: http://www.kylethielk.com/blog/include-native-so-library-in-apk-with-android-studio/

Как экспортировать jks в pem и pk8

keytool -importkeystore -srckeystore trololo.jks -destkeystore trololo.p12 -srcalias trololoalias -srcstoretype jks -deststoretype pkcs12
openssl pkcs12 -in trololo.p12 -out trololo.pem
openssl pkcs8 -topk8 -outform DER -in trololo.pem -inform PEM -out trololo.pk8 -nocrypt

Если в windows вылетает предупреждение:

WARNING: can't open config file: /usr/local/ssl/openssl.cnf

Надо набрать команду:

set OPENSSL_CONF=<path to openssl>bin\openssl.cfg

Доступ в директорию по sFTP в Ubuntu

Задача стоит в следующем – дать доступ по sFTP только в определенную директорию для определенного юзера. FTP все-таки ставить не хочется.

Что мы делаем:

Создаем группу sftp:

sudo groupadd -g 6000 sftp

Создаем пользователя:

sudo useradd -g sftp -u 6000 testuser -d /site1.ru/ -m

Создаем директорию для этого юзера:

sudo mkdir /var/www/site1.ru
sudo mkdir /var/www/site1.ru/data

Устанавливаем права на директории:

sudo chown root /var/www/site1.ru
sudo chown testuser:sftp /var/www/site1.ru/data

Как видно – права установленны разные. Root – это необходимо для chroot, чтобы можно было залогиниться по sFTP, а на внутреннюю папку data – стоят уже права пользователя, чтобы он мог производить в ней манипуляции с файлами.

Редактируем /etc/ssh/sshd_config

Subsystem sftp internal-sftp
      Match Group sftp
      ChrootDirectory /var/www%h
      ForceCommand internal-sftp

Если ниже идет UsePAM yes – убираем ее над Subsystem.

Перезагружаем ssh:

sudo service ssh restart

Вот и все! Теперь все юзеры, которые будут добавлены в группу sftp будут иметь доступ только к одной директории.

Multidex для android ниже 5.x

Итак, чтобы заработал нормально multidex и прилка не крэшилась со всякими ошибками на android 4.x и ниже, надо сделать следующее:

1) В build.gradle добавить:

defaultConfig {
....
    multiDexEnabled true
}
...
dependencies {
....
    compile 'com.android.support:multidex:1.0.0'
}
...
afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = ['--multi-dex']
        } else {
            dx.additionalParameters += '--multi-dex'
        }

        // Add more additional parameters like this:
        dx.additionalParameters += '--minimal-main-dex'
    }
}

2) Если у прилки есть Application class:

import android.support.multidex.MultiDex;
import android.content.Context;
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

3) Если Application class отсутствует, то в manifest в application:

android:name="android.support.multidex.MultiDexApplication"

получится:

<application
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme"
        android:label="@string/app_name"
        android:allowBackup="true"
        android:name="android.support.multidex.MultiDexApplication">

Ну и очень неплохо все расписано вот тут у человека:
DEX’s 64k limit is not a problem anymore, well almost…
Дополнительно:
MultiDex solution for 64k limit in Dalvik

Android Gradle командная строка

Установка JAVA:

sudo apt-get update
sudo apt-get install openjdk-7-jdk

Для Ubuntu x64:

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386 libc6:i386 lib32z1
cd /usr/lib32
sudo ln -sf libstdc++.so.6 libc++.so
cd /usr/lib
sudo ln -sf /usr/lib32/libstdc++.so.6 libc++.so

Чтобы сохранить путь навсегда. Необходимо записать его в файл профиля для юзера и для root:

sudo nano ~/.bashrc:
LD_LIBRARY_PATH=/usr/lib32
export LD_LIBRARY_PATH
sudo apt-get install python-software-properties
apt-get install software-properties-common
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

Выбор версии JAVA:

sudo update-alternatives --config java

Установка необходимых пакетов:

sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
  libgl1-mesa-dev libxml2-utils xsltproc unzip

Установка SDK и обновлений из командной строки:

cd /opt
tar zxf android-sdk_r24.4.1-linux.tgz
cd /opt/android-sdk-linux/tools
./android update sdk -u

-u – это значит без интерфейса. Также можно использовать --no-ui.

Чтобы запускался ./gradlew:

chmod +x gradlew

Чтобы установить определенную SDK и прочее:

./android list sdk --all
./android update sdk -u -a -t <package number>
./android update sdk -u -a -t 1,2,3,4,...,n

http://stackoverflow.com/questions/17963508/how-to-install-android-sdk-build-tools-on-the-command-line
https://source.android.com/source/initializing.html
http://amandroid.sireum.org/docs/tutorial.html#troubleshooting

Как делать HTTPS запросы с Volley

Создаем класс:

package info.androidhive.customlistviewvolley;

import com.android.volley.toolbox.HurlStack;

import java.security.SecureRandom;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class NukeSSLCerts extends HurlStack {
    public NukeSSLCerts() {
            try {
                TrustManager[] trustAllCerts = new TrustManager[]{
                        new X509TrustManager() {
                            public X509Certificate[] getAcceptedIssuers() {
                                X509Certificate[] myTrustedAnchors = new X509Certificate[0];
                                return myTrustedAnchors;
                            }

                            @Override
                            public void checkClientTrusted(X509Certificate[] certs, String authType) {
                            }

                            @Override
                            public void checkServerTrusted(X509Certificate[] certs, String authType) {
                            }
                        }
                };

                SSLContext sc = SSLContext.getInstance("SSL");
                sc.init(null, trustAllCerts, new SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
                HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String arg0, SSLSession arg1) {
                        return true;
                    }
                });
            } catch (Exception e) {
            }
    }
}

Меняем вызов:

mRequestQueue = Volley.newRequestQueue(getApplicationContext());

На:

mRequestQueue = Volley.newRequestQueue(getApplicationContext(), new NukeSSLCerts());

Источники:
http://blog.denevell.org/android-trust-all-ssl-certificates.html
http://lawgimenez.com/android-stuffs/2015/8/1/gzlpm7qwh73c66rj5opu00gji7ecmt