27

私はAndroid開発に不慣れで、アプリの最初のバージョンをリリースする準備がほぼ整っています:)

私の電話で署名付きリリースapkをテストしている間、デバッグバージョンがデバッグ署名とともにインストールされているため、インストールを拒否します。

そのため、デバッグバージョンをアンインストールする必要がありますが、すべてのデータベースが削除されます(テストしている友達に削除されます)。

データを失うことなく同じアプリのデバッグバージョンとリリースバージョンを管理する方法はありますか?

4

6 に答える 6

37

多くのAndroidプロジェクトがgradleビルドシステムを使用し始めています(Android Studioの使用を開始したときに移行しました)。幸い、gradleを使用すると、開発バージョンとリリースバージョンの両方を同時にインストールすることが非常に簡単になり、それぞれに独自の独立したデータが含まれます。AndroidドキュメントはこれをカバーapplicationIdSuffixしています。次のようにデバッグビルドタイプにを追加するだけです。

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}
于 2014-04-02T17:30:32.670 に答える
4

アンインストール/再インストールプロセスを回避する簡単な方法を知らないので、オプションには...

  • テスト用に2つ目のデバイスを購入します(特にeBayでは、一部のAndroidデバイスは現在非常に安価です)
  • テストにエミュレーターを使用する

同じ問題が発生しますが、予想どおりなので、電話をデバッグ開発に使用し、タブレットを本番テストに使用します。リリースが近づいたら、デバイスとエミュレーターの両方で製品版をテストします。

テスターの場合は、常にリリースバージョンを提供することをお勧めしますが、問題を解決するために広範なログを含めることができます。デバッグバージョンはあなただけが使用し、リリースバージョンはあなただけが使用します。テスターに​​リリースバージョンを提供すると、テスターはデータを使用して蓄積し、次のバージョンにアップグレードするときに、データを保持(またはスキーマを変更した場合は更新)してデータを移行できます。

テスターがデバッグバージョンとリリースバージョンを使用する必要はないと思います。

于 2011-02-10T17:23:42.697 に答える
3

@Evanに感謝します。あなたのソリューションは完璧に機能します。

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

デバッグモードで実行しているときにアプリのタイトルに「(DEBUG)」を追加するには、このコードをアクティビティのonCreateに配置します。

PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    //The .debug specified in gradle
    if (pInfo.packageName.equals("YOUR_PACKAGE_NAME_HERE.debug")) {
        setTitle(getTitle() + " (DEBUG)");
}
于 2014-12-15T21:45:01.500 に答える
2

なぜアプリをアンインストールするのですか?通常、同じアプリの新しいバージョン(パッケージIDで識別される)をインストールすると、すべてのアプリデータが保持されます。

編集:アプリのデータを手作業で保持するには、アプリのデータを安全な場所にコピーし/data/data/my.package.name/...、必要に応じて復元します。

于 2011-02-10T17:07:47.947 に答える
1

私にとっては、次のものも追加する必要がありました。

<permission                                                                               
      android:name="${applicationId}.permission.C2D_MESSAGE"                                
      android:protectionLevel="signature" />                                                

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 

そうしないと、両方が同じC2D_MESSAGE権限を受け取り、次のようになります。

Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=<your applicationId>.permission.C2D_MESSAGE pkg=<your applicationId>] 
于 2016-04-19T09:54:47.557 に答える
1

アプリケーションIDサフィックスを構成します

アプリのbuild.gradleで次の構成を使用すると、リリースバリアントは、を使用com.example.myapp applicationIdし、デバッグバリアントはを使用しますcom.example.myapp.debug

android {
    defaultConfig {
        applicationId "com.example.myapp"
        ...
    }
    ...
}
buildTypes {
  debug {
    applicationIdSuffix ".debug"
    ...
  }
  release {
    ...
  }
  ...
}

複数のFirebaseアカウントを設定する

Firebaseを使用する場合は、2つのFirebaseアカウントが必要になります。1つは本番用、もう1つは開発用です。アカウントごとに、独自のバリアントソースセットでGoogleサービスのJSONを構成する必要があります。

  • リリースソースセットの本番google-services.json:app/src/release/google-services.json
  • リリースソースセットの開発google-services.json:app/src/debug/google-services.json

プロバイダー当局

でプロバイダーを定義したAndroidManifest.xml場合、リリースバリアントとデバッグバリアントの両方が同じプロバイダー権限を使用し、両方のアプリが同じデバイスにインストールされていると、競合が発生する可能性があります。この問題を回避するには、アプリケーションIDを権限サフィックスとして使用することをお勧めします。

<provider
   android:name="androidx.core.content.FileProvider"
   android:authorities="${applicationId}.fileprovider"
   android:exported="false"
   android:grantUriPermissions="true">
</provider>

各バリアントのカスタムアイコン

同じデバイスに複数のバリアントをインストールする場合は、ランチャーでそれらを識別できるように、異なるアプリアイコンを使用することをお勧めします。デバッグアプリのアイコンをデザインして、その上に配置するだけです。src/debug/res/mipmap-xxhdpi-*

FCMを構成する

さまざまなFirebaseアカウントを使用するようになったため、FCM(プッシュ)サーバーを使用している場合は、正しい認証情報を使用してサーバーを構成する必要があります。デバッグアプリを備えたデバイスが登録されると、FCMサーバーは登録トークンをデバッグビルドタイプに関連付ける必要があります。そのため、プッシュが送信されると、Firebaseデバッグクレデンシャルのトークンが使用されます。そのため、アプリがFCMトークンを登録するたびに、ビルドタイプをFCMサーバーに送信する必要があります。


次の記事では、このトピックに関する詳細情報を提供しています。同じデバイスにデバッグバリアントとリリースバリアントをインストールする

于 2021-06-28T01:28:58.583 に答える