Сбой Logcat выдает ошибку в одном пакете, но переносит меня в другой ?? BUG? - PullRequest
0 голосов
/ 18 января 2012

У меня есть проблема, которую я, кажется, не могу правильно произнести ... Поэтому я приложу все усилия, чтобы объяснить это вашим парням.

Сценарий:

Я работаю в Eclipse Helios.У меня есть два пакета, скажем, «com.android.HelloWorld» и «com.android.HelloWorldFree».Я просто скопировал оригинальный пакет и вынул функции для бесплатной версии.Я изменил «все» ссылки, чтобы они были правильными, и я даже просмотрел каждый файл и искал фразу «HelloWorld» и заменил все найденные экземпляры.Затем я вытащил все, затем удалил все файлы JAR из BuildPath, а затем добавил их снова, чтобы убедиться, что там нет проблем.Затем я переместил бесплатный пакет из существующего рабочего пространства в его собственное, чтобы попытаться избежать любого наложения.

Проблема:

Когда я получаю отчет о сбое в LogCat,Я дважды щелкаю по строке, которая говорит, например:

"... com.android.HelloWorldFree.SceneManager $ GameAd.init (SceneManager.java:2191)"

Я нажму на приведенную выше строку, думая, что она перенесет меня в мой код, в котором произошел сбой (HelloWorldFree.SceneManager $ GameAd.init), однако это приведет меня к первой версии (HelloWorld.SceneManager $ GameAd.init), которая быласоздан, хотя этот пакет вообще не запускается.Он перейдет к правильной строке (2191), но в открываемом файле это полностью закомментированный раздел моего кода?Оригинальная упаковка (HelloWorld) даже не установлена ​​на моем устройстве!Это происходит здесь и там, и я не уверен, что это я делаю что-то не так (очевидно), или это «Затмение», потому что оно отсталое «я» ...

Уже пробовал:

  1. Удаление R.java в HelloWorldFree
  2. Пакет -> Очистить
  3. Сборочный пакет
  4. Удалить все JARS и повторно ссылаться на них ...

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

Большое спасибо всем, у кого есть ЛЮБОЙ совет о том, куда идти отсюда!

1 Ответ

1 голос
/ 18 января 2012

Ну, во-первых, вам нужно убедиться, что вы переименовываете правильно. И в процессе моего ответа я приму имя вашего пакета для платной версии com.example.HelloWorld, а бесплатная версия com.example.HelloWorldFree

Вот как я это делаю (и допустим, вы сначала сделали платную версию):

  1. Динамическая «про» загрузка кода. Смотри ниже.
  2. Удалите бесплатную версию и также удалите содержимое на диске (мы предполагаем, что вы начали с платной версии).
  3. Скопируйте платную версию, вставьте ее.
  4. Щелкните правой кнопкой мыши по вашему пакету под «src», затем нажмите «Refactor»> «Rename». Добавить "Свободный" в конце.
  5. Снимите все флажки (например, «Переименовать подпакеты» и «Обновить ссылки»).
  6. Нажмите «ОК».
  7. Открыть AndroidManifest.xml
  8. Изменить package="com.example.HelloWorld" на package="com.example.HelloWorldFree"
  9. Нажмите CTRL + SHIFT + S (для сохранения), затем нажмите «Да».

Затем очистите проект. Убедитесь, что у вас есть бесплатная версия и платная версия, удаленная с вашего устройства, выполнив adb uninstall com.example.HelloWorld и adb uninstall com.example.HelloWorldFree. Затем установите приложение на свое устройство.

Теперь " Dynamic 'pro' code loading ". Под этим я подразумеваю изменение кода таким образом, чтобы перед запуском бесплатной версии не требовалось вносить ЛЮБЫЕ изменения, кроме имени пакета.

Что я делаю, так это у меня класс:

public class M {

    public static boolean isPro(Context context){
        boolean hasPro;
        String pn = context.getPackageName();
        //Log.i(tag, "The package name is"+pn);
        if (pn.equals("com.example.HelloWorld")){
            hasPro = true;
        } else {
            hasPro = false;
        }

        return hasPro;
    }

}

И затем перед загрузкой кода, который требует наличия платной версии, я делаю:

if (M.isPro(context)){
   //do some code
} else {
   //tell user to buy the pro version
}

И затем везде, где вы ссылаетесь на строку "com.example.HelloWorld", используйте context.getPackageName() вместо.

Надеемся, что список вверху исправит вашу проблему - поскольку, возможно, вы просто пропустили шаг или что-то в этом роде. Все остальное просто облегчает жизнь.

...