끙 오늘 안드로이드 스튜디오 버전을 3 점대로 버전을 올렸다...


그 후 빌드하는대 저런 에러가...씁...


그래서 구글 신님께 저 문제를 해결하려면 어떻게 해야되요. 물어보니


국내 한글 블로거엔 없더라... 외국 코딩 지식인이라 할수 있는 git에서도 엉뚱한 해결책만 내주고 있어...


그러다 찾았다...


gradle 파일쪽에 defaultconfig 안에다가


javaCompileOptions {
annotationProcessorOptions {
includeCompileClasspath = true
}
}
밑에 문장을 넣어주면 된다.

오류가 나는 이유는 대충 여기 저기 읽어보니 어노테이션을 사용하는 라이브러리에 사용 권한을 주는듯한 느낌??


자세히는 안봐서 모르겠다. 대충 그런 얘기들이 오가는걸 안되는 영어로 읽어서 작성한거다.



  1. Cho 2018.10.08 09:31 신고

    비니님 정말 갑갑합니다 잘쓰던 앱이 몇달전부터 글을 쓰려면 회색빛이 되면 멈춥니다 다시 깔고 설치 수없이 했는데도 여전히 그래서 질문을 할수가 없습니다 도와주세요

    • 사용자 초코비니 2018.10.08 09:33 신고

      혹시 휴대폰 바꾸셨나요? 바꾸시면서 이메일 주소도 바꾸셨는지요?

      일단 그냥 예상가는 시나리오가 이거뿐이라

      사용하시던 이메일 주소 알려주시면 해당 계정 초기화를 해보도록 하겠습니다.

  2. 2018.10.08 20:47

    비밀댓글입니다

    • 사용자 초코비니 2018.10.08 20:49 신고

      제가 말씀드린 이메일 주소는 ㅠㅠ 휴대폰에 등록하여, 사용하시는 이메일 주소 말씀드린건대...

  3. 2018.10.09 20:12

    비밀댓글입니다

  4. 2018.10.10 14:14

    비밀댓글입니다


Fragment안에 또다른 fragment 가 들어가게되면 FragmentManger의 관리 주체가 달라진다는 글을 읽은거 같네요.


그래서 해결책은 Adapter 부분에 getFragmentManager 가 아닌 getChildFragmentManager()를 넣어주셔야 합니다.


제가 힌트를 얻은 사이트에서도 저정도뿐이 설명을 안해줘서...뭐 저정도면 답을 다 알려준거죠.


제가 사용했던 부분을 밑에 남기겠습니다.


FragmentPagerAdapter adapter = new FragmentPagerAdapter(getChildFragmentManager()) {
@Override
public CharSequence getPageTitle(int position) {
return title[position];
}

@Override
public Fragment getItem(int position) {
return fragments.get(position);
}

@Override
public int getCount() {
return fragments.size();
}
};

빨간색으로 칠한부분을 바꾼것이죠. 

그전에 제가 사용했던건 getActivity().getFragmentManger() 였습니다.


activity안에 fragment를 사용하고 ViewPager를 만들기 위해 fragment를 한번 더 삽입하니... 꼬여버린것이죠.


국내 블로그 및 커뮤니티 사이트를 다 뒤저도 안보이더군요. 정확한 답변을 남겨준 사람은 없더군요.


질문이 올라오고 답변 올라온거 따라서 시도 해보았지만 해결되지 않았었습니다.


무튼 저와 같은 현상이 일어나시는분은 getChildFragmentManager()를 사용하시면 해결 되실겁니다.


일단 저는 이미지뷰를 원형으로 만드는 과정을 스타일로 바꾸었습니다.


이 방법이 자바코드로 알려진게 많아서 적용해보았지만...


cast 익셉션이 떨어저서 포기하고...


스타일로 바꾸었습니다.


drawble 폴더 밑에 


circle_border.xml을 만들었구요


하단의 방법을 적용하였습니다.


안드로이드에서 가장 어려운 부분이 스타일 주는거 같네요 ㅠㅠ;(검색을 해도 대부분 자기가 원하는걸 찾기가 힘들죠. 특히 한국 블로그중에선....)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:top="4dp"
android:right="4dp"
android:bottom="4dp"
android:left="4dp">
<shape
android:shape="oval">
<solid android:color="원하는 백그라운드 색상" />
</shape>
</item>
<item>
<shape
android:shape="oval">
<stroke android:width="2dp"
android:color="바깥쪽원하는 백그라운드 색상"/>
</shape>
</item>
</layer-list>

이제 레이어 설정하신 부분에

<ImageView
android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/circle_border"
android:id="@+id/iv"
android:src="@drawable/o"
/>

등을 주어서 해결했습니다.


참고 url : http://stackoverflow.com/questions/30676208/how-to-create-ring-shape-drawable-in-android


요즘 가장 큰 고민거리중 하나가 내 앱을 사용하는 사람들의 앱 버전이 몇인지이다


특히 웹서버 내용을 변경해버리면 오류가 날수가 있기때문에 더더욱 신경 쓰이는 부분이고


그래서 방법이 없나 찾아보니 다음과 같은 방법이 있더라.


String version;
2.try {
3.PackageInfo i = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
4.version = i.versionName;
5.catch(NameNotFoundException e) { }



해당버전을 웹서버에 로그인시마다 update 시켜주고 있다.



removeView 쓰시면 됩니다 -ㅅ-;

뭐지 더 할말 없는건가...그냥 쓰세요...


Publishing에 대한 참고 자료::

Android App을 만든 후 apk를 생성하여 배포할 때, apk에는 반드시 서명 작업(signing)이 되어 있어야한다. 그렇지 않으면 해당 apk는 절대로 단말기에 설치 할 수 없다. apk를 생성하면서 서명하는 방법에 대해 알아보자.


배포용 APK 만들기

Android Studio에서 프로젝트를 apk로 생성하려면 상단 메뉴의 'Build - Generate Signed APK ...'를 선택하면 된다. 그러면 아래와 같은 팝업이 뜰텐데, 대충 내용은 Gradle 기반의 프로젝트는 gradle build script에서 signing 관련 정보를 정의해라, 그리고 'gradle assembleRelease'를 실행하면 build/apk 디렉토리에 APK가 생성될 것이다라는 내용이다. 본 포스트에서는 배포용 APK를 만드는 여러 방법에 대해 설명 할 것이므로 일단 OK 버튼을 눌러 다음 화면으로 이동하자.


1. Android Studio의 기능을 이용해서 배포

일단 gradle build script 말고 Android Studio에서 지원하는 방법을 사용해보자. OK 버튼을 누르면 다음과 같이 프로젝트를 선택하는 팝업이 나오는데, APK로 만들 프로젝트를 선택한 후 Next를 누른다.


그러면 또 아래와 같이 keystore에 대한 정보를 입력하라고 나오는데, 만들어 둔 keystore가 있다면 해당 keystore를 사용하면 될 것이고, 없다면 Create new... 를 선택한다.

 keystore란? (출처 : 커니의 안드로이드 이야기)
 어플리케이션 서명을 위해 사용하는 수단으로, 자신의 '서명'이라 할 수 있다. 서명은 'key'로 하게 되며, keystore는 서명을 할 수 있는 key들을 담을 수 있는 파일을 뜻한다. IDE를 통한 개발시 기본으로 디버그용 키를 사용하여 어플리케이션 패키지를 서명하게 되며, Google play store 등 외부로 어플리케이션을 배포할 때는 자신의 키를 사용하여 배포해야 한다. (배포 후 키를 잃어버리면 업데이트가 불가능하다!)

 왜 서명이 필요한가?
 악의적인 목적으로 리패키징 된 apk를 구분하기 위해서다. 어플리케이션을 배포할 때 apk로 패키징하게 되는데 이 때, 누가 패키징 했는지 정보를 기록하는게 서명 작업이다.

 signing에 대한 참고 자료
 http://developer.android.com/tools/publishing/app-signing.html



아래와 같이 필요한 정보들을 입력해준다. (Certificate 항목은 필수가 아니다. 그리고 Validity는 유효기간을 의미하므로 넉넉하게 넣어주자. 너무 큰 숫자를 넣으면 keystore가 정상적으로 생성되어도 hashcode of signature는 invalid하더라)


필요한 정보들을 입력한 후 OK 버튼을 누르면 아래와 같이 폼들이 자동으로 채워지게 된다. Next를 눌러 이동하자.


마스터 패스워드를 지정하라고 한다. 귀찮으니 keystore와 동일한 암호로 지정한다.


생성될 APK 파일의 경로를 지정하고 Proguard를 적용 할 것인지 선택 후 Finish 버튼을 누르면 APK가 생성 될 것이다.

 Keystore를 만드는 또다른 방법, keytool을 이용해 keystore를 생성해보자.
 사실 이게 오리지널이다. JDK에 포함된 keytool을 이용하면 터미널에서 keystore를 생성할 수 있다. 터미널에서 아래와 같이 입력한다.

 keytool -genkey -v -keystore 파일명.keystore -alias 별칭 -keyalg RSA -keysize 2048 -validity 10000

 그러면 아래와 같이 Android Studio와 동일한 순서로 정보를 입력 하게 되며, 마지막엔 *.keystore를 생성해 준다.

 잠깐, *.keystore와 *.jks의 차이는?

 Android Studio에서 생성한 keystore는 *.jks 확장자를 가질 것이며,  터미널에서 keytool을 이용해 직접 만든 keystore는 *.keystore 확장자를 가지는데 사실 이는 확장자만 다르지 똑같은 keystore 파일이다.(터미널에서 생성할 때 *.jks 확장자로 지정해 주면 그냥 생성된다.) jks는 Java security provider에서 제공하는 keystore의 default type을 의미한다. (자세한 내용은 여길 참고하라)


* 해당 어플리케이션이 정상적으로 서명이 되었는지 확인하는 방법.

이건 그냥 참고로 알아두면 좋은데, 잘못 만들어진 keystore로 서명할 경우 signature의 hashcode가 음수로 나오는 경우가 있다.(유효기간을 50년이상으로 하니까 hashcode가 이상하게 나오더라...) 정상적이라면 아래와 같이 나와야 한다.

1
04-29 10:58:36.387  11231-11231/com.jhlee.myapplication.app D/myapp﹕ Signature hashcode : 826338355

signature에 대한 hashcode를 얻는 코드.

1
2
3
4
5
6
7
8
9
10
11
12
13
import android.content.pm.PackageManager;
import android.content.pm.Signature;
 
...
 
try {
  Signature[] sigs = this.getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures;
  for (Signature sig : sigs) {
    Log.d("myapp", "Signature hashcode : " + sig.hashCode());
  }
} catch (Exception e) {
  Log.d("myapp", e.getMessage());
}


2. Gradle Build Script를 이용해서 배포.

Android Studio에서 APK를 생성할 때 처음 팝업 화면에 아래와 같이 안내문이 있었다.

For Gradle-based projects, the signing configuration should be specified in the Gradle build scripts. 
Configure your signing configurations as described in the user guide: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Signing-Configurations Then, run "gradle assembleRelease", and you will find your APK in the build/apk/ directory.

gradle build script에 keystore을 지정해주고 'gradle assembleRelease'를 실행하면 APK가 생성된다는 말이다. 


APK를 생성할 프로젝트의 build.gradle을 아래와 같이 편집하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
android {
  compileSdkVersion 19
  buildToolsVersion "19.0.3"
 
  defaultConfig {
    minSdkVersion 8
    targetSdkVersion 19
    versionCode 1
    versionName "1.0"
  }
 
  // 요기랑
  signingConfigs {
    release {
      storeFile file("signature/release.jks")
      storePassword "123456"
      keyAlias "myreleasekey"
      keyPassword "123456"
    }
  }
 
  buildTypes {
    release {
      signingConfig signingConfigs.release    // 여기
      debuggable false // debugging 허용 안함
      zipAlign true  // apk 최적화
      runProguard false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
  }
}

signingConfigs에 release라는 이름으로 config를 선언하고 buildTypes의 release에 해당 서명을 지정해줬다.(추가로 zipAlign 옵션까지 넣어줬다)


자, 이제 APK를 생성해보자. Android Studio에 보면 Gradle tasks라는 윈도우가 있는데 아래와 같이 assembleRelease라는 task가 있을 것이다. 이 태스크를 더블클릭해보자.


해당 task를 실행하면 build.gradle로부터 signing 정보를 확인하게 되므로 따로 윈도우를 통해 keystore를 지정해 주지 않아도 된다.

task가 종료되면 프로젝트\build\apk 디렉토리가 생성될 것이며 아래와 같이 두 개의 apk가 만들어질 것이다. 두 가지의 차이점은 unaligned-apk는 최적화되지 않은 APK이고 이 APK를 바탕으로 zipAlign 작업을 수행하여 app-release.apk가 생성되는 것이다. 그러므로 app-release.apk만 배포하면 된다.


3. Release한 App을 디버깅해보자.(debug용 keystore 만들기)

자 이제 App을 배포했고 수정할 사항이 생겨서 App이 설치된 단말기에서 디버깅을 하려 한다. 그러나 아마 아래와 같은 오류가 뜰 것이다.


콘솔 에러를 보면 아래와 같다.

Waiting for device. 
Target device: samsung-sm_g900k-92b54d52 
Uploading file 
  local path: /Users/jhlee/Documents/Workspace/AndroidStudio/MyApplication/app/build/apk/app-debug-unaligned.apk 
  remote path: /data/local/tmp/com.jhlee.myapplication.app 
Installing com.jhlee.myapplication.app 
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.jhlee.myapplication.app" 
pkg: /data/local/tmp/com.jhlee.myapplication.app 
Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]

에러가 발생하는 이유는 간단하다. 디버깅을 위해 만들어진 app-debug-unaligned.apk의 signing 정보와 이미 단말기에 배포된 app-release.apk 정보가 다르기 때문이다. signing을 하는 이유는 위에서 설명했듯이 이런식으로 다른 인증을 통해 리패키징 된 어플리케이션을 구분하기 위해 사용하며, 이런 에러가 발생하는 것은 당연하다. 물론 해결책은 있다. 팝업 메세지처럼 이미 배포된(설치된) 앱을 지우고 디버깅을 시작하면 된다. 그러나 귀찮다. 그리고 우린 개발자다. 뭔가 다른 방법이 없을까.


방법은 간단하다. release용 keystore로부터 debug용 keystore를 만들어서 build.gradle에 지정 해주면 된다. debug용 keystore는 아래와 같이 keytool을 이용해 생성 할 수 있다.

(명령어 출처 : http://sunphiz.me/wp/archives/114)

1
keytool -importkeystore -v -srckeystore [릴리즈용 키스토어 파일이름] -destkeystore [디버그용 키스토어 파일이름] -srcstorepass [릴리즈용 키스토어 비밀번호] -deststorepass android -srcalias [alias 이름] -destalias androiddebugkey -srckeypass [alias 비밀번호] -destkeypass android

releaes keystore가 저장된 폴더로 이동하여 위 명령어를 실행한다. 그러면 debug용 keystore가 생성 될 것이다.

 debug용 keystore의 비밀번호와 alias는 고정이어야 하는가?
 위 명령어를 살펴보면 debug용 비밀번호는 android, alias는 androiddebugkey로 지정되어 있는데, 사실 이클립스나 Android Studio에서 디버그를 할 때 자동으로 서명되는 keystore의 비밀번호와 alias랑 동일한 것이다. 왜 동일하게 했냐면 build.gradle에서 debug용 keystore 지정시, 비밀번호와 alias를 지정해주지 않으면 IDE는 자동으로 위 비밀번호와 alias를 사용하기 때문이다. (편의상 동일하게 사용 하는 것으로 이해하면 된다.)

 IDE에서 자동으로 서명하는 keystore의 파일 위치
 Eclipse의 경우 Preferences -> Android -> build에서 default debug keystore의 경로를 확인 할 수 있다.


이제 build.gradle을 편집하자. 아래와 같이 debug일 경우에 사용 할 keystore 파일과 builTypes.debug시 사용 할 서명 방식을 지정해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  signingConfigs {
    debug {
      storeFile file("signatrue/debug.jks")
//      storePassword "android"
//      keyAlias "androiddebugkey"
//      keyPassword "android"
    }
    release {
      storeFile file("signature/release.jks")
      storePassword "123456"
      keyAlias "myreleasekey"
      keyPassword "123456"
    }
  }
 
  buildTypes {
    debug {
      signingConfig signingConfigs.debug
    }
    release {
      signingConfig signingConfigs.release
      runProguard false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
      zipAlign true
      debuggable false
    }
  }

다시 디버깅을 실행해보면 잘 될 것이다. 콘솔 메세지로 아래와 같이 나올 것이다.

Waiting for device. 
Target device: samsung-sm_g900k-92b54d52 
Uploading file
  local path: /Users/jhlee/Documents/Workspace/AndroidStudio/MyApplication/app/build/apk/app-debug-unaligned.apk
  remote path: /data/local/tmp/com.jhlee.myapplication.app
Installing com.jhlee.myapplication.app 
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.jhlee.myapplication.app" 
pkg: /data/local/tmp/com.jhlee.myapplication.app 
Success


출처 : http://warmz.tistory.com/945


  1. 만델라 2016.11.11 01:27 신고

    그림이 더이상 안나와 참 아쉽습니다.
    그래도 텍스트로만으로도 추측하며 잘 보고 있습니다 감사합니다


안드로이드(Android) res(리소스) 관리



txt 파일, 음악파일, 동영상 파일 등 기타 원본 리소스들은 /res/raw 폴더 밑에서 관리한다.


해당 원본 파일들을 raw 밑에 넣어두기만 하면 된다.


raw 폴더를 새로 만들고 원본파일을 넣자.



1. res(리소스)에 raw 폴더 생성 후 원본파일 저장


/res/ 밑에 raw 폴더를 만들고 mymusic.mp3 파일과 mytext.txt 파일을 넣어놨다.


mytext.txt 파일에는 "Hello~ Android!" 가 저장되어 있다.




2. txt 파일의 내용을 보여줄 <TextView> 작성



<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


    <TextView
        android:id="@+id/textView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />


</RelativeLayout>


- ID : textView01 로 <TextView> 를 등록했다.





3. Activity.java 에서 mytext.txt, mymusic.mp3 읽어오기



public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
   try{
            
   // getResources().openRawResource()로 raw 폴더의 원본 파일을 가져온다.
            // txt 파일을 InpuStream에 넣는다. (open 한다) 
   InputStream in = getResources().openRawResource(R.raw.mytext);
            
    if(in != null){
                
        InputStreamReader stream = new InputStreamReader(in, "utf-8");
        BufferedReader buffer = new BufferedReader(stream);
                
        String read;
        StringBuilder sb = new StringBuilder("");
                
        while((read=buffer.readLine())!=null){
             sb.append(read);
         }

        in.close();
                
         // id : textView01 TextView를 불러와서 
         //메모장에서 읽어온 문자열을 등록한다.
        TextView textView =(TextView)findViewById(R.id.textView01);
        textView.setText(sb.toString());
            }
                
        }catch(Exception e){
            e.printStackTrace();
        }
        

        // music.mp3 파일 역시 getResources().openRawResource()로 
       //가져올 수 있다.
       // 여기서는 MediaPlayer로도 음악 파일을 가져오고 
       // start()로 실행할 수 있다.
        MediaPlayer player = MediaPlayer.create(this, R.raw.mymusic);
        player.start();
    }
}


- getResources().openRawResource() 를 사용하여 raw 폴더의 원본파일을 가져온다.


- mytext.txt 파일을 읽어 <TextView>에 등록하여 출력한다.


- 음악파일인 mymusic.mp3 역시 getResources().openRawResource() 로 불러올 수 있지만 음악 파일을 지원하는 MediaPlayer로 호출한 후 start() 메소드로 음악을 실행시킨다.



프로그램 실행



- mytext.txt 에 있는 Hello~ Android! 를 읽어와 출력한다.


- mymusic.mp3 가 실행되어 음악이 나온다.



 


출처 : http://hyeonstorage.tistory.com/159


build-tools 21.1.1부터 MultiDex 지원이 시작되었다.
DexIndexOverflowExcetion 발생
안드로이드 스튜디오에서 빌드하다가 아래와 같은 오류가 발생했다.
Error:Execution failed for task :app:dexDebug.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/work/usr/androidsdkmacosx/buildtools/21.1.2/dx JXmx4g dex nooptimize output/work/myapp/app/build/intermediates/dex/debug inputlist=/work/myapp/app/build/intermediates/tmp/dex/debug/inputList.txt
Error Code:
2
Output:
UNEXPECTED TOPLEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
at com.android.dx.command.dexer.Main.run(Main.java:246)
at com.android.dx.command.dexer.Main.main(Main.java:215)
at com.android.dx.command.Main.main(Main.java:106)
위 오류의 주요 내용은
DexIndexOverflowExcetion 이 발생했고, 메소드 ID가 0~65535범위를 벗어났다는 내용이다.
하나의 Dex 파일에 메소드는 65535개가 최대인데 이것을 벗어났다는 의미이다.
오픈소스 라이브러리를 추가하면서 갑자기 오류가 발생했다.



MultiDex
아마.. 안드로이드 OS내부에서 클래스를 로딩하면서 메소드들에 일련번호를 부여하는데 이 일련번호의 데이터 타입이 16비트인가보다. 그럼 구글에서 클래스 로더를 수정해주면 되겠지만.. 이미 배포되어 있는 안드로이드 OS에는 적용할 수 없으니 다른 방법으로 해결해야 한다. 이에 구글에서 내놓은 방법이 MultiDex이다.  Dex 파일 한개의 메소드 개수에 제약이 있으니(65535개), 여러 Dex로 하자는 의미이다.



MultiDex를 사용하려면
1. SDK build-tools를 21.1.1이상으로 업그래이드하고,
2. build.gradle을 수정하고
3. Application 클래스를 수정해야 한다.
gradle 설정을 아래와 같이 바꾼다.
build.gradle
apply plugincom.android.application 
android {
compileSdkVersion 21
// 빌드툴버전이 21.1.1이상만 가능
buildToolsVersion 21.1.2
// … 중략 …
defaultConfig {
applicationId com.test.myapp
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName 1.0
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize 4g
preDexLibraries = false
}
}
dependencies {
// … 생략
// multidex를 추가
compile com.android.support:multidex:1.0.0
}
앱의 소스코드 수정
앱의 Application 클래스는 아래와 같이 수정한다.
public class MyApplication extends android.support.multidex.MultiDexApplication
{
// …
}
참고
나중에 시간날때 더 읽어보자.
MultiDex와 관련하여 좀 예전 글이지만 개념파악하는데 도움이 된다.
http://blog.osom.info/2014/10/generating-main-dex-list-file.html
안드로이드 개발자문서: Building Apps with Over 65K Methods
https://developer.android.com/tools/building/multidex.html#about

출처 : http://ohlab.kr/w/?p=153


v4가 충돌나면 진짜 짜증 지대로다 ㅠㅠ;


우선 이클립스 시절보단 간단해젔다


충돌 나는 라이브러리에 { exclude module: 'support-v4' }

를 추가해주면 오류가 해결된다.

This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.


오류 에러


액션바와 툴바를 같이 사용해서 나오는 에러임.


테마쪽에서 액션바를 없애거나 코드에서 툴바를 제거하면 정상적으로 돌아감



+ Recent posts

티스토리 툴바