Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Завернуть jar файл


Автор: Randomm 21.11.2009, 16:36
Здравствуйте
Хотелось бы узнать у опытных людей, возможно ли осуществить такое:
Для готового приложения для телефона в виде .jar файла нужно сделать так, чтобы при первом его запуске на телефоне нужно было его "активировать" - то есть прочитать правила и согласиться с ними или отправить смс или что-то ещё. Возможно ли создать такую обёртку для произвольного приложения и так же оформить её jar файлом?

Автор: Green_DiCk 21.11.2009, 19:54
Если есть исходники "произвольного приложения" то ноу проблем. Пишешь свой "защитный" класс, потом в методе startApp() делаешь что-нибудь вроде:

Код

public void startApp ()
{
        ProtectClass pc = new ProtectClass();
        if (pc.activated() == false) {   // Если приложение неактивировано 
            boolean termsAccepted = pc.showActivationWindow();   // Показываем окно с условиями
            if (termsAccepted) {  // Если юзер принял условия, то 
                 pc.activateApp();  // Активируем приложение
                 launch();   // Запуск основной логики приложения
            } else {
                 exit();     // Выход
            }
        } else {
             launch();
        }
}


Проверить активировано приложение или нет можно или отправив запрос на сервер (в запросе должны быть уникальные для данной трубки данные) или проверив RMS на наличие соотв. записи.

Автор: Randomm 21.11.2009, 23:51
Green_DiCk, спасибо. А если исходников нет?
Можно ли как-то запаковать нужный jar и запускать его из оболочки?

Автор: Green_DiCk 22.11.2009, 13:36
Если нет исходников, то можно попробовать декомпиляцию - декомпилировать главный класс мидлета, изменить метод startApp по описанной выше схеме и скомпилировать заново. Правда я декомпиляцией никогда не занимался, поэтому не знаю - может быть все не так просто. Хотя явных препятствий такому способу я тоже не вижу.

Автор: math64 23.11.2009, 08:49
Можно добавить свой мидлет, производный от уже существующего. В его startApp () вставить предложенный код, вместо launch() - super.startApp (). Из манифеста и jad убрать исходый мидлет и вместо него добавить свой. Иногда так может не получиться, да и взломать просто - нужно найти класс оригинального мидлета.

Автор: eugine_s 23.11.2009, 14:05
math64, согласен. 
Я так и делал. 
Цитата(math64 @  23.11.2009,  08:49 Найти цитируемый пост)
Иногда так может не получиться

Такое может не получится если:
1) Класс унаследованный от MIDlet объявлен как final. Вопрос решался изменением одного байта в .class файле. Вот http://forum.vingrad.ru/index.php?showtopic=202810&view=findpost&p=1456667 мне советуют как можно это исправить.
2) Класс унаследованный от MIDlet не находится в каком-либо пакете (а твоя обвертка находится в пакете). Лечится тем что твоя обвертка делается без пакета. 

Я startApp не переопределял, а в конструкторе запускал отдельный поток, который и делал все что нужно. 




Автор: podzamkom 23.11.2009, 15:25
        Позвольте напомнить еще один вариант - создание из файла мидлета *.jar защищенного файла с расширением *.dcf при помощи программы DRM упаковщика, например DRM Packager. Программа создает защищенный файл  *.dcf и файл прав  *.dd , которые (права) пользователь получит через интернет с сервера указанного в защищенном файле. Вся процедура автоматизирована и телефоны (современные) поддерживают этот протокол.

Подробнее не могу сказать, но на форуме есть ветка с одноименным названием.

Если кто может к этому что-либо добавить, милости просим!

Автор: math64 24.11.2009, 11:23
Цитата(eugine_s @  23.11.2009,  14:05 Найти цитируемый пост)
Такое может не получится если:1) Класс унаследованный от MIDlet объявлен как final. Вопрос решался изменением одного байта в .class файле. Вот тут мне советуют как можно это исправить.2) Класс унаследованный от MIDlet не находится в каком-либо пакете (а твоя обвертка находится в пакете). Лечится тем что твоя обвертка делается без пакета. Я startApp не переопределял, а в конструкторе запускал отдельный поток, который и делал все что нужно. 

Про эти причины я не думал, а вот Вы запускаете в конструкторе отдельный поток, а ведь также может поступить базовый класс.
А его поток запустится первым, в Вашем конструкторе первым делом должен быть вызван конструктор базового класса. Что делает этот поток, Вы не знаете, и он может конфликтовать в Вашим.

Автор: eugine_s 24.11.2009, 14:51
Цитата(math64 @  24.11.2009,  11:23 Найти цитируемый пост)
 а вот Вы запускаете в конструкторе отдельный поток,

Собственно, про реализацию этого момента забыл упомянуть. 
Конечно же, муть может какая-то получиться, если обвертку еще от Runnable наследовать, поэтому сделал это через внутренний класс.
Что-то типа вот такого: 
Код

public class DemoWrapper extends <MIDLET> {

public DemoWrapper() {
    (new DemoWrapperRunner(this)).start();
}

private class DemoWrapperRunner implements Runnable {

public DemoWrapperRunner(Midlet midlet) { 
}


public void run() {
}
}

}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)