Задать вопрос
Full-time Android Developer,
Интересы: Android, Java, WebServices, Patterns, Refactoring, Testing
В свободное время: ролики/коньки (приветствую компанию единомышленников и обмен опытом!)
Контакты

Наибольший вклад в теги

Все теги (12)

Лучшие ответы пользователя

Все ответы (7)
  • Как генерировать и хранить ключи шифрования под Андроид?

    TonyCode
    @TonyCode
    В андроид локально хранить данные можно только в 3-х местах:
    1. sdcard
    2. внутренняя память
    3. Защищённая (на нерутованных устройствах) область каждого приложения /data/data/ru.mycompany.myapp/

    В первых 2-х лазить может любое приложение
    В 3-ем только наше, но если телефон рутованый/либо лазит вирус - то тот, кто сможет получить доступ (через SuperSU либо exploit)

    => Остаётся хранить только как в /data/data/ru.mycompany.myapp/ плюс хранить не в чистом виде, а пошифровав сам ключ с помощью второго ключа (хоть xor-ом), который захардкоден в приложении.
    Плюс в самом приложении вместо захардкоденного второго ключа ("ключа для ключа") - его можно динамически формировать по-частям, дабы не хранить целиком, иначе простым дизассемблированием можно его легко получить. Думаю этого должно хватить.

    ---
    Если быть совсем параноиком - надо еще нереально заобфусцировать весь код превратив его в "big ball of mud" / встроить антиотладку (замерить время - и если превышает - идти на "обманную" ветку выполнения) - тогда уж точно мало кто захочет разбираться во всём этом...

    ---
    Upd: Динамическая генерация мастер-ключа с обфускацией - даже дизассемблировав приложение, повозиться с такой головоломкой захочет не каждый...

    public String getSomeKey1() {
        return "5";
    }
    public String getSomeKey2() {
        long key[32];
    
        key[0] = 9; 
        key[2] = 55; 
        a = (key[0] + key[2]) * 3; 
        key[1] = (a % 10) + someFunc() * 99; 
        key[4] = (a / 10) * someFunc2() / someFunc3(); 
        if (someFunc4()) { 
            key[5] = someFunc5(); 
        } else { 
            key[5] = someFunc6(); 
        }
        key[6] = Integer.valueOf(getSomeKey1());
        key = process1(key);
        key[2] = getSomeKey3();
        // ...
        StringBuilder sb = new StringBuilder();
        for (long i: key) {
            sb.append(i);
        }
    
        return sb.toString();
    }
    public long[] process1(long[] key) {
        key[3] = (key[4] + key[5] + key[1]*2) / 5;
        key[1] = getSomeKey();
        // ...
    }
    public long getSomeKey3() {
        long a = 435345435;
        boolean b = false;
        while (!b) {
            b = true;
            for (i=2; i<(long)Math.sqr(a); i++) {
                if (a % i == 0) { 
                    b = false;
                    break;
                }
            }
            a++:
        }
        return a+10;
    }
    
    // Итоговый мастер-ключ получаем так:
    String masterKey = getSomeKey4() + getSomeKey2() + Integer.valueOf(getSomeKey1());
    Ответ написан
    2 комментария
  • Технологий много - как найти время на все? Стоит ли дергаться, изучая параллельно несколько?

    TonyCode
    @TonyCode
    Предлагаю выбрать направление, которому бы ты хотел посвятить 5-10-15 лет программистской практики и углубляться в него, повышая свой профессионализм - дабы стать экспертом в данной области. Главное - выбрать то, "к чему душа лежит", дабы заниматься с особым интересом и не "остыть" спустя пару месяцев-полгода. Иначе получается, что работал тут, тут и тут, а профи толком ни в одном деле не стал...

    Но при этом попутно не забывать и про вопрос "а что вообще кругом творится?" и в свободное от основного направления время "играться" с другими областями на свой вкус - дабы быть хотя бы частично в курсе всех новшеств. Вобщем, проба нового остаётся для того, чтобы не отстать от всего мира, но она занимает процентов 5-10 от всего "программирования".

    Мне скоро 25, я плотно "зарылся" в Android и Java, но периодически наступает "перегорание"/хандра/"как-то всё уж больно привычно"/"хочется новенького" и в свободное время отвлекаюсь, например, на Bootstrap, PHP, администрирование Linux, фундаментальные алгоритмы и структуры данных - дабы набраться эмоций, вернуть "вкус к жизни" и быть в курсе IT-мейнстрима
    Ответ написан
    1 комментарий
  • Что делать, если Google Play забанил разработчика?

    TonyCode
    @TonyCode
    Похоже, что ситуация сильно тяжелая и выхода всего два:

    1. Упорно добиваться контакта с саппортом, посыпать голову пеплом и вести переговоры о разруливании ситуации

    2. Начать всё с нуля и больше не "шалить" - склонировать свои приложения (сменить название/оформление/package - всё, так чтобы было вообще не узнать) и выложить из-под другого человека, чутко реагируя на каждое предупреждение...

    Сочувствую...

    P.S. А подумать про выход на другие маркеты в дополнение к GooglePlay всё же стоит!
    Ответ написан
    4 комментария
  • Как решить ошибку с ListView и AsyncTask в Android?

    TonyCode
    @TonyCode
    Цепляемся за следующую строку Logcat-а:

    "Make sure the content of your adapter is not modified from a background thread, but only from the UI thread."


    Далее видим в AsyncTask следующее:

    @Override
        protected Void doInBackground(Void... params) {
                LINK = "here is link for json";
                obj = Helpers.getJson(LINK);
                if (obj != null) {
                    Helpers.refreshListView(obj, tempList);
                }
            return null;
        }


    Ошибка:

    Helpers.refreshListView(obj, tempList); вызывается в методе doInBackground() которая выполняется в background thread!

    Решение:

    Вынести вызов refreshListView() в метод onProgressUpdate() AsyncTask-а (который уже выполняется на UI Thread!):

    protected Void doInBackground(Void... params) {
        // ...
        publishProgress(new MyProgress(obj, tempList));
        // ...
    }
    
    protected void onProgressUpdate(MyProgress... progress) {
        if (progress.size() > 0) {
            Helpers.refreshListView(progress[0].getObj(), progress[0].getTempList());
        }
    }


    ---
    Upd: Подробнее - т.к. в UIThread надо передавать и obj и tempList - то для них нужно сделать класс-wrapper, например так - (каждый класс в своём файле, естественно)

    public class LoadWall extends AsyncTask<Void, MyProgress, Void> {
        // ...
        @Override
        protected Void doInBackground(Void... params) {
            // ...
            publishProgress(new MyProgress(obj, tempList));
            // ...
        }
    
        @Override
        protected void onProgressUpdate(MyProgress... progress) {
            if (progress.size() > 0) {
                Helpers.refreshListView(progress[0].getObj(), progress[0].getTempList());
            }
        }
        // ...
    }
    
    /**
     * Используется для передачи прогресса в UI-Thread
     */
    public class MyProgress {
    
        private final Object obj;
        private final ArrayList<LinkedHashMap<String, String>> tempList;
    
        public MyProgress(Object obj, ArrayList<LinkedHashMap<String, String>> tempList) {
            this.obj      = obj;
            this.tempList = tempList;
        }
    
        public Object getObj() {
            return obj;
        }
    
        public ArrayList<LinkedHashMap<String, String>> getTempList() {
            return tempList;
        }
    }
    Ответ написан
    2 комментария
  • Какие есть документации и средства для создания андроид-приложений на Убунту?

    TonyCode
    @TonyCode
    Самый лучший способ - найти опытного разработчика, который тебя "прокачает" )

    Второй по эффективности - брать уроки/туториалы и проходить их ( Например, на англ - www.youtube.com/watch?v=SUOWNXGRc6g&list=PL5A73AAC... - Travis довольно неплохо для начинающих объясняет, сам проходил. На русском - startandroid.ru из ответа @4Kr)

    Про IDE: большинство туториалов под Eclipse - можно начать с него, на IntelliJ IDEA потом без особого труда можно перейти. (На ней базируется Android Studio - она пока ещё сыроватая, у меня раз в день (версии до 0.3.6 включительно) стабильно падает)
    Ответ написан
    Комментировать